2009-06-29 24 views
15

Cuando creo un rango con nombre a través del Administrador de nombres, tengo la opción de especificar Libro de trabajo o alcance [worksheet name]. Pero si luego quiere cambiar el alcance, el menú desplegable aparece atenuado. ¿Hay alguna manera, ya sea en Name Manager o, preferiblemente, VBA para cambiar el alcance de un rango con nombre existente?Cómo cambiar el alcance del rango con nombre

Por ejemplo:

  • testName refiere a 'sheet1'!A1:B2 con libro de trabajo alcance. ¿Cómo cambiaría eso a
  • testName se refiere a 'sheet1'!A1:B2 con el alcance 'hoja1'?

Respuesta

12

Puede descargar el complemento Administrador de nombres gratuito desarrollado por mí y Jan Karel Pieterse de http://www.decisionmodels.com/downloads.htm Esto permite muchas operaciones nombre que el gerente Nombre Excel 2007 no puede manejar, incluyendo el cambio alcance de nombres.

En VBA:

Sub TestName() 
Application.Calculation = xlManual 
Names("TestName").Delete 
Range("Sheet1!$A$1:$B$2").Name = "Sheet1!TestName" 
Application.Calculation = xlAutomatic 
End Sub 
+0

Este código parece cambiar el alcance de los rangos establecidos en el libro de trabajo a la hoja de trabajo. Pensé que se suponía que debía hacer lo contrario. es decir, cambie el alcance de la hoja de trabajo al libro de trabajo. –

+0

La pregunta original me parece clara: "Por ejemplo, 'testName' se refiere a 'sheet1'! A1: B2 con scope Workbook. ¿Cómo cambiaría eso a 'testName' se refiere a 'sheet1'! A1: B2 con 'sheet1 'alcance? –

+0

Gracias por el complemento. Funciona muy bien. – Anthony

2

crear el nuevo nombre de cero y borrar el viejo.

+1

no tan bueno si tiene 100ish nombres para cambiar –

3

Así es como promociono todos los nombres de hojas de trabajo a nombres globales. YMMV

For Each wsh In ActiveWorkbook.Worksheets 
For Each n In wsh.Names 
    ' Get unqualified range name 
    Dim s As String 
    s = Split(n.Name, "!")(UBound(Split(n.Name, "!"))) 
    ' Add to "Workbook" scope 
    n.RefersToRange.Name = s 
    ' Remove from "Worksheet" scope 
    Call n.Delete 
Next n 
Next wsh 
+1

No creo que este código sea correcto. – tbone

+0

Este código funcionó para mí. – Hazerider

+0

Parece que funciona bien en 2013, pero para 2010 y siguientes debe definir estas variables primero: 'Dim wsh As Worksheet Dim N As Object' – Jim

1

Esto todavía necesita más refinación sin embargo funciona con todas las referencias simples, sin matar a los nombres locales existentes.

Type GlobalNamesToLocalNames_Type 
    Name As String 
    Sheet As String 
    Ref As String 
End Type 

Sub GlobalNamesToLocalNames(Optional Void As Variant) 
    Dim List() As GlobalNamesToLocalNames_Type 
    Dim Count As Long 
    Dim Name As Name 
    Dim Dat() As String 
    Dim X As Long 

    ' count the size 
    For Each Name In ActiveWorkbook.Names 
     Count = Count + 1 
    Next 
    ReDim List(Count - 1) 
    Count = 0 

    ' Collecect all name data 
    For Each Name In ActiveWorkbook.Names 
     With List(Count) 
     ' Pick up only the name 
     If InStr(Name.Name, "!") > 0 Then 
      Dat = Split(Name.Name, "!") 
      .Name = Dat(1) 
     Else 
      .Name = Name.Name 
     End If 
     ' pick up the sheet and refer 
     Dat = Split(Name.RefersTo, "!") 
     .Sheet = Mid(Dat(0), 2) 
     .Ref = Dat(1) 
     ' make local sheet name 
     .Name = .Sheet & "!" & .Name 
     End With 
     Count = Count + 1 
    Next 

    ' Delete all names 
    For Each Name In ActiveWorkbook.Names 
     Name.Delete 
    Next 

    'rebuild all the names 
    For X = 0 To Count - 1 
     With List(X) 
     If Left(.Ref, 1) <> "#" Then 
      ActiveWorkbook.Names.Add Name:=.Name, RefersToLocal:="=" & .Sheet & "!" & .Ref 
     End If 
     End With 
    Next 
End Sub 
5

Consultar estas dos subs que revierten el uno al otro y voltear el alcance (hoja de trabajo para libro o inversa) de todos los rangos con nombre que se refieren a un rango en la hoja activa.

