【问题标题】:Excel VBA - String Conactenation with delimiter and single quotesExcel VBA - 带分隔符和单引号的字符串连接
【发布时间】:2017-08-17 17:58:33
【问题描述】:

我有一列单元格。它们需要连接成一个字符串,中间有多个分隔符。

我需要第 1 列中的值中的第 2 列中的结果

Column 1 | column 2
a1       |   'a1'
a2       |    'a1';'a2'
a3       |    'a1';'a2';'a3'
a4       |    'a1';'a2';'a3';'a4'
a5       |    'a1';'a2';'a3';'a4';'a5'

目前我使用以下公式

Column 1  |   Column 2
a1        |  ="'"&a1&"'"&";"
a2        |  =b1&"'"&a2&"'"&";"
a3        |

并将其复制到 B2 列。

是否有 VBA 代码可以帮助我做到这一点。我确实找到了一些会在单元格之间添加单个分隔符 ' 但我无法修改它以添加多个分隔符。

如果可以共享相同的 VBA 代码会非常有帮助。

【问题讨论】:

标签: vba excel string-concatenation textjoin


【解决方案1】:

为了避免视觉混乱,我将提供CHAR(39)&CHAR(59)&CHAR(39) 代替"';'"

在 B1 中,使用这个:

=CHAR(39)&TEXTJOIN(CHAR(39)&CHAR(59)&CHAR(39), TRUE, A$1:A1)&CHAR(39)

填写。

...或者如果最终结果是唯一重要的事情,

=CHAR(39)&TEXTJOIN(CHAR(39)&CHAR(59)&CHAR(39), TRUE, A1:A5)&CHAR(39)

一个勾号(aka 单引号或')是 ASCII 字符 39,分号是 ASCII 字符 59。

【讨论】:

    【解决方案2】:

    这是我的JoinRange 函数。它有比您想要的更多的选择。

    Public Function JoinRange(rInput As Range, _
         Optional sDelim As String = vbNullString, _
         Optional sLineStart As String = vbNullString, _
         Optional sLineEnd As String = vbNullString, _
         Optional sBlank As String = vbNullString, _
         Optional sQuotes As String = vbNullString, _
         Optional IgnoreBlanks As Boolean = True) As String
    
         Dim vaCells As Variant
         Dim i As Long, j As Long
         Dim lCnt As Long
         Dim aReturn() As String
    
         If rInput.Cells.Count = 1 Then
            ReDim aReturn(1 To 1)
            aReturn(1) = sQuotes & rInput.Value & sQuotes
         Else
            vaCells = rInput.Value
             ReDim aReturn(1 To rInput.Cells.Count)
    
             For i = LBound(vaCells, 1) To UBound(vaCells, 1)
                 For j = LBound(vaCells, 2) To UBound(vaCells, 2)
                     If Len(vaCells(i, j)) = 0 Then
                         If Not IgnoreBlanks Then
                             lCnt = lCnt + 1
                             aReturn(lCnt) = sQuotes & sBlank & sQuotes
                         End If
                     Else
                         lCnt = lCnt + 1
                         aReturn(lCnt) = sQuotes & vaCells(i, j) & sQuotes
                     End If
                 Next j
             Next i
    
             ReDim Preserve aReturn(1 To lCnt)
         End If
    
         JoinRange = sLineStart & Join(aReturn, sDelim) & sLineEnd
    
    End Function
    

    像在B1中使用它

    =JoinRange($A$1:A1,";")
    

    然后填写。

    【讨论】:

    • 嗨,我尝试了代码,但它没有添加前导单引号和单引号 (') 你能指出我遗漏了什么吗?
    • 对不起,我错过了报价。像=JoinRange($A$1:A1,";",,,,"'") 一样使用它。最后一个参数是双引号 - 单引号 - 双引号。
    • 另请注意,我更新了代码以修复单个单元格范围未正确处理的错误。
    【解决方案3】:

    您可以使用以下公式获得所需的输出:

    =CONCATENATE(B2, " ; '", A3, "'")
    

    首先手动将单元格 A2 中的值放入 B2(使用="'" & A2 & "'" 公式),然后将此公式粘贴到单元格 B3 中并向下拖动。

    这是更新公式的结果:

    更新感谢 BruceWayne

    在单元格 B2 中输入值:

    ="'" & A2 & "'"
    

    所以需要第一个'

    【讨论】:

    • 这似乎只是重复了A 列的值,而不是使用当前行加上前面的行。
    • 啊,我误解了这个问题。感谢您指出。
    • 啊很好,这比我的要好一点:D。请注意,我会将B2 更改为="'"&A1&"'" 以获得第一个' 领先a1'
    • 啊,又抓到了。我不知道我错过了它。我想我现在需要咖啡。 :D
    【解决方案4】:

    我知道您要求使用 VBA,但您可以使用公式:

    B2

    =IF(ROW()=2,TEXTJOIN(";",TRUE,"'"&B1,"'"&A2&"'"),TEXTJOIN(";",TRUE,B1,"'"&A2&"'"))
    

    并向下拖动:

    或者

    B1 中,使用="'"&A1&"'",然后在B2 中(并向下拖动):

    =SUBSTITUTE(TEXTJOIN(";",TRUE,"'"&B1,"'"&A2&"'"),"'","",1)
    

    【讨论】:

      【解决方案5】:

      我会像这样做一个简单的循环。

      Sub combineRows()
      
          'start and end rows, assuming column A
          Dim startRow, endRow As Integer
      
          Dim myString, myAdd As String
      
          startRow = 2
          endRow = 6
      
      
      
          For i = startRow To endRow
      
      
              myAdd = "'" & Range("A" & i) & "'" & ";"
      
              myString = myString + myAdd
      
              Range("B" & i) = myString
      
          Next i
      
      
      
      End Sub
      

      【讨论】:

      • 嗨,感谢这个简单的代码。这很容易。但是我有两个问题。 1.所有行中的第一个条目缺少第一个' 2.一个“;”在所有行中的最后一个条目之后剩余你能帮我解决这个问题吗?为什么会这样?可以修复吗?谢谢
      【解决方案6】:

      您可以在给定分隔符的 VBA 中使用 Join 方法:

      例如

      someArray = Array("some", "words", "here")
      Debug.Print "'" & Join(someArray, "';'") & "'"
      
      '// will print:
      '// 'some';'words';'here'
      

      【讨论】:

        猜你喜欢
        • 2011-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-22
        • 2017-09-29
        相关资源
        最近更新 更多