在最近的 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

