Excel VBA — объединение строк с разделителем и одинарными кавычками

У меня есть столбец ячеек. Они должны быть объединены в одну строку с несколькими разделителями между ними.

Мне нужно что-то вроде результата в столбце 2 из значений в столбце 1

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 для того же.


person Shrilakshmi Bartur    schedule 24.03.2017    source источник
comment
Да наверное есть.   -  person JNevill    schedule 24.03.2017
comment
Если вы используете Excel 2016, функция TEXTJOIN — это все, что вам нужно.   -  person CallumDA    schedule 24.03.2017
comment
Возможный дубликат Как добавить одинарная кавычка и запятая для всех значений в столбце?   -  person CallumDA    schedule 24.03.2017
comment
Просто спросил и ответил три раза в Excel VBA UDF для конкатенации выдает сообщение об ошибке.   -  person    schedule 24.03.2017
comment
Спасибо всем за вашу помощь. Я попробую все эти методы и дам вам знать, какой из них сработал лучше всего для меня. Еще раз спасибо всем за вашу помощь.   -  person Shrilakshmi Bartur    schedule 27.03.2017


Ответы (6)


Вы можете использовать метод Join в VBA с заданным разделителем:

e.g.

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

'// will print:
'// 'some';'words';'here'
person SierraOscar    schedule 24.03.2017

Я знаю, что вы просили VBA, но вы можете сделать это с помощью формулы:

In B2:

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

и перетащите вниз:

введите здесь описание изображения

Or

В B1 используйте ="'"&A1&"'", затем в B2 (и перетащите вниз):

=SUBSTITUTE(TEXTJOIN(";",TRUE,"'"&B1,"'"&A2&"'"),"'","",1)
person BruceWayne    schedule 24.03.2017

Вы можете добиться желаемого результата, используя эту формулу:

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

Сначала поместите значение из ячейки A2 в B2 вручную (используя формулу ="'" & A2 & "'"), а затем вставьте эту формулу в ячейку B3 и перетащите ее вниз.

Вот результат с обновленной формулой:

введите здесь описание изображения

ОБНОВЛЕНИЕ (Спасибо Брюсуэйну)

Введите значение в ячейку B2, используя:

="'" & A2 & "'"

Так что потребуется первый '

person ManishChristian    schedule 24.03.2017
comment
Кажется, это просто повторяет значение столбца A вместо использования текущей строки и предыдущих строк. - person BruceWayne; 24.03.2017
comment
А, я неправильно понял вопрос. Спасибо, что указали на это. - person ManishChristian; 24.03.2017
comment
Ну здорово, это немного лучше моего :D . Просто отметим, что я бы изменил B2 на ="'"&A1&"'", чтобы получить самое первое ', ведущее a1'. - person BruceWayne; 24.03.2017
comment
Ах, снова хороший улов. Я как-то не пропустил. Думаю, мне сейчас нужен кофе. :D - person ManishChristian; 24.03.2017

Я бы просто сделал такой простой цикл.

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
person Robomato    schedule 24.03.2017
comment
Привет, спасибо за этот простой код. Это довольно легко. Однако у меня две проблемы. 1. Первая ' отсутствует для первой записи во всех строках 2. A ; остается после последней записи во всех строках. Не могли бы вы помочь мне с этой проблемой? Почему это происходит? Можно ли это исправить? Спасибо - person Shrilakshmi Bartur; 02.04.2017

Вот моя функция 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,";")

и заполнить.

person Dick Kusleika    schedule 24.03.2017
comment
Привет, я попробовал код, но он не добавляет начальную и конечную одинарную кавычку ('). Не могли бы вы указать, что мне не хватает? - person Shrilakshmi Bartur; 02.04.2017
comment
Извините, пропустил цитаты. Используйте его как =JoinRange($A$1:A1,";",,,,"'"). Этот последний аргумент — двойная кавычка — одинарная кавычка — двойная кавычка. - person Dick Kusleika; 03.04.2017
comment
Также обратите внимание, что я обновил код, чтобы исправить ошибку, из-за которой один диапазон ячеек не обрабатывался должным образом. - person Dick Kusleika; 03.04.2017

Чтобы избежать визуальной путаницы, я предложу 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)

введите здесь описание изображения

Одинарная галочка (иначе одинарная кавычка или ') – это 39-й символ ASCII, а точка с запятой – 59-й символ ASCII.

person Community    schedule 12.04.2017