Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 如何用单元格中包含的值替换字符串?_Vba_Excel_Excel Formula - Fatal编程技术网

Vba 如何用单元格中包含的值替换字符串?

Vba 如何用单元格中包含的值替换字符串?,vba,excel,excel-formula,Vba,Excel,Excel Formula,我有一列包含“字符串”公式,即“=+I11+I192+I245+I280” 我需要用单元格中包含的内容(字符串)替换单元格(I11、I192、I245和I280`)ID 例如: Cell X --> "=+I11+I192+I245+I280" Cell I11 = 'A' Cell I192 = 'B' Cell I245 = 'C' Cell I280 = 'D' 这个公式应该生成“=+A+B+C+D”我想你的意思是 =INDIRECT(I11,TRUE)+INDIRECT(I192

我有一列包含“字符串”公式,即“=+I11+I192+I245+I280” 我需要用单元格中包含的内容(字符串)替换单元格(
I11
、I192
、I245
I280`)ID

例如:

Cell X --> "=+I11+I192+I245+I280"
Cell I11 = 'A'
Cell I192 = 'B'
Cell I245 = 'C'
Cell I280 = 'D'

这个公式应该生成
“=+A+B+C+D”

我想你的意思是

=INDIRECT(I11,TRUE)+INDIRECT(I192,TRUE)+INDIRECT(I245,TRUE)+INDIRECT(I280,TRUE)

但是请注意,
间接
是一个不稳定的函数,如果广泛使用,会降低计算速度。

我想你的意思是

=INDIRECT(I11,TRUE)+INDIRECT(I192,TRUE)+INDIRECT(I245,TRUE)+INDIRECT(I280,TRUE)
但是请注意,
间接
是一个不稳定的函数,如果广泛使用,可能会降低计算速度。

好吧,那么:

=I11 & I192 & I245 & I280
或者可以包含空格

=I11 & " " & I192
但是直截了当的引用-我的手机很有趣…

好吧,那么:

=I11 & I192 & I245 & I280
或者可以包含空格

=I11 & " " & I192
但是直截了当的引用-我的手机很有趣…

这是什么

="=+" & I11 &"+" & I192 &"+" & I245 & "+" & I280
这个

公式应生成-->“=+A+B+C+D”

试试看

公式应生成-->“=+A+B+C+D”

试试看


不知道空单元格将做什么,所以这里是草稿

Public Sub test()
   [I11] = "A": [I192] = "B": [I245] = "C":  [I280] = "D"
   Debug.Print ConvertedString("=+I11+I192+I245+I280")
End Sub

Public Function ConvertedString(ByVal inputString As String) As Variant
    Dim arr() As String, i As Long
    On Error GoTo errHand
    If Not InStr(inputString, Chr$(43)) > 0 Then
        ConvertedString = CVErr(xlErrNA)
        Exit Function
    End If

    arr = Split(inputString, Chr$(43))
    For i = 1 To UBound(arr)
        arr(i) = Range(arr(i))
    Next i
    ConvertedString = Join(arr, Chr$(43))
    Exit Function
errHand:
    ConvertedString = CVErr(xlErrNA)
End Function

我不知道你将如何处理空单元格,所以这里是草稿

Public Sub test()
   [I11] = "A": [I192] = "B": [I245] = "C":  [I280] = "D"
   Debug.Print ConvertedString("=+I11+I192+I245+I280")
End Sub

Public Function ConvertedString(ByVal inputString As String) As Variant
    Dim arr() As String, i As Long
    On Error GoTo errHand
    If Not InStr(inputString, Chr$(43)) > 0 Then
        ConvertedString = CVErr(xlErrNA)
        Exit Function
    End If

    arr = Split(inputString, Chr$(43))
    For i = 1 To UBound(arr)
        arr(i) = Range(arr(i))
    Next i
    ConvertedString = Join(arr, Chr$(43))
    Exit Function
errHand:
    ConvertedString = CVErr(xlErrNA)
End Function
使用VBA(仅使用单个分隔符):

根据OP的评论:


问题是公式会更改,所以我不能只手动更改。我给你们的那个只是一个例子,但我有很多不同的例子,所有的数学运算符

您可以尝试使用正则表达式查找单元格地址,并替换为单元格的值:

