2011-12-28 12 views
10

Estoy intentando lo que pensé que sería una declaración de vba bastante simple para probar si un rango con nombre tiene un alcance en un libro de trabajo o en una hoja específica.Progamáticamente determina si un rango con nombre tiene un alcance en un libro de trabajo


Como prueba, he creado un nuevo documento de Excel y lo he agregado en 6 rangos con nombre. Aquí es cómo se nos extienden en el Administrador de Nombre:

Name   | Refers To   | Scope 
-------------+----------------------+----------- 
rng_Local01 | =Sheet1!$A$2:$A$16 | Sheet1 
rng_Local02 | =Sheet1!$C$2:$C$16 | Sheet1 
rng_Local03 | =Sheet1!$E$2:$E$16 | Sheet1 
rng_Global01 | =Sheet1!$B$2:$B$16 | Workbook 
rng_Global02 | =Sheet1!$D$2:$D$16 | Workbook 
rng_Global03 | =Sheet1!$F$2:$F$16 | Workbook 

yo esperaría que la ejecución:

For i = 1 To ThisWorkbook.Names.Count 
    If ThisWorkbook.Names(i).WorkbookParameter Then Debug.Print ThisWorkbook.Names(i).Name 
Next i 

daría lugar a los tres Workbook rangos con nombre de ámbito que estar conectado, sin embargo, nada sucede. No hay error El .Names(i).WorkbookParameter evalúa a False en TODOS de los rangos nombrados y no estoy seguro de por qué.


Mirando a través del objeto Name en la ayuda de VBA me encontré con ValidWorkbookParameter que se parece a la de sólo lectura primo de WorkbookParameter, sin embargo el uso de ese método no hace ninguna diferencia.

También he intentado fijar explícitamente ThisWorkbook.Names(i).WorkbookParameter = True, sin embargo, esto resulta en un error:

"Invalid procedure call or argument"

A pesar de que WorkbookParameter aparece como Lectura/Escritura


¿Alguien puede arrojar ¿Alguna luz sobre por qué esto no está funcionando como lo estoy esperando también? ¿He entendido mal cómo se supone que Name.WorkbookParameter funciona? ¿Alguien puede hacer que esto se ejecute con éxito?

+0

Gracias por las soluciones muy útiles chicos ... Todavía tengo curiosidad por el comportamiento de las propiedades 'WorkbookParameter' y' ValidWorkbookParameter' del objeto 'Name' en VBA. En mi opinión, esas propiedades no funcionan * como se anuncian *. –

+0

No estoy seguro de qué es exactamente WorkbookParameter, pero sospecho que es para Excel Services en Sharepoint y no para el cliente Excel –

Respuesta

19

Puede utilizar la propiedad Parent:

Sub Global_Local_names() 
    Dim oNm As Name 
    For Each oNm In Names 
     If TypeOf oNm.Parent Is Worksheet Then 
      Debug.Print oNm.Name & " is local to " & oNm.Parent.Name 
     Else 
      Debug.Print oNm.Name & " is global to " & oNm.Parent.Name 
     End If 
    Next 
End Sub 
+0

Nice. Gracias por la sugerencia – JMax

+0

Gracias por la solución ... No había pensado en usar la propiedad 'Parent'.Marqué esta como la respuesta ya que trata más directamente si el rango nombrado pertenece al libro de trabajo o una hoja. –

3

no he podido hacer el trabajo WorkbookParameter pero encontré una solución:

For i = 1 To ThisWorkbook.Names.Count 
    If UBound(Split(ThisWorkbook.Names(i).Name, "!")) > 0 Then Debug.Print ThisWorkbook.Names(i).Name 
Next i 

El nombre del local de rango con nombre (es decir, alcance a una hoja solamente) está formateado de esta manera: Sheet1!NamedRange mientras que el nombre del global Rango con nombre está formateado: NamedRange.

Por lo tanto, puede dividir en el ! y verificar la longitud de la matriz.

+0

Me gusta la solución creativa usando 'Split' –

Cuestiones relacionadas