Como puedo llamar una macro dentro de un If

Tengo la siguiente macro que quisiera que hiciera lo siguiente: si el archivo1 esta abierto llama a la macro eliminar y si es el archivo2 es el que esta abierto llama a la macro eliminar2, no marca error pero no hace nada.

Dim lib As Workbook
For Each lib In Workbooks
If LCase(lib.Name) = "archivo1.csv" Then
Call eliminar
MsgBox "Celdas con cero eliminadas"
Else

If LCase(lib.Name) = "archivo2.csv" Then
Call eliminar2
MsgBox "Celdas con cero eliminadas"
End If
End If

Next lib
End Sub

2 respuestas

Respuesta
1

Deberías fijarte el contenido de la variable lib. Name, porque es posible que el mismo no incluya la extensión

Salu2

Hola! Gracias a que me comentaste esto revise el contenido de la variable y pude ver que no lo guardaba, estaba vacía y no hacia nada, ya lo pude modificar.

Gracias!

Respuesta
1

No tienes que usar la funcion LCase. ¿Alguna razon en especifico de por que la pones? LCase convierte un string a mayusculas por lo que ARCHIVO1. CSV no es lo mismo que archivo1.csv cuando usas el operador = los string se comparan con case sensitive.

En todos los lenguajes de programacion hay una funcion para comparar Strings, en VBA se llama StrComp() nunca se recomienda comparar strings con el operador = y menos si usas LCase contra un string en minusculas, nunca seran iguales.

-

A parte de eso, asegurate de que las macros eliminar y eliminar2 trabajan en el libro que tu quieres.

Perdón, estoy desde el celular, Lcase convierte a minúsculas.

Probablemente sea lo segundo que te dije, si quieres puedes mostrar las otras dos macros. Tal vez no hacen nada porque no se están ejecutando en el libro correcto especialmente si usas un IF en alguna de ellas.

Hola! Gracias por responder, efectivamente con LCase nunca fueron iguales, lo usaba porque en varios ejemplos que busque esa era la solución.

Seguí Buscando y Encontré el siguiente ejemplo lo acople a mi proyecto y Funciono perfecto.

Function IsWorkBookOpen(Name As String) As Boolean

    Dim xWb As Workbook

    On Error Resume Next

    Set xWb = Application.Workbooks.Item(Name)

    IsWorkBookOpen = (Not xWb Is Nothing)

End Function

Sub Sample()

    Dim xRet As Boolean

    xRet = IsWorkBookOpen("combine.xlsx")

    If xRet Then

        MsgBox "The file is open", vbInformation, "Kutools for Excel"

    Else

        MsgBox "The file is not open", vbInformation, "Kutools for Excel"

    End If

End Sub

Gracias por Responder y por explicar la Función de LCase la verdad no lo entendía .

Esa es una mejor aproximación, la verdad es que yo nunca hago el tipo de comparaciones como lo hiciste en la primera macro. La segunda es mucho mejor, de hecho aquí te dejo mi propia versión, más corta y en mi opinión un poco más eficiente:

Public Function IsOpen(wbName As String) As Boolean
On Error GoTo Default
Dim wb As Workbook: Set wb = Workbooks.Item(wbName)
    IsOpen = True
Default:
End Function
Sub Sample()
If IsOpen("combine.xlsx") Then
    MsgBox "Esta abierto"
Else
    MsgBox "Esta cerrado"
End If
End Sub

Andy

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas