Macros: ¿Utilizar función Si sobre Hojas?

Hola prozac, tanto tiempo.
Te comento la situación, Tengo una lista de 5 "nombres de empresas", cada uno de ellos tiene una página correspondiente. Mi idea es ir agregando "nombres de empresas" a medida que quiero analizarlas. Para ello quiero correr una macro que cree a estos nuevos, hojas nuevas. Mi problema es que la macro que ahora voy a poner, crea las hojas para todos los símbolos que aparezcan en la lista. Ya que dependen de la variable "cantidad" que es la celda A1 ( que es una función Contar.si, que cuenta la cantidad de símbolos a buscar).
Hay algún comando para hacer que en la Macro ya creada, empiece a buscar a partir del ultimo símbolo, ¿sin tener que cambiar "For fila = 1" y se haga automáticamente? Gracias
Macro para Crear Hojas para los "Nombres de empresas" que se encuentran en la lista:
Sub CreateSheets()
On Error Resume Next
Dim fila As Integer, Symbol As String, SourceSheet As Worksheet, TargetSheet As Worksheet, cantidad As Integer
Set SourceSheet = ActiveWorkbook.Worksheets("WL")
cantidad = SourceSheet.Cells(1, 1).Value
For fila = 1 To cantidad - 1
        Symbol = SourceSheet.Cells(fila, 1).Value
        Set TargetSheet = Worksheets.Add
        With TargetSheet
            .Name = Symbol
            .Cells(1, 1).Select
            .Activate
        End With
        Next fila

1 respuesta

Respuesta
1
Como casi siempre hay varias maneras de hacerlo dependiendo de lo que necesites. Tal vez una forma elegante y fácil no es correr una macro que cree las hojas para los nuevos nombres de empresa. Tal vez, sea más sencillo detectar los cambios en la hoja indice (la que contiene los nombres) y si éstos están en el rango donde están guardados esos nombres entonces crea la hoja.
Supongamos que en la hoja1 tienes en la columna A desde A2 hasta A100 por ejemplo, sea los nombres de empresas. Incluyendo el siguiente código en la hoja (no en un módulo) cada vez que añadas un nombre a la columna te genera su correspondiente hoja:
Private Sub Worksheet_Change(ByVal target As Range)
Application.EnableEvents = False
If Not Intersect(target, Range("A2:A100")) Is Nothing Then
   ' si ha cambiado algo creo una hoja
    Call CrearHoja(target.Value)
End If
End Sub
Y el procedimiento CrearHoja lo incluyes ahora sí en un módulo donde creas la hoja. Esto es parecido a lo que tienes pero más sencillo porque no hace falta el bucle for, ya que target. value contiene el nombre a crear.
Si por cualquier motivo quieres hacerlo de golpe (para todos los nombres nuevos) cuando tu indiques, entonces tienes que leer en un array todos los nombres y luego comprobarlos contra los nombres de todas las hojas para comprobar cuales ya existen. Te puede ser útil en tal caso crear un tipo
Type THojas
    nombre as String
    existe as Boolean
End Type
Luego una variable array del tipo indicado: Dim libro (10) as THojas
Lo pongo de dimensión 10 por comodidad. Puedes cambiarlo o irlo incrementando con Redim a medida que lo necesitas.
Luego lees los hombres de las hoja y los pones en libro(i). Nombre y después compruebas con la lista de nombres en la hoja que hace las veces de índice actualizando el valor libro(i). Existe a true para las hojas que ya están en la lista. Finalmente recorres el array de nuevo creando las hojas que no existen.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas