【问题标题】:Excel VBA Precompile Test For Dynamic Array动态数组的 Excel VBA 预编译测试
【发布时间】: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)

标签: excel excel-formula cross-platform dynamic-arrays precompile


【解决方案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

【讨论】:

    猜你喜欢
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多