将 Excel 公式字符串解析为 VBA 中的前置字符串、函数、参数和后置函数字符串

马兰克里尔

对于给定的 Excel 函数(例如VLOOKUP),我需要将单元格的公式字符串解析为:

  • preFunctionStr = VLOOKUP 函数前面的字符串
  • ExcelFn = "VLOOKUP"
  • Arguments = VLOOKUP 函数中所有参数的集合(它们本身可以包含函数)
  • postFunctionStr = 公式字符串中最后一个“)”后面的字符串

我想要这个的主要原因是能够在不改变答案的情况下转换 Excel 公式。例如,转换SUMIFSUMIFS与转换VLOOKUP成的组合INDEXMATCH

在我的示例中,我在一个包含公式的单元格中=A4+VLOOKUP(2,$E$4:$F$8,MATCH("Value(1)",$E$4:$F$4,0),0) + 2000,我需要将其解析为上述组件。

尽管我可以找到大量有关解析 Excel 公式的材料,但我找不到将其分解为这些组件的材料。

马兰克里尔

在我的解决方案中,我创建了一个Class module具有我需要将公式字符串拆分为调用的属性的属性ExcelFormulaParser

Option Explicit

Public ExcelFn As String
Public Arguments As New Collection
Public preFunctionStr As String
Public postFunctionStr As String

Sub SetMeUp(formulaStr As String, FormulaToParse As String)

    Dim FormulaStartPos As Integer
    Dim OpenBracketCounter As Integer
    Dim OpenBracketCount As Integer
    Dim ClosedBracketCount As Integer
    Dim WithinQuote As Boolean
        ' whether we are within quotation marks
    Dim i As Integer

    Dim strChr As String
    Dim Arg_i As String
    Dim Arg As String

    Me.ExcelFn = FormulaToParse

    FormulaStartPos = InStr(1, formulaStr, FormulaToParse)

    Me.preFunctionStr = Mid(formulaStr, 1, FormulaStartPos - 1)
    formulaStr = Mid(formulaStr, FormulaStartPos + Len(FormulaToParse), Len(formulaStr) - Len(FormulaToParse))

    If Left(formulaStr, 1) = "(" Then
        OpenBracketCounter = 1
        formulaStr = Mid(formulaStr, 2, Len(formulaStr) - 1)
    Else
        MsgBox ("Not the full FormulaToParse")
        End
    End If

    i = 0
    Arg_i = ""
    Do While OpenBracketCounter > 0
        i = i + 1
        strChr = Left(formulaStr, 1)
        If Len(formulaStr) > 0 Then
            formulaStr = Right(formulaStr, Len(formulaStr) - 1)
        End If

        If strChr = Chr(34) Then
            WithinQuote = Not (WithinQuote) ' toggle WithinQuote on or off
            ' don't count brackets within quotation marks
        ElseIf strChr = "(" And WithinQuote = False Then
            OpenBracketCounter = OpenBracketCounter + 1
        ElseIf strChr = ")" And WithinQuote = False Then
            OpenBracketCounter = OpenBracketCounter - 1
        End If

        If OpenBracketCounter = 1 And strChr = "," Then
            Arg = Arg_i
            Me.Arguments.Add Arg
            Arg_i = ""
        ElseIf OpenBracketCounter = 0 Then
            Arg = Arg_i
            Me.Arguments.Add Arg
            Arg_i = ""
            Me.postFunctionStr = formulaStr
        Else
            Arg_i = Arg_i & strChr
        End If
    Loop

End Sub

为了提供如何调用和使用 的示例Class module,我在同一个 VBA 项目中创建了以下模块:

Sub TestFormulaParser()

    Dim ParsedForm As ExcelFormulaParser
    Set ParsedForm = New ExcelFormulaParser
    Dim StrToParse As String
    StrToParse = ActiveCell.Formula
        ' formula contains:
        '' =A4+VLOOKUP(2,$E$4:$F$8,MATCH("Value(1)",$E$4:$F$4,0),0) + 2000
    Call ParsedForm.SetMeUp(StrToParse, "VLOOKUP")

    preFunctionStr = ParsedForm.preFunctionStr
        ' returns the prefunction string i.e. =A4+
    ExcelFn = ParsedForm.ExcelFn
        ' returns the excel function we parsed i.e. VLOOKUP
    Arg1 = ParsedForm.Arguments(1)
        ' returns the first argument of the VLOOKUP function i.e. 2
    Arg2 = ParsedForm.Arguments(2)
        ' returns the second argument of the VLOOKUP function i.e. $E$4:$F$8
    Arg3 = ParsedForm.Arguments(3)
        ' returns the third argument of the VLOOKUP function i.e. MATCH("Value(1)",$E$4:$F$4,0)
    Arg4 = ParsedForm.Arguments(4)
        ' returns the fourth argument of the VLOOKUP function i.e. 0
    postFunctionStr = ParsedForm.postFunctionStr
        ' returns the post function string i.e.  + 2000

