Excel-用包含在单元格中的值替换字符串

时间:2018-08-02 10:01:23

标签: excel vba excel-vba excel-formula

我恳请您用此Excel技巧来支持我。

我有一列包含公式的“字符串”,即"=+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"

6 个答案:

答案 0 :(得分:3)

这吗?

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

答案 1 :(得分:1)

好吧:

=I11 & I192 & I245 & I280

或者您可以包含空格

=I11 & " " & I192

但是直接引号-我的电话很有趣...

答案 2 :(得分:1)

  

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

尝试

="=+"&textjoin("+", true, I11, I192, I245, I280)

enter image description here

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

我认为您的意思是

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

但是请注意,Indirect是一个易失函数,如果广泛使用它会减慢计算速度。

答案 5 :(得分:0)

使用VBA(仅具有单个定界符):

Function ReplaceAddr(sInput As String, Optional sDelimiter As String = "+") As String
  Dim sArr
  Dim i As Long
  sArr = Split(sInput, sDelimiter)
  For i = 1 To UBound(sArr)
    sArr = Range(sArr(i))
  Next i
  ReplaceAddr = Join(sArr, sDelimiter)
End Function

根据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

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