Ste*_*vil 18 excel vba excel-vba
当我通过名称管理器创建命名范围时,我可以选择指定工作簿或[worksheet name]范围.但如果那时想要改变范围,那么下拉列表就会变灰.有没有办法,在名称管理器中,或者,优选地,VBA可以更改现有命名范围的范围?
例如:
testName指'sheet1'!A1:B2范围工作簿.我该如何改变呢?testName是指'sheet1'!A1:B2'sheet1'范围?Cha*_*ams 15
您可以从http://www.decisionmodels.com/downloads.htm下载由我自己开发的免费名称管理器插件和Jan Karel Pieterse 这将启用Excel 2007名称管理器无法处理的许多名称操作,包括更改名称范围.
在VBA中:
Sub TestName()
Application.Calculation = xlManual
Names("TestName").Delete
Range("Sheet1!$A$1:$B$2").Name = "Sheet1!TestName"
Application.Calculation = xlAutomatic
End Sub
Run Code Online (Sandbox Code Playgroud)
小智 11
我找到了解决方案!只需使用命名变量复制工作表即可.然后删除原始工作表.复制的工作表现在将具有相同的命名变量,但具有本地范围(范围=复制的工作表).
但是,我不知道如何从局部变量更改为全局变量.
JS2*_*'11 10
检查这两个相互反转的子,并翻转所有命名范围的范围(工作表到工作簿或反向),这些范围引用活动工作表上的范围.
Option Explicit
'---------------------------------------------------------------------------------------
' Procedure : RescopeNamedRangesToWorkbook
' Author : JS20'07'11
' 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 : JS20'07'11
' 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
Run Code Online (Sandbox Code Playgroud)
小智 5
另一种方法是“破解”2007 或更高版本的 Excel 文件,但建议您在执行此操作时要小心,并保留原始文件的备份:
首先将 Excel 电子表格另存为 .xlsx 或 .xlsm 文件(非二进制)。将文件重命名为 .zip,然后解压缩。转到 zip 结构中的 xl 文件夹,然后在写字板或类似的文本编辑器中打开 workbook.xml。命名范围可在 DefinedName 标签中找到。本地范围由 localSheetId="x" 定义(工作表 ID 可以通过在 Excel 中打开电子表格并按 Alt-F11 进入 VBA 窗口,然后查看“项目”窗格来找到)。隐藏范围由hidden=“1”定义,因此只需删除hidden=“1”即可取消隐藏。
现在重新压缩文件夹结构,注意保持文件夹结构的完整性,并将其重命名回 .xlsx 或 .xlsm。
如果您需要更改范围或隐藏/取消隐藏大量定义的范围,这可能不是最好的解决方案,尽管它可以很好地进行一两个小调整。