Option Explicit 
'--------------------------------------------------------------------------------------- 
' Procedure : RescopeNamedRangesToWorkbook 
' Author : Jesse Stratton 
' Date  : 11/18/2013 
' Purpose : Rescopes the parent of worksheet scoped named ranges to the active workbook 
' for each named range with a scope equal to the active sheet in the active workbook. 
'--------------------------------------------------------------------------------------- 

Public Sub RescopeNamedRangesToWorkbook() 
Dim wb As Workbook 
Dim ws As Worksheet 
Dim objName As Name 
Dim sWsName As String 
Dim sWbName As String 
Dim sRefersTo As String 
Dim sObjName As String 
Set wb = ActiveWorkbook 
Set ws = ActiveSheet 
sWsName = ws.Name 
sWbName = wb.Name 

'Loop through names in worksheet. 
For Each objName In ws.Names 
'Check name is visble. 
    If objName.Visible = True Then 
'Check name refers to a range on the active sheet. 
     If InStr(1, objName.RefersTo, sWsName, vbTextCompare) Then 
      sRefersTo = objName.RefersTo 
      sObjName = objName.Name 
'Check name is scoped to the worksheet. 
      If objName.Parent.Name <> sWbName Then 
'Delete the current name scoped to worksheet replacing with workbook scoped name. 
       sObjName = Mid(sObjName, InStr(1, sObjName, "!") + 1, Len(sObjName)) 
       objName.Delete 
       wb.Names.Add Name:=sObjName, RefersTo:=sRefersTo 
      End If 
     End If 
    End If 
Next objName 
End Sub 
'--------------------------------------------------------------------------------------- 
' Procedure : RescopeNamedRangesToWorksheet 
' Author : Jesse Stratton 
' Date  : 11/18/2013 
' Purpose : Rescopes each workbook scoped named range to the specific worksheet to 
' which the range refers for each named range that refers to the active worksheet. 
'--------------------------------------------------------------------------------------- 

Public Sub RescopeNamedRangesToWorksheet() 
Dim wb As Workbook 
Dim ws As Worksheet 
Dim objName As Name 
Dim sWsName As String 
Dim sWbName As String 
Dim sRefersTo As String 
Dim sObjName As String 
Set wb = ActiveWorkbook 
Set ws = ActiveSheet 
sWsName = ws.Name 
sWbName = wb.Name 

'Loop through names in worksheet. 
For Each objName In wb.Names 
'Check name is visble. 
    If objName.Visible = True Then 
'Check name refers to a range on the active sheet. 
     If InStr(1, objName.RefersTo, sWsName, vbTextCompare) Then 
      sRefersTo = objName.RefersTo 
      sObjName = objName.Name 
'Check name is scoped to the workbook. 
      If objName.Parent.Name = sWbName Then 
'Delete the current name scoped to workbook replacing with worksheet scoped name. 
       objName.Delete 
       ws.Names.Add Name:=sObjName, RefersTo:=sRefersTo 
      End If 
     End If 
    End If 
Next objName 
End Sub 
9

¡He encontrado la solución! Solo copie la hoja con sus variables nombradas. Luego borre la hoja original. La hoja copiada ahora tendrá las mismas variables nombradas, pero con un alcance local (scope = la hoja copiada).

Sin embargo, no sé cómo cambiar a partir de variables locales a globales ..

+0

Gracias amigo, lo usé y está funcionando bien. Conservará su formato condicional, etc. , pero no es recomendable si tiene códigos de macros. –

+0

Esta solución no funcionó para mí con Excel 2013 – Lee

+0

