excel - programación - Pruebe o verifique si la hoja existe
vba excel descargar (20)
wsExists
Compact wsExists
(¡ sin depender del manejo de errores!)
Aquí hay una función breve y simple que no se basa en el manejo de errores para determinar si existe una hoja de cálculo (¡ y está declarada correctamente para funcionar en cualquier situación!)
Function wsExists(wsName As String) As Boolean
Dim ws: For Each ws In Sheets
wsExists = (wsName = ws.Name): If wsExists Then Exit Function
Next ws
End Function
Ejemplo de uso:
El siguiente ejemplo agrega una nueva hoja de cálculo llamada myNewSheet
, si aún no existe:
If Not wsExists("myNewSheet") Then Sheets.Add.Name = "myNewSheet"
Más información:
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 destsheet
todas las hojas en el libro de trabajo de origen y luego establezco la destsheet
en el libro de trabajo de destino en la hoja con el mismo nombre que el iterado actualmente en el libro de trabajo de origen.
¿Cómo puedo probar si esa hoja existe? Algo como:
If wkbkdestination.Worksheets(ThisWorkSheet.Name) Then
¿Por qué no simplemente usar 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 abierto actualmente.
Dim wb as Workbook
Dim ws as Worksheet
Set wb = ActiveWorkbook
For Each ws in wb.Worksheets
if ws.Name = "Sheet1" then
''Do something here
End if
Next
Algunas personas no les gusta este enfoque debido a un uso "inapropiado" de manejo de errores, pero creo que se considera aceptable en VBA ... Un enfoque alternativo es recorrer todas las hojas hasta encontrar una coincidencia.
Function SheetExists(shtName As String, Optional wb As Workbook) As Boolean
Dim sht As Worksheet
If wb Is Nothing Then Set wb = ThisWorkbook
On Error Resume Next
Set sht = wb.Sheets(shtName)
On Error GoTo 0
SheetExists = Not sht Is Nothing
End Function
Cambie "Datos" al nombre de la hoja que está probando ...
On Error Resume Next
Set DataSheet = Sheets("Data")
If DataSheet Is Nothing Then
Sheets.Add(after:=ActiveSheet).Name = "Data"
''''or whatever alternate code you want to execute''''
End If
On Error GoTo 0
Como el control de miembros de una colección es un problema general, aquí hay una versión resumida de la respuesta de Tim:
Function Contains(objCollection As Object, strName as String) As Boolean Dim o as Object On Error Resume Next set o = objCollection(strName) Contains = (Err.Number = 0) Err.Clear End Function
Esta función se puede usar con cualquier colección como objeto ( Shapes
, Range
, Names
, Workbooks
, etc.).
Para verificar la existencia de una hoja, use If Contains(Sheets, "SheetName") ...
De hecho, tenía una forma simple de verificar si la hoja existe y luego ejecutar algunas instrucciones:
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, ya que ya se eliminó
Sub Foo ()
Application.DisplayAlerts = False
On Error GoTo instructions
Sheets("NAME OF THE SHEET").Delete
instructions:
Sheets.Add After:=Sheets(Sheets.Count)
ActiveSheet.Name = "NAME OF THE SHEET"
End Sub
En caso de que alguien quiera evitar VBA y probar si existe una hoja de cálculo puramente dentro de una fórmula de celda, es posible usar las funciones ISREF
e INDIRECT
:
=ISREF(INDIRECT("SheetName!A1"))
Esto devolverá TRUE
si el libro de trabajo contiene una hoja llamada SheetName
y FALSE
contrario.
Hice otra cosa: eliminar una hoja solo si existe, para no obtener un error si no es así:
Excel.DisplayAlerts = False
Dim WS
For Each WS In Excel.Worksheets
If WS.name = "Sheet2" Then
Excel.sheets("Sheet2").Delete
Exit For
End If
Next
Excel.DisplayAlerts = True
Mi solución se parece mucho a Tims, pero también funciona en el caso de hojas que no sean hojas de trabajo: gráficos
Public Function SheetExists(strSheetName As String, Optional wbWorkbook As Workbook) As Boolean
If wbWorkbook Is Nothing Then Set wbWorkbook = ActiveWorkbook ''or ThisWorkbook - whichever appropriate
Dim obj As Object
On Error GoTo HandleError
Set obj = wbWorkbook.Sheets(strSheetName)
SheetExists = True
Exit Function
HandleError:
SheetExists = False
End Function
.
Muchos años tarde, pero solo necesitaba hacer esto y no me gustó ninguna de las soluciones publicadas ... Así que hice una, gracias a la magia de (gesto de las manos del arco iris de Bob Esponja) "Evaluar ()".
Evaluate("IsError(" & vSheetName & "!1:1)")
Devuelve VERDADERO si la hoja NO existe; FALSO si la hoja 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.
No necesita manejo de errores para lograr esto. Todo lo que tiene que hacer es iterar sobre todas las hojas de cálculo y verificar si existe el nombre especificado:
For i = 1 To Worksheets.Count
If Worksheets(i).Name = "MySheet" Then
exists = True
End If
Next i
If Not exists Then
Worksheets.Add.Name = "MySheet"
End If
Ponga la prueba en una función y podrá reutilizarla y tendrá una mejor legibilidad del código.
NO use "On Error Resume Next" ya que puede entrar en conflicto con otra parte de su código.
Sub DoesTheSheetExists()
If SheetExist("SheetName") Then
Debug.Print "The Sheet Exists"
Else
Debug.Print "The Sheet Does NOT Exists"
End If
End Sub
Function SheetExist(strSheetName As String) As Boolean
Dim i As Integer
For i = 1 To Worksheets.Count
If Worksheets(i).Name = strSheetName Then
SheetExist = True
Exit Function
End If
Next i
End Function
Se me ocurrió una manera fácil de hacerlo, pero no creé un nuevo subtítulo para él. En cambio, simplemente "ejecuté un cheque" 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 se encuentra:
Dim SheetCounter As Integer
SheetCounter = 1
Do Until Sheets(SheetCounter).Name = "Sheet_Exist" Or SheetCounter = Sheets.Count + 1
SheetCounter = SheetCounter +1
Loop
If SheetCounter < Sheets.Count + 1 Then
Sheets("Sheet_Exist").Activate
Else
MsgBox("Worksheet ""Sheet_Exist"" was NOT found")
End If
También agregué un pop-up para cuando la hoja no existe.
Si eres un fanático de WorksheetFunction.
o si trabaja desde un país que no es inglés con un Excel que no sea en inglés, esta es una buena solución que funciona:
WorksheetFunction.IsErr(Evaluate("''" & wsName & "''!A1"))
O en una función como esta:
Function WorksheetExists(sName As String) As Boolean
WorksheetExists = Not WorksheetFunction.IsErr(Evaluate("''" & sName & "''!A1"))
End Function
Si está interesado específicamente solo en hojas de cálculo, puede usar una simple llamada de Evaluar:
Function WorksheetExists(sName As String) As Boolean
WorksheetExists = Evaluate("ISREF(''" & sName & "''!A1)")
End Function
Sin ninguna duda de que la función anterior puede funcionar, acabo con el siguiente código que funciona bastante bien:
Sub Sheet_exist ()
On Error Resume Next
If Sheets("" & Range("Sheet_Name") & "") Is Nothing Then
MsgBox "doesnt exist"
Else
MsgBox "exist"
End if
End sub
Nota: Sheets_Name
es donde pido al usuario que ingrese el nombre, por lo que podría no ser el mismo para usted.
Yo escribí este:
Function sheetExist(sSheet As String) As Boolean
On Error Resume Next
sheetExist = (ActiveWorkbook.Sheets(sSheet).Index > 0)
End Function
Corregido: sin manejo de errores:
Function CheckIfSheetExists(SheetName As String) As Boolean
CheckIfSheetExists = False
For Each WS In Worksheets
If SheetName = WS.name Then
CheckIfSheetExists = True
Exit Function
End If
Next WS
End Function
For Each Sheet In Worksheets
If UCase(Sheet.Name) = "TEMP" Then
''Your Code when the match is True
Application.DisplayAlerts = False
Sheet.Delete
Application.DisplayAlerts = True
''-----------------------------------
End If
Next Sheet
Public Function WorkSheetExists(ByVal strName As String) As Boolean
On Error Resume Next
WorkSheetExists = Not Worksheets(strName) Is Nothing
End Function
sub test_sheet()
If Not WorkSheetExists("SheetName") Then
MsgBox "Not available"
Else MsgBox "Available"
End If
End Sub