Function ReplaceAddr2(sInput As String) As String
  Dim oRegEx As Object
  Dim oMatches As Object
  Dim i As Long, lStart As Long, lLength As Long
  Set oRegEx = CreateObject("vbscript.regexp")
  oRegEx.Pattern = "[A-Za-z]{1,3}\d{1,7}"
  oRegEx.Global = True
  oRegEx.MultiLine = True
  Set oMatches = oRegEx.Execute(sInput)
  lStart = 0
  For i = 0 To oMatches.Count - 1
    lLength = oMatches(i).FirstIndex - lStart
    ReplaceAddr2 = ReplaceAddr2 & Mid$(sInput, lStart + 1, lLength) & Range(oMatches(i).Value)
    lStart = lStart + lLength + oMatches(i).length
  Next
  ReplaceAddr2 = ReplaceAddr2 & Mid(sInput, lStart + 1, Len(sInput) - lStart)
End Function
模式为1-3个字母后接1-7个数字

这两个函数都不是易失性的-仅当输入字符串更改时才会重新计算,但当其中的单元格地址更改时不会重新计算。添加此行:

Application.Volatile True
将使其在每次更改时重新计算,但可能会影响性能。

使用VBA(仅使用单个分隔符):

根据OP的评论:


问题是公式会更改,所以我不能只手动更改。我给你们的那个只是一个例子,但我有很多不同的例子,所有的数学运算符

您可以尝试使用正则表达式查找单元格地址,并替换为单元格的值:

Function ReplaceAddr2(sInput As String) As String
  Dim oRegEx As Object
  Dim oMatches As Object
  Dim i As Long, lStart As Long, lLength As Long
  Set oRegEx = CreateObject("vbscript.regexp")
  oRegEx.Pattern = "[A-Za-z]{1,3}\d{1,7}"
  oRegEx.Global = True
  oRegEx.MultiLine = True
  Set oMatches = oRegEx.Execute(sInput)
  lStart = 0
  For i = 0 To oMatches.Count - 1
    lLength = oMatches(i).FirstIndex - lStart
    ReplaceAddr2 = ReplaceAddr2 & Mid$(sInput, lStart + 1, lLength) & Range(oMatches(i).Value)
    lStart = lStart + lLength + oMatches(i).length
  Next
  ReplaceAddr2 = ReplaceAddr2 & Mid(sInput, lStart + 1, Len(sInput) - lStart)
End Function
模式为1-3个字母后接1-7个数字

这两个函数都不是易失性的-仅当输入字符串更改时才会重新计算,但当其中的单元格地址更改时不会重新计算。添加此行:

Application.Volatile True

将使其在每次更改时重新计算,但可能会影响性能。

单词“支持”表示您正在做某事,您需要帮助,因此您尝试过什么吗?为什么不能使用Find和Replace呢?假设这取决于您想要实现的目标。“=+A+B+C+D”代表什么?您希望得到一个结果还是一个字符串?一个包含在单元格中的字母的字符串如果单元格为空会发生什么情况?单词“support”表示您正在做某事,您需要帮助,所以您尝试过什么吗?为什么不能使用Find和Replace呢?假设这取决于您想要实现的目标。“=+A+B+C+D”代表什么?您希望得到一个结果还是一个字符串?只是一个包含在单元格中的字母的字符串如果单元格为空会发生什么情况?@SJR如果在单元格G1=“A1”和G2=“A2”中,则
=间接(G1,TRUE)+间接(G2,TRUE)
将单元格A1和A2相加,就像
=A1+A2
一样,但OP有“a”、“B”因此,除非它们代表命名的范围/常数,否则您无法将它们相加(无论如何,他已经澄清,他想要的是实际字符串,而不是计算结果)。@SJR您可能是对的,在我写答案时,这个问题太模糊了。不确定A和B等是否只是单元格中的示例或实际数据。我们会看到的。问题是公式会改变,所以我不能只手动改变。我给你的只是一个例子,但是我有很多不同的数学运算符。@SJR如果在单元格G1=“A1”和G2=“A2”中,那么
=INDIRECT(G1,TRUE)+INDIRECT(G2,TRUE)
将单元格A1和A2相加,就像
=A1+A2
一样,但OP有“A”、“B”因此,除非它们代表命名的范围/常数,否则您无法将它们相加(无论如何,他已经澄清,他想要的是实际字符串,而不是计算结果)。@SJR您可能是对的,在我写答案时,这个问题太模糊了。不确定A和B等是否只是单元格中的示例或实际数据。我们会看到的。问题是公式会改变,所以我不能只手动改变。我给你们的那个只是一个例子,但我有很多不同的例子,所有的数学运算符。