Solución buena y rápida, útil si desea aplicar la misma acción a todos los nombres. Con Excel 2010, después de eliminar la hoja original, me quedaron los nombres originales con el alcance del Libro de trabajo (apuntando a #REF! ...), pero pude eliminarlos rápidamente. –

2

Una forma alternativa es "hackear" el archivo de Excel 2007 o superior, aunque es recomendable tener cuidado si están haciendo esto y guardan una copia de seguridad del original:

Primero guarde la hoja de cálculo de Excel como un archivo .xlsx o .xlsm (no binario). cambie el nombre del archivo a .zip, luego descomprímalo. Vaya a la carpeta xl en la estructura zip y abra workbook.xml en Wordpad o un editor de texto similar. Los rangos con nombre se encuentran en las etiquetas definedName. El alcance local se define mediante localSheetId = "x" (los ID de las hojas se pueden encontrar presionando Alt-F11 en Excel, con la hoja de cálculo abierta, para acceder a la ventana de VBA y luego mirando el panel Proyecto). Los rangos ocultos están definidos por hidden = "1", así que simplemente elimine el oculto = "1" para mostrar, por ejemplo.

Ahora vuelva a descomprimir la estructura de la carpeta, teniendo cuidado de mantener la integridad de la estructura de la carpeta, y cambie el nombre a .xlsx o .xlsm.

Probablemente esta no sea la mejor solución si necesita cambiar el alcance u ocultar/mostrar un gran número de rangos definidos, aunque funciona bien para hacer uno o dos pequeños ajustes.

-1

encontrado esto en theexceladdict.com

  • Seleccione el rango con nombre en la hoja de trabajo cuyo ámbito desea cambiar;

  • Abra el Administrador de nombres (pestaña Fórmulas) y seleccione el nombre;

  • Haga clic en Eliminar y en Aceptar;

  • Haga clic en Nuevo ... y escriba el nombre original en el campo Nombre;

  • Asegúrese de que el alcance esté configurado en Libro de trabajo y haga clic en Cerrar.

0

El código de JS20'07'11 es realmente increíble simple y directo. Una sugerencia que me gustaría dar es poner un signo de exclamación en las condiciones:

InStr(1, objName.RefersTo, sWsName+"!", vbTextCompare) 

Debido a esto evitará que la adición de un NamedRange en una hoja incorrecta. Por ejemplo: Si el NamedRange se refiere a una hoja denominada Plan11 y tiene otro hoja denominada Plan1 el código puede hacer un poco de lío cuando añadir los rangos si no se utiliza el signo de exclamación.

ACTUALIZACIÓN

Una corrección: Lo mejor es utilizar una expresión regular evaluar el nombre de la hoja. Una función sencilla que se puede utilizar es la siguiente (adaptado por http://blog.malcolmp.com/2010/regular-expressions-excel-add-in, permitirá a Microsoft VBScript expresiones regulares 5.5):

Function xMatch(pattern As String, searchText As String, Optional matchIndex As Integer = 1, Optional ignoreCase As Boolean = True) As String 
On Error Resume Next 
Dim RegEx As New RegExp 
RegEx.Global = True 
RegEx.MultiLine = True 
RegEx.pattern = pattern 
RegEx.ignoreCase = ignoreCase 
Dim matches As MatchCollection 
Set matches = RegEx.Execute(searchText) 
Dim i As Integer 
i = 1 
For Each Match In matches 
    If i = matchIndex Then 
     xMatch = Match.Value 
    End If 
    i = i + 1 
Next 
End Function 

Por lo tanto, se puede usar algo así:

xMatch("'?" +sWsName + "'?" + "!", objName.RefersTo, 1) <> "" 

en lugar de

InStr(1, objName.RefersTo, sWsName+"!", vbTextCompare) 

Esto cubrirá Plan1 y 'Plan1' (WH en el rango hace referencia a más de una celda) variaciones

CONSEJO: Evite los nombres de las hojas con comillas simples ('), :).

0

Para mí eso funciona cuando creo nueva etiqueta Nombre para el mismo rango desde el Administrador de Nombre me da la opción de cambiar el alcance;) libro viene por defecto y se puede cambiar a cualquiera de los disponibles sábanas.

0

Estas respuestas fueron útiles para resolver un problema similar al intentar definir un rango con nombre con el alcance Workbook. El "ah-HA" para mí es usar la colección de nombres que es relativa al libro completo ! Esto puede estar repitiendo lo obvio para muchos, pero no fue declarado claramente en mi investigación, así que lo comparto con otras preguntas similares.

' Local/Worksheet only scope 
Worksheets("Sheet2").Names.Add Name:="a_test_rng1", RefersTo:=Range("A1:A4") 

' Global/Workbook scope 
ThisWorkbook.Names.Add Name:="a_test_rng2", RefersTo:=Range("B1:b4") 

Si nos fijamos en la lista de nombres cuando Hoja2 está activo, ambos rangos están ahí, pero cambiar a cualquier otra hoja, y "a_test_rng1" no está presente.

Ahora puedo felizmente generar un rango con nombre en mi código con el alcance que considero apropiado. No hay necesidad de perder el tiempo con el administrador de nombre o un tapón en.


Además, el gestor de nombre en Excel Mac 2011 es un desastre, pero sí descubrió que, si bien no hay etiquetas de columna que le diga lo que' Estoy mirando mientras veo su lista de rangos con nombre, si hay una hoja al lado del nombre, ese nombre tiene el alcance de la hoja de trabajo/local. Ver captura de pantalla adjunta.

Excel Mac 2011 Name Manager

crédito completo a this article para la elaboración de las piezas.

Cuestiones relacionadas