2010-04-16 17 views
12

Parece que Visual Basic no puede hacer referencia a hojas de acuerdo con los nombres de hoja modificados por el usuario. Las pestañas de la hoja de trabajo pueden cambiar sus nombres, pero parece que Visual Basic todavía piensa en los nombres de la hoja de trabajo como Sheet1, etc., a pesar de que la pestaña del libro de trabajo ha sido cambiada a algo útil.Nombres de hoja de ficha de Excel vs. nombres de hoja de Visual Basic

tengo unas pocas cosas:

TABname = rng.Worksheet.Name ' Excel sheet TAB name, not VSB Sheetx name. 

pero me gustaría utilizar nombres de las hojas en las rutinas de Visual Basic. Lo mejor que pude llegar hasta ahora es seleccionar el nombre de la pestaña de la hoja de trabajo frente a los nombres de Visual Basic, lo que no me hace el día. Visual Basic debe conocer los nombres de Sheet1, Sheet2, etc. ¿Cómo puedo asociarlos con los nombres de las pestañas de Excel para no tener que mantener una tabla de búsqueda que cambie con cada nueva pestaña de hoja o hoja que vuelva a nombrar? Gracias de antemano por sus respuestas.

+1

Nunca he encontrado una situación en la que se cambie el nombre de una hoja, pero VB no puede ver el cambio. ¿Puedes mostrar tu código relevante? –

Respuesta

16

En el modelo de objetos de Excel una hoja de cálculo tiene 2 diferentes propiedades del nombre:

Worksheet.Name
Worksheet.CodeName

la propiedad Name es de lectura/escritura y contiene el nombre que aparece en la pestaña de la hoja. Es de usuario y

puede hacer referencia a una hoja en particular como Hojas de trabajo ("Fred") VBA cambiante

la propiedad nombre en clave es de sólo lectura. Range ("A1"), donde Fred es la propiedad .Nombre o como Sheet1.Range ("A1") donde Sheet1 es el nombre clave de la hoja de trabajo.

+0

Sí, eso es lo que estaba buscando, ¡gracias! – SteveNeedsSheetNames

+0

Ahora quiero tener una función básica visual con una salida ParamArray, y quiero que esa salida esté disponible para otra función, sin tener que ponerla en una hoja de cálculo solo para seleccionarla en esa segunda función. ¿Hay alguna forma de transferir matrices entre funciones en Visual Basic? Gracias por adelantado por tu respuesta. – SteveNeedsSheetNames

3

Debería poder hacer referencia a las hojas por el nombre proporcionado por el usuario. ¿Estás seguro de que estás haciendo referencia al libro de trabajo correcto? Si tiene más de un libro de trabajo abierto en el momento en que se refiere a una hoja, eso definitivamente podría causar el problema.

Si este es el problema, usando ActiveWorkbook (el libro actualmente activo) o ThisWorkbook (el libro de trabajo que contiene la macro) debería resolverlo.

Por ejemplo,

Set someSheet = ActiveWorkbook.Sheets("Custom Sheet") 
0

Hay (al menos) dos maneras diferentes para llegar a la Worksheet objeto

  • a través de las colecciones Sheets o Worksheets como referenciado por DanM
  • por no calificado nombres de objeto

Cuando se crea un nuevo libro de trabajo con tres hojas de cálculo, existen cuatro objetos a los que se puede acceder por medio de nombres no calificados: ThisWorkbook; Sheet1; Sheet2; Sheet3. Esto le permite escribir cosas como esta:

Sheet1.Range("A1").Value = "foo" 

Aunque esto puede parecer como un atajo útil, el problema viene cuando se cambia el nombre de las hojas de trabajo. El nombre de objeto no calificado permanece como Sheet1, incluso si la hoja de cálculo se renombra a algo totalmente diferente.

Hay una cierta lógica para esto porque:

  • nombres de las hojas no se ajustan a las mismas reglas que los nombres de las variables
  • es posible enmascarar accidentalmente una variable existente

Por ejemplo (probado en Excel 2003), cree un nuevo Workbook con tres hojas de trabajo. Crea dos módulos.En un módulo de declarar esto:

Public Sheet4 As Integer 

En el otro puso módulo:

Sub main() 

Sheet4 = 4 

MsgBox Sheet4 

End Sub 

Ejecutar este y el cuadro de mensaje debería aparecer correctamente.

Ahora agregue una cuarta hoja de cálculo al libro de trabajo que creará un objeto Sheet4. Intenta ejecutar main otra vez y esta vez obtendrás un error "El objeto no admite esta propiedad o método"

0

He tenido que recurrir a esto, pero esto tiene problemas con el mantenimiento.

