Dim wkbkdestination As Workbook
Dim destsheet As Worksheet
For Each ThisWorkSheet In wkbkorigin.Worksheets
'this throws subscript out of range if there is not a sheet in the destination
'workbook that has the same name as the current sheet in the origin workbook.
Set destsheet = wkbkdestination.Worksheets(ThisWorkSheet.Name)
Next
Básicamente, recorro todas las hojas del libro de trabajo de origen y luego las coloco destsheet
en el libro de trabajo de destino en la hoja con el mismo nombre que la que se está iterando actualmente en el libro de trabajo de origen.
¿Cómo puedo probar si existe esa hoja? Algo como:
If wkbkdestination.Worksheets(ThisWorkSheet.Name) Then
Respuestas:
A algunas personas no les gusta este enfoque debido a un uso "inapropiado" del manejo de errores, pero creo que se considera aceptable en VBA ... Un enfoque alternativo es recorrer todas las hojas hasta encontrar una coincidencia.
fuente
ActiveWorkbook
lugar deThisWorkbook
. Este último se refiere al libro de trabajo que contiene el código de macro, que puede ser diferente del libro de trabajo que uno desea probar. SupongoActiveWorkbook
que sería útil para la mayoría de los casos (aunque las situaciones artificiales siempre están disponibles).sht Is Nothing
seráTrue
si no hay hoja con ese nombre, pero queremos volverTrue
si no es una hoja con ese nombre, por lo tanto el no. Es un poco más fácil (pero no válido) si reorganiza un poco paraSheetExists = sht Is Not Nothing
If wb Is Nothing Then Set wb = ThisWorkbook
aIf wb Is Nothing Then Set wb = ActiveWorkbook
Si está específicamente interesado solo en hojas de trabajo, puede usar una simple llamada Evaluate:
fuente
No necesita el manejo de errores para lograr esto. Todo lo que tiene que hacer es iterar sobre todas las hojas de trabajo y verificar si existe el nombre especificado:
fuente
Como buscar miembros de una colección es un problema general, aquí hay una versión resumida de la respuesta de Tim:
Esta función se puede utilizar con cualquier colección como objeto (
Shapes
,Range
,Names
,Workbooks
, etc.).Para comprobar la existencia de una hoja, utilice
If Contains(Sheets, "SheetName") ...
fuente
Set
palabra clave generará un error . Descubrí que en lugar de usarSet
, preguntar por elTypeName
miembro de la colección funciona para todos los casos, es decirTypeName objCollection(strName)
Sub Test() On Error GoTo errhandler Debug.Print Contains(Workbooks, "SomeBookThatIsNotOpen") errhandler: If Err.Number <> 0 Then Stop End Sub
Corregido: Sin manejo de errores:
fuente
En caso de que alguien quiera evitar VBA y probar si una hoja de trabajo existe puramente dentro de una fórmula de celda, es posible usar las funciones
ISREF
yINDIRECT
:=ISREF(INDIRECT("SheetName!A1"))
Esto volverá
TRUE
si el libro contiene una hoja llamadaSheetName
y de loFALSE
contrario.fuente
Escribí este:
fuente
sheetExist = ActiveWorkbook.Sheets(sSheet).Index
Mi solución se parece mucho a Tims pero también funciona en el caso de hojas que no son hojas de trabajo: gráficos
.
fuente
Pon la prueba en una función y podrás reutilizarla y tendrás una mejor legibilidad del código.
NO utilice "En caso de error, reanudar a continuación", ya que puede entrar en conflicto con otra parte de su código.
fuente
Muchos años tarde, pero solo necesitaba hacer esto y no me gustó ninguna de las soluciones publicadas ... ¡Así que inventé una, todo gracias a la magia de (gesto de las manos del arco iris de Bob Esponja) "Evaluar ()"!
Devuelve VERDADERO si la Hoja NO existe; FALSO si la hoja SÍ existe. Puede sustituir el rango que desee por "1: 1", pero desaconsejo usar una sola celda, porque si contiene un error (por ejemplo, # N / A), devolverá True.
fuente
wsExists
Función compacta (¡ sin depender del manejo de errores!)Aquí hay una función corta y simple que no se basa en el manejo de errores para determinar si existe una hoja de trabajo (¡ y si se declara correctamente que funciona en cualquier situación!)
Ejemplo de uso:
El siguiente ejemplo agrega una nueva hoja de trabajo denominada
myNewSheet
, si aún no existe:Más información:
For Each
…Next
Declaración (VBA)Exit
Declaración (VBA)fuente
¿Por qué no utilizar un pequeño bucle para determinar si existe la hoja de trabajo nombrada? Diga si estaba buscando una hoja de trabajo llamada "Hoja1" en el libro de trabajo abierto actualmente.
fuente
Si eres fanático
WorksheetFunction.
o trabajas desde un país que no es inglés con un Excel que no es inglés, esta es una buena solución, que funciona:O en una función como esta:
fuente
fuente
fuente
Cambie "Datos" a cualquier nombre de hoja que esté probando ...
fuente
Sin ninguna duda de que la función anterior puede funcionar, acabo de terminar con el siguiente código que funciona bastante bien:
Nota:
Sheets_Name
es donde le pido al usuario que ingrese el nombre, por lo que puede que este no sea el mismo para usted.fuente
Hice otra cosa: eliminar una hoja solo si existe, no para obtener un error si no existe:
fuente
Se me ocurrió una forma fácil de hacerlo, pero no creé un nuevo sub para ello. En su lugar, simplemente "ejecuté una verificación" dentro del submarino en el que estaba trabajando. Suponiendo que el nombre de la hoja que estamos buscando es "Sheet_Exist" y solo queremos activarlo si lo encontramos:
También agregué una ventana emergente para cuando la hoja no existe.
fuente
Sé que es una publicación antigua, pero aquí hay otra solución simple que es rápida.
fuente
Corto y limpio:
fuente
De hecho, tenía una forma sencilla de verificar si la hoja existe y luego ejecutar alguna instrucción:
En mi caso, quería eliminar la hoja y luego volver a crear la misma hoja con el mismo nombre, pero el código se interrumpió si el programa no pudo eliminar la hoja porque ya estaba eliminada.
fuente