微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Windows 更新后 Excel 宏不起作用 - Office 365

如何解决Windows 更新后 Excel 宏不起作用 - Office 365

在最近的 Windows 更新之后,以前可以运行的 Excel vba 脚本不再正常运行。

宏操作在工作时打开一个在活动工作簿中定义为字符串 aString 的 csv 文件。 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 的消息现在是:

enter image description here

消息应该是 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

解决方法

您的问题源于变量 Nm 的错误声明。事实上,它没有声明(并且您在模块顶部缺少 Option Explicit),这使其成为 Variant。 Excel 似乎无法在您创建的相当复杂的环境中按照您的意图将 Name 对象放入变体中(更多关于此内容的更多信息)。此代码将起作用。

    Dim Nm          As Name
    Dim varName     As String
    Dim varSheet    As String
    Dim varCell     As String
    
'    For Each Nm In ActiveWorkbook.Names
    For Each Nm In Workbooks(strWorkBook).Names
        With Nm
            varName = .Name
            varSheet = .RefersToRange.Parent.Name
            varCell = .RefersToRange.Address(0,0)
        End With
        MsgBox "Named range """ & varName & """ refers to range" & vbCr & _
               varCell & " on sheet """ & varSheet & """."
    Next Nm

我在 ActiveWorkbook 上测试了上述代码,但它也适用于任何其他代码。我在 Excel 365 中进行了测试,但这也不应该有什么不同。

上面提到的复杂性源于代码的这一部分,Range(nm).Parent.Name。在这种情况下,nm 是一个字符串。但在您的循环上下文中,nm 是一个 Name 对象。因此,虽然在旧版本中, Name 对象的默认属性显然是引用的范围地址,但它现在似乎是别的东西。这并不重要,因为 Name 对象有几个属性,可以从这些属性中将引用的范围提取为范围或其地址,并且一旦指定了要使用的对象,就不需要要求 VBA 使用默认值。

顺便说一下,Range("anything") 将始终在 ActiveSheet 上,而 Range("Sheet13!A2:A4").Parent 将返回错误而不是 Sheet13。因此,如果您需要知道命名范围所在的范围的工作表,您应该寻找另一种获取它的方法。

,

问题已解决,感谢此线程 stackflow thread 和用户 Jenn

在 Excel V1902 和 V2002 之间,工作簿中似乎存在一个隐藏变量 _xlfn.SINGLE。当宏循环通过时,它会看到命名范围,无法解析其地址或工作表位置并停止。直到运行 Jenn 的代码,我才能看到隐藏的变量。

enter image description here

最简单的解决方案是包含一个 IF 循环来绕过此变量(如果定义并继续正常)(如下所示)。这张表现在可以用了,但我不会再回到我生命中的那两天了。

For Each Nm In Workbooks(strWorkBook).Names
   If Nm.Name Like "_xlfn*" Then
      GoTo NextIteration
   End If

   With Nm
        varName = .Name
        varSheet = .RefersToRange.Parent.Name
        varCell = .RefersToRange.Address(0,0)
    End With
    MsgBox "Named range """ & varName & """ refers to range" & vbCr & _
           varCell & " on sheet """ & varSheet & """."

下一个迭代: 下一个 Nm

感谢对线程发表评论的人,Variatus 我会更新这些声明。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。