Function sheet_match(rng As Range) As String ' Converts Excel TAB names to the required VSB Sheetx names. 
    TABname = rng.Worksheet.Name    ' Excel sheet TAB name, not VSB Sheetx name. Thanks, Bill Gates. 
' Next, match this Excel sheet TAB name to the VSB Sheetx name: 
    Select Case TABname 'sheet_match 
     Case Is = "Sheet1": sheet_match = "Sheet1" ' You supply these relationships 
     Case Is = "Sheet2": sheet_match = "Sheet2" 
     Case Is = "TABnamed": sheet_match = "Sheet3" 'Re-named TAB 
     Case Is = "Sheet4": sheet_match = "Sheet4" 
     Case Is = "Sheet5": sheet_match = "Sheet5" 
     Case Is = "Sheet6": sheet_match = "Sheet6" 
     Case Is = "Sheet7": sheet_match = "Sheet7" 
     Case Is = "Sheet8": sheet_match = "Sheet8" 
    End Select 
End Function 
1

En realidad el nombre del objeto/código "Hoja1" se puede cambiar. En VBA, haga clic en Sheet1 en la lista Objetos de Excel. En la ventana de propiedades, puede cambiar Sheet1 para decir rng.

Luego puede hacer referencia a rng como un objeto global sin tener que crear primero una variable. Así que debug.print rng.name funciona bien. No más Hojas de trabajo ("rng"). Nombre.

A diferencia de la pestaña, el nombre del objeto tiene las mismas restricciones que otras variables (es decir, sin espacios).

0

Usando el nombre en clave de hoja fue la respuesta que necesitaba demasiado para detener una serie de macros que cae sobre - la respuesta de ccampj por encima de espejos this solution (con pantalla las fotografías)

1

ésta sea una solución básica (tal vez me falta la plena punto de la pregunta). ActiveSheet.Name DEVOLVERÁ la cadena del nombre de la pestaña actual (y reflejará cualquier cambio futuro realizado por el usuario). Simplemente llamo a la hoja activa, establezco la variable y luego la utilizo como el objeto de las Hojas de trabajo. Aquí estoy recuperando datos de una tabla para configurar un informe para una división. Esta macro funcionará en cualquier hoja de mi libro de trabajo que esté formateada para el mismo filtro (criterios y copytorange): cada división obtiene su propia hoja y puede modificar los criterios y actualizar utilizando esta única macro.

Dim currRPT As String 
ActiveSheet.Select 
currRPT = (ActiveSheet.Name) 
Range("A6").Select 
Selection.RemoveSubtotal 
Selection.AutoFilter 
Range("PipeData").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range _ 
    ("C1:D2"), CopyToRange:=Range("A6:L9"), Unique:=True 
Worksheets(currRPT).AutoFilter.Sort.SortFields.Clear 
Worksheets(currRPT).AutoFilter.Sort.SortFields.Add Key:= _ 
    Range("C7"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ 
    xlSortNormal 
+0

El problema de listar Proc Permite configurar Get Subs Func ha estado conmigo desde hace unos años donde el nombre del código del nombre de la hoja del nombre del módulo era un desastre. Esto lo corrige. Muy apreciado fue su código Harry S –

3

Esto va a cambiar los nombres de todos los objetos de la hoja de trabajo (desde el punto de vista del editor de VBA) para que coincida con la de sus nombres de las hojas (desde la perspectiva de Excel):

Sub ZZ_Reset_Sheet_CodeNames() 
'Changes the internal object name (codename) of each sheet to it's conventional name (based on it's sheet name) 

    Dim varItem As Variant 

    For Each varItem In ThisWorkbook.VBProject.VBComponents 
     'Type 100 is a worksheet 
     If varItem.Type = 100 And varItem.Name <> "ThisWorkbook" Then 
      varItem.Name = varItem.Properties("Name").Value 
     End If 
    Next 
End Sub 

es importante tenga en cuenta que el nombre del objeto (nombre clave) "(Nombre)" está anulado por el nombre de la propiedad "Nombre", por lo que debe estar referenciado como una subpropiedad.

+0

"Acceso programático al proyecto de Visual Basic no es de confianza" - habilitar la configuración de macro http://stackoverflow.com/a/25638419/ – user423430

+0

.Properties ("Nombre"). El valor fue EXACTAMENTE lo que era buscando, gracias! – baldmosher

+0

El problema de listar Proc Permite configurar Get Subs Func ha estado conmigo desde hace unos años donde el nombre del código del nombre de la hoja del nombre del módulo era un desastre. Esto lo corrige. Muy apreciado fue su código Harry S –

Cuestiones relacionadas