excel - Consulte la hoja con el nombre en clave
vba excel-vba (6)
CodeName es en realidad lectura-escritura en tiempo de ejecución cuando se accede a la propiedad a través de Worksheet.Parent.VBProject.VBComponents:
'' ActiveWorksheet both .Name and .CodeName are ''Sheet 1''
For Each oVBComponent In ActiveWorksheet.Parent.VBProject.VBComponents
If (oVBComponent.Name = ActiveWorksheet.CodeName) Then oVBComponent.Name = "New Name"
Next oVBComponent
Debug.Print ActiveWorkSheet.Name, ActiveWorksheet.CodeName '' "Sheet1", "New Name"
Me sale un error de "falta de coincidencia de tipos" en este código:
With Worksheets(Sheet1) ''* Error here
''my code here
End With
El
CodeName
mi hoja es
''sheet1''
.
¿Alguien puede ayudarme a eliminar el error?
Hay tres propiedades diferentes que podrían usarse para referirse a una hoja de trabajo:
-
.Name
como.Name
Worksheets("SomeNameHere")
enWorksheets("SomeNameHere").Range("A1")
-
.Index
como.Index
Worksheets(2)
enWorksheets(2).Range("A1")
deWorksheets(2).Range("A1")
-
.CodeName
comoSheet3
enSheet3.Range("A1")
Para ver la diferencia, ejecute el siguiente código y eche un vistazo a la ventana inmediata Ctrl + G :
Sub TestMe()
Dim wks As Worksheet
For Each wks In ThisWorkbook.Worksheets
Debug.Print wks.Name
Debug.Print wks.Index
Debug.Print wks.CodeName
Debug.Print "-----------------------"
Next wks
End Sub
Si el
Name
y el
CodeName
de la hoja de trabajo no se cambian, serían lo mismo.
- Nombre clave:
- Nombre:
Para usar el
Worksheet.Index
en su código:
With Worksheets(1) '' << this is the index for Sheet1
.Range("A1").Value = "Test" '' modify the value in cell A1
End With
Puede usar nombres de códigos de hoja directamente en su código como si fueran variables declaradas:
Sub UsingSheetCodeName()
With Sheet1
.[a1] = Sheet1.Name
End With
End Sub
Quizás este código ayude a comprender los diferentes nombres y el índice
Sub DisplaySheetnames()
Dim wks As Worksheet
For Each wks In Worksheets
Debug.Print "Index", wks.Index, "of sheet with name: " & wks.Name, "and", "codename " & wks.CodeName
Next
End Sub
1) Consulte la hoja por índice:
With Worksheets(1)
''<stuff here>
End With
El "índice" depende del "orden de las hojas en el libro". Si baraja su pedido de hojas, ¡es posible que ya no se refiera a la misma hoja!
2) Consulte la hoja por Nombre:
With Worksheets("Your Sheet Name")
''<stuff here>
End With
Esta es la propiedad
.Name
de una hoja de trabajo, y es el nombre visible en la pestaña de la hoja de trabajo de Excel y entre paréntesis en el Explorador de proyectos de VBA.
3) Consulte la hoja por CodeName:
Sugirió que realmente deseaba usar la propiedad
.CodeName
de una hoja de trabajo.
¡Esto no puede ser una referencia entre paréntesis como en los dos ejemplos anteriores, pero existe al contrario de algunas respuestas anteriores!
Se asigna automáticamente a una hoja en la creación, y es "Hoja" y luego el siguiente número no utilizado en los CodeNames creados previamente.
La ventaja de usar
CodeName
es que no depende del orden de la hoja (a diferencia del
Index
) y no cambia si un usuario cambia el
Name
simplemente cambiando el nombre de la hoja en Excel.
La desventaja es que el código puede ser más complicado o ambiguo.
Como
CodeName
es de solo lectura [1], esto no se puede mejorar, ¡pero garantiza las ventajas anteriores!
Consulte la documentación referenciada para más detalles.
Primera forma de usarlo : directamente ...
With Sheet1
''<stuff here>
End With
Segunda forma de usarlo
: indirectamente, puede ofrecer más claridad o flexibilidad, muestra cómo usar la propiedad
CodeName
de una hoja de trabajo ...
Al
CodeName
las hojas y leer la propiedad
CodeName
, primero puede encontrar la propiedad
Index
o
Name
de la hoja deseada.
Entonces puede usar esto para hacer referencia a la hoja.
Dim sh as WorkSheet
Dim shName as String
Dim shIndex as Long
'' Cycle through all sheets until sheet with desired CodeName is found
For Each sh in ThisWorkbook.WorkSheets
'' Say the codename you''re interested in is Sheet1
If sh.CodeName = "Sheet1" Then
'' - If you didn''t want to refer to this sheet later,
'' you could do all necessary operations here, and never use shName
'' or the later With block.
'' - If you do want to refer to this sheet later,
'' you will need to store either the Name or Index (below shows both)
'' Store sheet''s Name
shName = sh.Name
'' Store sheet''s Index
shIndex = sh.Index
End If
Next sh
'' Check if match was found, do stuff as before if it was!
If shName = "" Then
MsgBox "Could not find matching codename"
Else
'' Equally to the next line, could use Worksheets(shIndex)
With Worksheets(shName)
''<stuff here>
End With
End If