excel vba excel-vba worksheet

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") en Worksheets("SomeNameHere").Range("A1")
  • .Index como .Index Worksheets(2) en Worksheets(2).Range("A1") de Worksheets(2).Range("A1")
  • .CodeName como Sheet3 en Sheet3.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

[1] msdn.microsoft.com/en-us/library/office/ff837552.aspx