【发布时间】:2021-01-29 00:43:29
【问题描述】:
在最近的 Windows 更新后,以前运行的 Excel vba 脚本不再正常运行。
宏操作在工作时会打开一个 csv 文件,该文件在活动工作簿中定义为 String aString。 csv 文件包含变量列表和这些变量的对应值。该宏返回原始活动工作簿并读取活动工作簿中定义的命名单元格,并使用 csv 文件中定义的值更新这些命名单元格。
问题似乎是,尽管返回到原始活动工作簿,生成 For 循环以循环遍历命名单元格的命令不再返回变量名称的值或变量所在的工作表。
命令是:
' Process to update name values
Workbooks(strWorkBook).Activate
' Windows(strWorkBook).Activate
' Dim nm As Variant
' For Each nm In ActiveWorkbook.Names
For Each nm In Workbooks(strWorkBook).Names
varname = nm.Name
MsgBox "varname " & varname & " nm " & nm
varsheet = Range(nm).Parent.Name
MsgBox "varsheet " & varsheet
消息应为 varname aString nm $D$4
很确定它与更新版本相关,如在 Excel 构建版本 1902(构建 11328.20318)中它可以工作,但在 2002 版本(构建 12527.21416)中不起作用
提前感谢您的帮助。相关论坛指出了 Windows 的安全更新问题,但我还没有可以实施的解决方案。
================================================ =======
进一步测试的更新:
我创建了一个新工作簿并使用 Excel 版本 2002(内部版本 12527.21416)在新工作簿中构建了失败的宏。宏在新版本的 Excel 文件中完美运行,但在旧文件中继续产生上述错误消息。
我怀疑 2002 版构建中存在与安全更新相关的一些问题,这些问题与 1902 版构建不兼容,但无法确定问题所在。
在新版本中运行但不是原文档的宏是:
Public Sub testName()
Dim filePath As String
Dim inFilePath As String
Dim inCase As String
'On Error GoTo ErrorHandler
Application.ScreenUpdating = False
Application.EnableEvents = False
'----------------------------------
' Find path for input file
strWorkBook = ActiveWorkbook.Name
' MsgBox strWorkBook
filePath = Range("aString").Value
tmpsep = InStrRev(filePath, "\")
' Input file workbook name
inCase = Right(filePath, Len(filePath) - tmpsep)
'Input file full path
inFilePath = Left(filePath, Len(filePath) - Len(inCase))
' Open input data file
Workbooks.Open Filename:=filePath
'' Find last row in file
' Call FindLastRow.FindLastRow(lRow)
' rngend = lRow + 2
'' MsgBox rngend
Workbooks(strWorkBook).Activate
'
' VBA script to read external CSV file' For Each nm In ActiveWorkbook.Names
For Each nm In Workbooks(strWorkBook).Names
varname = nm.Name
MsgBox "varname " & varname & " nm " & nm
varsheet = Range(nm).Parent.Name
MsgBox "varsheet " & varsheet
varcell = nm.RefersToRange.Address(False, False)
NextIteration:
Next nm
End Sub
【问题讨论】:
-
从您的帖子中很难看出您在新/工作代码中的更改与在旧/非工作版本中的更改情况
-
@Tim Williams,新旧代码之间没有任何变化。它们是相同的。问题是代码不再适用于在早期版本中创建的原始 Excel 工作簿。如果我在 2002 版(构建...)版本中生成相同的模块,它可以完美运行。没有证据表明 2002 版之前的 Excel 工作簿构建...等已损坏,并且此工作簿中的其他宏功能没有问题。
标签: excel vba updates named-ranges