【问题标题】:Replace variable letters in formula strings using VBA使用 VBA 替换公式字符串中的变量字母
【发布时间】:2020-06-07 00:15:15
【问题描述】:

我有如下所示的 Excel 公式

示例 1

=SUMIF('TRx Wkly NT'!$A:$A,"AdderAKl* XR*",'TRx Wkly NT'!BS:BS)/10^3

示例 2

=SUMIF('TRx Wkly NT'!$A:$A,"amphe* ER* prasco*",'TRx Wkly NT'!BS:BS)/10^3+SUMIF('TRx Wkly NT'!$A:$A,"amphe* ER* teva*",'TRx Wkly NT'!BS:BS)/10^3

示例 3

=SUM('Baseline Trx Wkly NT'!BS:BS)/1000-SUM(PX29,PX73,PX108)/1000

在这些公式中,“BS:BS”指的是整个列。我需要一个用 VBA 替换 "BS:BS" 和 "ColumnLetterVariable:ColumnLetterVariable" 的子

我如何实现这一目标?我什至不知道从哪里开始。我使用正则表达式吗?

问题 1:我不知道我要替换什么。 “BS:BS”不是常数;它一直在变化。可以是一天AA:AA,也可以是第二天Z:Z等单个字母。 VBA 需要一种方法来识别字符串的Column:Column 部分

问题 2:“BS:BS”可能出现在公式中的多个位置,例如示例 2。所有这些都需要替换为我的 VBA 变量。

编辑:示例公式的$A:$A 部分不需要替换。只是BS:BS 部分,它一直在变化。

【问题讨论】:

  • myCell.Formula = Replace(myCell.Formula, "!BS:BS", "!A:A")
  • @TimWilliams 为什么会这样? “BS:BS”不是恒定的。这只是一个例子。这部分字符串一直在变化。 (在我的问题 1 中解释)
  • 您的问题不清楚您不知道要替换的是什么。第一个示例中的$A:$A 怎么样?你怎么知道哪些引用需要切换?
  • @TimWilliams 很抱歉造成混乱,我修改了原帖。你是对的,我不知道我要替换什么。标有 $ 的东西不需要切换。
  • 最好只生成一个新公式。例如:=SUMIF('TRx Wkly NT'!$A:$A,"AdderAKl* XR*",'TRx Wkly NT'!" & myCol & ":" & myCol & ")/10^3 其中myCol 是您需要的列

标签: excel vba


【解决方案1】:

试试这段代码——我认为你可以使用正则表达式来解决你的问题(所有 cmets 和模式解释都在代码中):

Sub RegexTest()
    Dim regex As Object, result As String, pattern As String, replacement As String
    Set regex = CreateObject("VBScript.RegExp")
    ' Define inputs: pattern and replacement value
    pattern = "!([A-Z]+):(\1)"
    ' Pattern explanation: match exclamation mark (!) literally, then match one or more capital letters: [A-Z]+,
    ' those captured letters will  be in capturing group defined with brackets (),
    ' then match semicolon (:), then match exact same text that was captured in first group
    replacement = "Column:Column"
    ' Test function
    result = RegExReplace("TRx Wkly NT'!$A:$A,""AdderAKl* XR*"",'TRx Wkly NT'!BS:BS)/10^3", pattern, replacement)
    MsgBox result
    result = RegExReplace("TRx Wkly NT'!$A:$A,""amphe* ER* prasco*"",'TRx Wkly NT'!BS:BS)/10^3+SUMIF('TRx Wkly NT'!$A:$A,""amphe* ER* teva*"",'TRx Wkly NT'!BS:BS)/10^3", pattern, replacement)
    MsgBox result
    result = RegExReplace("Baseline Trx Wkly NT'!BS:BS)/1000-SUM(PX29,PX73,PX108)/1000", pattern, replacement)
    MsgBox result
End Sub
Function RegExReplace(inputString As String, pattern As String, replacement As String) As String
    ' We need to create RegExp object to use regular expressions
    Dim regex As Object
    Set regex = CreateObject("VBScript.RegExp")
    regex.pattern = pattern
    RegExReplace = inputString
    ' Since Replace method replaces one value at a time, you need to replace it until no more matches are found
    Do
        RegExReplace = regex.Replace(RegExReplace, "Column:Column)")
    Loop While regex.Test(RegExReplace)
End Function

【讨论】:

  • 谢谢。我会试试这个。
  • 可能要到一周后才能真正尝试这个。会绕回来。
猜你喜欢
  • 2011-08-18
  • 1970-01-01
  • 2019-08-01
  • 2020-07-09
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-31
相关资源
最近更新 更多