programming programación lenguaje for ejemplos descargar code excel vba excel-vba scripting

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