End Sub

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

VBA Excel将数字格式化为字符串

来自分类Dev

VBA Excel将数字格式化为字符串

来自分类Dev

Excel VBA将单元格中的字符串作为带变量的公式求值

来自分类Dev

VBA使用字符串数组作为子字符串参数InStr函数(Excel)

来自分类Dev

VBA使用字符串数组作为子字符串参数InStr函数(Excel)

来自分类Dev

将键传递给函数作为字符串参数时,VBA Excel错误“按参考参数类型不匹配”

来自分类Dev

将键传递给函数作为字符串参数时,VBA Excel错误“按参考参数类型不匹配”

来自分类Dev

将字符串传递到VBA中的范围函数

来自分类Dev

VBA,在Excel中的公式中搜索字符串

来自分类Dev

Excel VBA用公式中的字符串求值

来自分类Dev

VBA将值从Excel表传输到字符串

来自分类Dev

将分隔字符串写入工作表 Excel VBA

来自分类Dev

VBA excel:如何将字符串数组与字符串进行比较?

来自分类Dev

VBA excel:如何将字符串数组与字符串进行比较?

来自分类Dev

Excel VBA中的子字符串

来自分类Dev

POI将Excel字符串读取为数字

来自分类Dev

Excel VBA:公式不能从字符串正确输入

来自分类Dev

Excel vba 公式字符串不计算:#NAME?错误

来自分类Dev

Excel VBA-用户定义函数可将字符串转换为公式

来自分类Dev

Excel函数将变量插入字符串

来自分类Dev

任何将反转字符串的Excel函数?

来自分类Dev

Excel函数将字符串当作公式来求值吗?

来自分类Dev

当字符串包含数字和多余的字符时,将字符串解析为int

来自分类Dev

当字符串包含数字和多余的字符时,将字符串解析为int

来自分类Dev

如何将Excel字符串转换为公式?

来自分类Dev

如何使用 VBA 将数组公式作为长度超过 255 个字符的字符串自动输入到 Excel 单元格中?

来自分类Dev

Excel DNA-将C#字符串编组到回调中的VBA ByRef

来自分类Dev

Excel DNA-将C#字符串编组到回调中的VBA ByRef

来自分类Dev

Excel VBA-将编号列表合并到位置字符串中(例如2.5.3.1。)

Related 相关文章

  1. 1

    VBA Excel将数字格式化为字符串

  2. 2

    VBA Excel将数字格式化为字符串

  3. 3

    Excel VBA将单元格中的字符串作为带变量的公式求值

  4. 4

    VBA使用字符串数组作为子字符串参数InStr函数(Excel)

  5. 5

    VBA使用字符串数组作为子字符串参数InStr函数(Excel)

  6. 6

    将键传递给函数作为字符串参数时,VBA Excel错误“按参考参数类型不匹配”

  7. 7

    将键传递给函数作为字符串参数时,VBA Excel错误“按参考参数类型不匹配”

  8. 8

    将字符串传递到VBA中的范围函数

  9. 9

    VBA,在Excel中的公式中搜索字符串

  10. 10

    Excel VBA用公式中的字符串求值

  11. 11

    VBA将值从Excel表传输到字符串

  12. 12

    将分隔字符串写入工作表 Excel VBA

  13. 13

    VBA excel:如何将字符串数组与字符串进行比较?

  14. 14

    VBA excel:如何将字符串数组与字符串进行比较?

  15. 15

    Excel VBA中的子字符串

  16. 16

    POI将Excel字符串读取为数字

  17. 17

    Excel VBA:公式不能从字符串正确输入

  18. 18

    Excel vba 公式字符串不计算:#NAME?错误

  19. 19

    Excel VBA-用户定义函数可将字符串转换为公式

  20. 20

    Excel函数将变量插入字符串

  21. 21

    任何将反转字符串的Excel函数?

  22. 22

    Excel函数将字符串当作公式来求值吗?

  23. 23

    当字符串包含数字和多余的字符时,将字符串解析为int

  24. 24

    当字符串包含数字和多余的字符时,将字符串解析为int

  25. 25

    如何将Excel字符串转换为公式?

  26. 26

    如何使用 VBA 将数组公式作为长度超过 255 个字符的字符串自动输入到 Excel 单元格中?

  27. 27

    Excel DNA-将C#字符串编组到回调中的VBA ByRef

  28. 28

    Excel DNA-将C#字符串编组到回调中的VBA ByRef

  29. 29

    Excel VBA-将编号列表合并到位置字符串中(例如2.5.3.1。)

热门标签

归档