删除命名范围时出现运行时错误

y-i*_*guy 4 excel vba excel-vba named-ranges

我不明白为什么我在尝试删除命名范围时不断收到"运行时错误'1004':应用程序定义或对象定义错误"消息.

这是用于从.csv文件导入数据的代码,并将范围命名为"history"

With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;C:\Users\<user name>\Downloads\history.csv", Destination:=Range(destCell))
    .Name = "history"
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .TextFilePromptOnRefresh = False
    .TextFilePlatform = 437
    .TextFileStartRow = 3
    .TextFileParseType = xlDelimited
    .TextFileTextQualifier = xlTextQualifierDoubleQuote
    .TextFileConsecutiveDelimiter = False
    .TextFileTabDelimiter = False
    .TextFileSemicolonDelimiter = False
    .TextFileCommaDelimiter = True
    .TextFileSpaceDelimiter = False
    .TextFileColumnDataTypes = Array(3, 1, 2, 1, 1)
    .TextFileTrailingMinusNumbers = True
    .Refresh BackgroundQuery:=False
End With
Run Code Online (Sandbox Code Playgroud)

这是用于删除命名范围的"历史"的代码.请注意,它之前的行正好可以找到命名范围.它只是不会删除名称.

Application.Goto Reference:="history"
ActiveWorkbook.Names("history").Delete
Run Code Online (Sandbox Code Playgroud)

y-i*_*guy 5

答案:问题是工作簿使用工作表名称作为命名范围的Name属性的一部分.特别是它使用历史!历史的名称.

故障排除方法:我使用了以下代码,这些代码已发布到http://www.ozgrid.com/forum/showthread.php?t=49079&page=2上的类似问题

Dim nameRng As Name 
Dim varVal As Variant 
On Error Resume Next 
For Each nameRng In ActiveWorkbook.Names 
    varVal = Range(nameRng.Name).Value 
    nameRng.Delete 
Next
Run Code Online (Sandbox Code Playgroud)

VBA编辑器中的Locals窗口显示此变量的nameRng.Name是字符串"history!history".

修改后的代码:我删除了Application.Goto Reference:="history"行,因为它本质上是一个非功能性的代码行(类似于Select操作),并留下这个作为删除导入范围名称的代码:

ActiveWorkbook.Names("history!history").Delete
Run Code Online (Sandbox Code Playgroud)

平台:我在Windows 7 Professional上使用Excel 2013