动态数组的 Excel VBA 预编译测试

Posted

技术标签:

【中文标题】动态数组的 Excel VBA 预编译测试【英文标题】:Excel VBA Precompile Test For Dynamic Array 【发布时间】:2021-05-12 23:03:52 【问题描述】:

已开始掌握 Excel VBA 编程技能,尝试在较旧的 32 位和 64 位 Windows 10 之间共享代码,并在 Mac 上模拟 Office 365 Windows:其中一个平台无法识别最近添加的动态数组“ ”(多单元格数组)和“@”(隐式交集运算符),而另一个平台无法识别带有 Formula2 构造的“Cells.Replace”命令,但正在使用“间接”和“&”(连接)作为变量唯一标识符(标准查找函数失败的地方),但 Excel 将它们视为数组。一个平台需要 Formula2(Mac 跳过指令),另一个甚至不使用它编译(完全停止),没有它,宏代码崩溃(Mac 必须“读取”工作表上的公式来检索值,由于其沙盒问题,不是来自已声明的变量)。我正在尝试进行预编译查询以绕过如图所示的错误测试,但它失败了。建议进行预编译测试以阻止 Excel 自动添加花括号“”或符号“@”?

#If IsError(Cells.Replace What:=WhatNow, Replacement:=Whatzit, LookAt:=xlPart, FormulaVersion:=xlReplaceFormula2) Then

【问题讨论】:

在不知道您的代码的情况下,我猜您正在将公式写入工作表?为什么不先检查版本并根据版本编写相应的代码?或者根本不写公式。只需在 VBA 中进行计算即可。 是的,将公式写入工作表(根据 Mac 环境的要求)。但是,也有预先写好的公式。回复:运行版本检查:如果它那么容易,我会这样做。同样,Mac 上模拟的 Office 365 Windows 10 环境与实际操作系统没有区别,任何版本测试都出现在 Office 365 Windows 10 上。 现有工作表上的公式与VBA中的宏代码一样多,而且太多了。所以,答案是 VBA 检查。请仅提供建议。 嗯。 VBA 版本的版本检查返回Office 365 Windows 10?你是怎么做到的?我没有要测试的 Mac。我会做更多的研究。 哦。操作系统模拟器是 Parallels,它创建一个虚拟驱动器来伪装成 Win10,让 Ofc365 运行。因此,具有 "If Application.OperatingSystem Like ""Mac""" 的 VBA 失败,因为它在模拟的 Windows 中运行。该命令之后的任何版本检查都会被忽略(例如,“If Val(Application.Version) 【参考方案1】:

因为 'xlReplaceFormula2' 必须包含在某些 Mac 环境中,但会被较旧的编译器排除,因此必须将 Formula2 构造放在预编译 (#) if 语句中。但是,新公式的测试不会在预编译模式下执行,因为它会产生类型不匹配错误。这是我找到的解决方法:

a) 测试较新的公式以确定环境是否创建动态数组特殊字符( 、@),以及 b) 在预编译语句中执行替换命令。

这可以替换多余的字符,因此它不会干扰旧平台中的公式操作,在旧平台中使用自定义连接 (&) 组合来代替数据透视表或基本的查找公式。

    Dim WhatNow, Whatzit

   'Define special character
    WhatNow = "@"  'eg, "", ""
   'Define formula to edit
    Whatzit = "Cells"  'eg, "If", "Indirect", etc.

   'Test for formula that contains dynamic array
    If Application.Evaluate("=XLOOKUP(1,1,2,3,3,2,1)") Then
       'Include 'xlReplaceFormula2' within a precompile (#) 'If' statement
        #If Not Err = 0 Then
         Cells.Replace What:=WhatNow, Replacement:=Whatzit, LookAt:=xlPart, _
             SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
             ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2
        #Else
        'Else, older platform - use older formula construct
         Cells.Replace What:=WhatNow, Replacement:=Whatzit, LookAt:=xlPart, _
             SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
             ReplaceFormat:=False
        #End If
    End If

【讨论】:

以上是关于动态数组的 Excel VBA 预编译测试的主要内容,如果未能解决你的问题,请参考以下文章

vba 代码中有二维动态数组S,第1次重定义为50行,但由于只用到j行

Excel VBA数组使用方法

如何在vba动态数组不清空维数前提下快速将所有元素赋值为0, erase会把动态数组维数清空

使用VBA根据逻辑动态循环数组元素

Excel vba 编译错误 - 参数不是可选的,

如何自动扩展excel表格以填充动态数组的大小