Хитрости »
5 Август 2013 151203 просмотров
Сцепить много ячеек с указанным разделителем
Часто бывает ситуация, когда необходимо из трех разных столбцов сцепить данные в одну строку с разделителем. Допустим в А1 Фамилия, в В1 — Имя, в С1 — Отчество, а надо получить все вместе Фамилия Имя Отчество. Как обычно в Excel объединяют значения нескольких ячеек в одну? Правильно, при помощи функции СЦЕПИТЬ или при помощи амперсанда:
=СЦЕПИТЬ(A1;» «;B1;» «;C1;» «)
=A1&» «&B1&» «&C1&» «
Это достаточно эффективно, если необходимо сцепить значения из трех-пяти ячеек. А если ячеек 50? Или того больше? Не очень удобно объединять их все описанными выше способами. А других встроенных функций в Excel для подобных операций не существует. С момента написания статьи Microsoft порадовал нас новыми функциями и теперь в составе функций есть функция ОБЪЕДИНИТЬ(TEXTJOIN), которая способна решить задачу без лишних телодвижений.
=ОБЪЕДИНИТЬ(«, «;ИСТИНА;A2:A100)
=TEXTJOIN(«, «,TRUE,A2:A100)
-
Разделитель(«, «) — разделитель, с которым объединять текст из указанных ячеек
Пропускать пустые(ИСТИНА) — указывает пропускать ли пустые ячейки. Т.е. если указано ИСТИНА или 1(а так же если аргумент вовсе не указан) — пустые ячейки будут пропускаться и не попадут в общую строку сцепки. Если указано ЛОЖЬ — сцепляться будут все ячейки, независимо от их содержимого. Например, если указать три ячейки A1:A3 в которых А2 пустая, то при указании ИСТИНА результат будет таким: «один, два». Если указать ЛОЖЬ, то пустая ячейка тоже попадет в сцепку: «один, , два».
Так же этот аргумент удобен, если неизвестен заранее размер диапазона сцепления. Можно указать ячейки чуть с запасом(A1:A300) и тогда сцепляться будут только ячейки заполненного диапазона.
Текст(A2:A100) — указывается непосредственно диапазон либо текст для сцепления. Этот аргумент расширяемый — т.е. можно указать не один диапазон, а несколько или просто текст: =ОБЪЕДИНИТЬ(«, «;ИСТИНА;A2:A100;B2:B70;»текст»)
Правда и здесь не все так радужно: эта функция доступна только пользователям версий 2019 и выше, а так же офиса 365.
Поэтому я написал функцию пользователя, которая сцепляет данные из указанных ячеек в одну строку и использовать её можно в любой версии офиса. Чем отличается от стандартной функции СЦЕПИТЬ()? Тем, что в качестве ячеек для сцепки указывается не каждая из ячеек по очереди, а сразу весь диапазон с возможностью указания разделителя между значениями каждой ячейки. Так же, в функции сразу заложен алгоритм пропуска пустых ячеек и возможность сцеплять исключительно уникальные значения — т.е. в результате будут сцепляться только те ячейки, значения которых ранее еще не были добавлены в сцепку.
Option Explicit '--------------------------------------------------------------------------------------- ' Procedure : СцепитьМного ' http://www.excel-vba.ru ' Purpose : Функция сцепляет все указанные ячейки в одну с указанным разделителем. ' Аргументы функции: ' Диапазон — диапазон ячеек, значения которых необходимо объединить в строку. ' Разделитель — необязательный аргумент. ' Один или несколько символов, которые будут вставлены между каждым словом. ' По умолчанию пробел. ' БезПовторов — необязательный аргумент. ' Если указан как ИСТИНА или 1 — в результирующей строке будут значения без дубликатов. ' Для английской локализации данный параметр указывается как TRUE и FALSE соответственно. '--------------------------------------------------------------------------------------- Function СцепитьМного(Диапазон As Range, Optional Разделитель As String = " ", Optional БезПовторов As Boolean = False) Dim avData, lr As Long, lc As Long, sRes As String Dim oDict As Object, sTmpStr Set oDict = CreateObject("Scripting.Dictionary") oDict.comparemode = 1 avData = Диапазон.Value If Not IsArray(avData) Then СцепитьМного = avData Exit Function End If For lc = 1 To UBound(avData, 2) For lr = 1 To UBound(avData, 1) If Len(avData(lr, lc)) Then sRes = sRes & Разделитель & avData(lr, lc) If БезПовторов Then If Not oDict.exists(avData(lr, lc)) Then oDict.Add avData(lr, lc), 0& End If End If End If Next lr Next lc If Len(sRes) Then sRes = Mid(sRes, Len(Разделитель) + 1) End If If БезПовторов Then sRes = "" sTmpStr = oDict.keys For lr = LBound(sTmpStr) To UBound(sTmpStr) sRes = sRes & IIf(sRes <> "", Разделитель, "") & sTmpStr(lr) Next lr End If СцепитьМного = sRes End Function
Чтобы правильно использовать приведенный код, необходимо сначала ознакомиться со статьей Что такое функция пользователя(UDF)?. Вкратце: скопировать текст кода выше, перейти в редактор VBA(Alt+F11) -создать стандартный модуль(Insert —Module) и в него вставить скопированный текст. После чего функцию можно будет вызвать из Диспетчера функций(Shift+F3), отыскав её в категории Определенные пользователем (User Defined Functions).
Синтаксис функции:
=СцепитьМного(A2:A100;», «;ИСТИНА)
Диапазон — диапазон ячеек, значения которых необходимо объединить в строку.
Разделитель — необязательный аргумент. Один или несколько символов, которые будут вставлены между каждым словом. По умолчанию пробел.
БезПовторов — необязательный аргумент. Если указан как ИСТИНА или 1 — в результирующей строке будут значения без дубликатов. Например, из значений Сидоров, Петров, Сидоров, Иванов в результат попадут только Сидоров, Петров, Иванов. Если ЛОЖЬ или 0 — будут выведены все значения. Для английской локализации данный параметр указывается как TRUE и FALSE соответственно.
Скачать пример
СцепитьМного.xls (52,5 KiB, 11 996 скачиваний)
Если необходимо объединять значения ячеек из «рваных»(несмежных) диапазонов(выделенных через Ctrl), то код нужно немного изменить:
Option Explicit '--------------------------------------------------------------------------------------- ' Procedure : СцепитьМного ' http://www.excel-vba.ru ' Purpose : Функция сцепляет все указанные ячейки в одну с указанным разделителем. Допускается указание несмежных диапазонов ' Аргументы функции: ' Диапазон — диапазон ячеек, значения которых необходимо объединить в строку. ' Разделитель — необязательный аргумент. ' Один или несколько символов, которые будут вставлены между каждым словом. ' По умолчанию пробел. ' БезПовторов — необязательный аргумент. ' Если указан как ИСТИНА или 1 — в результирующей строке будут значения без дубликатов. ' Для английской локализации данный параметр указывается как TRUE и FALSE соответственно. '--------------------------------------------------------------------------------------- Function СцепитьМного(диапазон As Range, Optional разделитель As String = " ", Optional БезПовторов As Boolean = False) Dim avData, lr As Long, lc As Long, sRes As String Dim ra As Range For Each ra In диапазон.Areas avData = ra.Value If Not IsArray(avData) Then ReDim avData(1 To 1, 1 To 1) avData(1, 1) = ra.Value End If For lc = 1 To UBound(avData, 2) For lr = 1 To UBound(avData, 1) If Len(avData(lr, lc)) Then sRes = sRes & разделитель & avData(lr, lc) End If Next lr Next lc Next If Len(sRes) Then sRes = Mid(sRes, Len(разделитель) + 1) End If If БезПовторов Then Dim oDict As Object, sTmpStr Set oDict = CreateObject("Scripting.Dictionary") sTmpStr = Split(sRes, разделитель) On Error Resume Next For lr = LBound(sTmpStr) To UBound(sTmpStr) oDict.Add sTmpStr(lr), sTmpStr(lr) Next lr sRes = "" sTmpStr = oDict.Keys For lr = LBound(sTmpStr) To UBound(sTmpStr) sRes = sRes & IIf(sRes <> "", разделитель, "") & sTmpStr(lr) Next lr End If СцепитьМного = sRes End Function
Однако в таком случае слегка изменится и синтаксис — такие диапазоны обязательно надо будет записывать в скобках:
Синтаксис функции:
=СцепитьМного((A2:A100;F4:F60;Y2:Z43);», «;ИСТИНА)
Иначе функция просто не сработает и выдаст ошибку #ЗНАЧ!(#VALUE!)
И еще одна реализация — в ней допускается указывать не только отдельные диапазоны, но и вообще все что угодно(ячейки, отдельный текст, числа и т.п.). Единственная проблема — в этой функции иначе организован порядок аргументов: сначала указывается разделитель, а уже потом значения для сцепления. Более подробно эта функция рассмотрена в статье Что такое функция пользователя(UDF)?. Так же эта функция не убирает дубли, что впрочем, не так сложно добавить, ориентируясь на функции выше.
Function ОбъединитьВсеСРазделителем(Разделитель As String, ParamArray Значения()) As String Dim result As String, arg, x, rc As Range For Each arg In Значения Select Case TypeName(arg) Case "Range" 'это диапазон 'цикл по всем ячейкам For Each rc In arg.Cells If result = "" Then result = rc.Value Else result = result & Разделитель & rc.Value End If Next Case "Variant()" 'это произвольный массив({"а";"б";"в"}) 'цикл по всем ячейкам For Each x In arg If result = "" Then result = x Else result = result & Разделитель & x End If Next Case Else 'это любой другой тип 'суммируем If result = "" Then result = arg Else result = result & Разделитель & arg End If End Select Next ОбъединитьВсеСРазделителем = result End Function
Также см.:
Сцепить_МН
Как сцепить несколько значений в одну ячейку по критерию? СцепитьЕсли
Что такое функция пользователя(UDF)?
Статья помогла? Поделись ссылкой с друзьями!
Видеоуроки
Поиск по меткам
Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика
Kindness Пользователь Сообщений: 201 |
Подскажите, пожалуйста, как написать правильно формулу сцепить в VBA Надо, чтобы колонтитул содержал значения нескольких ячеек удаленные друг от друга на определенное количество пробелов, например на 3 Worksheets(i).PageSetup.LeftHeader = Worksheets(1).Range(«A1″).Value+» «+Worksheets(1).Range(«A2»).Value |
Kindness Пользователь Сообщений: 201 |
Спасибо огромное. Сам так пробовал, но не написал пробелы перед и после & — сломал голову что не так! Век живи век учись!!! |
слэн Пользователь Сообщений: 5192 |
[a8] = Join(Array([a7], [b7], [c7]), «oo») |
Kindness Пользователь Сообщений: 201 |
Спасибо! Возник еще один вопрос… Можно ли сделать левый колонтитул в две строки, то есть чтобы значение ячейки А1 располагалось над значением ячейки В1 в колонтитуле? |
Kindness Пользователь Сообщений: 201 |
Может даже можно вставить в колонтитул целую таблицу? |
слэн Пользователь Сообщений: 5192 |
.LeftHeader = «a1» & Chr(10) & «b1» |
Kindness Пользователь Сообщений: 201 |
Спасибо, СЛЭН! Большое спасибо! |
Diana Пользователь Сообщений: 982 |
{quote}{login=слэн}{date=03.09.2009 03:12}{thema=}{post}[a8] = Join(Array([a7], [b7], [c7]), «oo»){/post}{/quote} Здрасьте еще раз… Спасибки всем заранее |
Можно и без цикла join(application.transpose(application.transpose([A1:AA1]))) Еще тема http://www.planetaexcel.ru/forum.php/?thread_id=17920 |
|
Diana Пользователь Сообщений: 982 |
Казанский! Чмок тебя в щечку! спасибки снова!!! |
слэн Пользователь Сообщений: 5192 |
#11 10.11.2010 11:15:20 циклом: for each x in range(..) или r=range(..) это и побыстрее чем join будет Живи и дай жить.. |
Return to VBA Code Examples
In this Article
- Concatenate Strings
- Concatenate Cells
- Concatenate Variables
- Using the & Operator with Spaces
- Using the & Operator to Concatenate a Quotation Mark
- Putting Strings on a New line
We have already gone over an introduction to string functions in our VBA Strings and Substrings Functions tutorial. We are now going to look at how to concatenate text strings.
Concatenate Strings
You can use the & operator in VBA to join text strings.
MsgBox "Merge" & "Text"
Concatenate Cells
You can also concatenate cells together. Below, we have the text strings in A1 and B1:
The following code shows you how to join text strings from cell A1 and B1 using the & operator, in cell C1:
Range("C1").Value = Range("A1").Value & Range("B1").value
The result is:
Concatenate Variables
This is the full procedure to concatenate two cells together using string variables.
Sub ConcatenateStrings()
Dim StringOne as String
Dim StringTwo as String
StringOne = Range("A1").Value
StringTwo = Range("B1").Value
Range("C1").Value = StringOne & StringTwo
End Sub
Using the & Operator with Spaces
When you want to include spaces you use & in conjunction with ” “. The following code shows you how you would include spaces:
Sub ConcatenatingStringsWithSpaces()
Dim StringOne As String
Dim StringTwo As String
Dim StringThree As String
StringOne = "This is"
StringTwo = "the text"
StringThree = StringOne & " " & StringTwo
MsgBox StringThree
End Sub
The MessageBox result is:
Using the & Operator to Concatenate a Quotation Mark
Let’s say your text string contains a quotation mark, the following code shows you how to include a quotation mark within a text string:
Sub ConcatenatingAQuotationMark()
Dim StringOne As String
Dim StringTwo As String
Dim StringThree As String
StringOne = "This is the quotation mark"
StringTwo = """"
StringThree = StringOne & " " & StringTwo
MsgBox StringThree
End Sub
The result is:
Putting Strings on a New line
Let’s say you have five text strings, you can put each text string on a new line or paragraph, using either the vbNewLine, vbCrLf, vbCr or Chr Function. The following code shows you how to put each text string on a new line:
Sub PuttingEachTextStringOnANewLine()
Dim StringOne As String
Dim StringTwo As String
Dim StringThree As String
Dim StringFour As String
Dim StringFive As String
StringOne = "This is the first string"
StringTwo = "This is the second string"
StringThree = "This is the third string"
StringFour = "This is the fourth string"
StringFive = "This is the fifth string"
MsgBox StringOne & vbNewLine & StringTwo & vbCrLf & StringThree & vbCr & StringFour & Chr(13) & StringFive
End Sub
The result is:
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
Learn More!
VBA in Excel stands for Visual Basic for Applications which is Microsoft’s programming language. To optimize the performance and reduce the time in Excel we need Macros and VBA is the tool used in the backend. Concatenation means to join two or more data into a single data. There are various ways we can perform concatenation in Excel using built-in functions, operators, etc.
Some helpful links to get more insights about concatenate and using VBA in Excel :
- Record Macros in Excel
- CONCATENATE in Excel
- How to Create a Macro in Excel?
In this article, we are going to see about concatenate operators and how to use VBA to concatenate strings as well as numbers.
Implementation :
In the Microsoft Excel tabs, select the Developer Tab. Initially, the Developer Tab may not be available.
The Developer Tab can be enabled easily by a two-step process :
- Right-click on any of the existing tabs at the top of the Excel window.
- Now select Customize the Ribbon from the pop-down menu.
- In the Excel Options Box, check the box Developer to enable it and click on OK.
- Now, the Developer Tab is visible.
Now, we need to open the Visual Basic Editor. There are two ways :
- Go to Developer and directly click on the Visual Basic tab.
- Go to the Insert tab and then click on the Command button. Drag and insert the command button in any cell of the Excel sheet.
Now, double-click on this command button. This will open the Visual Basic Application Editor tab, and we can write the code. The benefit of this command button is that just by clicking on the button we can see the result of concatenation, and also we don’t need to make any extra Macro in Excel to write the code.
Another way is by right-clicking on the command button and then select View Code as shown below :
CONCATENATE Operators:
To concatenate operator mostly used in Excel is “&” for numbers as well as strings. But for strings, we can also use “+” operator to concatenate two or more strings.
The syntax to concatenate using formula is :
cell_number1 & cell_number2 ; without space in between cell_number1 & " " & cell_number2; with space in between cell_number1 & "Any_Symbol" & cell_number2 ; with any symbol in between cell_number(s) & "string text" ; concatenate cell values and strings "string_text" & cell_number(s) ; concatenate cell values and strings
CONCATENATE Two Numbers:
Example 1: Take any two numbers as input and concatenate into a single number.
The code to concatenate two numbers in Excel is :
Private Sub CommandButton1_Click() 'Inserting the number num1 and num2 Dim num1 As Integer: num1 = 10 Dim num2 As Integer: num2 = 50 'Declare a variable c to concatenate num1 and num2 Dim c As Integer 'Concatenate the numbers c = num1 & num2 MsgBox ("The result after concatenating two numbers are: " & c) End Sub
Run the above code in VBA and the output will be shown in the message box.
Output :
The result after concatenating two numbers are: 1050
You can also click on the command button and the same message will be displayed.
Example 2: Say, now we take two numbers from the cells of the Excel Sheet and store the result back in the Excel sheet. This time we are not going to use the command button.
Step 1: Open the VB editor from the Developer Tab.
Developer -> Visual Basic -> Tools -> Macros
Step 2: The editor is now ready where we can write the code and syntax for concatenation.
Now write the following code and run it.
Sub Concatenate_Numbers() 'Taking two variables to fetch the two numbers and to store Dim num1 As Integer Dim num2 As Integer 'Fetching the numbers from Excel cells num1 from A2 and num2 from B2 num1 = Range("A2").Value num2 = Range("B2").Value 'Find the concatenate and store in cell number C2 Range("C2").Value = num1 & num2 End Sub
CONCATENATED
Concatenate Two Or more strings:
We can use either “+” operator or “&” operator.
Example 1: Let’s concatenate the strings “Geeks”, “for”, “Geeks”.
Repeat Step 1 as discussed in the previous section to create a new VBA module of name “Concatenate_Strings”
Now write either of the following codes and run it to concatenate two or more strings.
Sub Concatenate_Strings() 'Taking three variables to fetch three strings and to store Dim str1 As String Dim str2 As String Dim str3 As String 'Fetching the strings from Excel cells str1 = Range("A2").Value str2 = Range("B2").Value str3 = Range("C2").Value 'Find the concatenate and store in cell number D2 Range("D2").Value = str1 + str2 + str3 End Sub
Sub Concatenate_Strings() 'Taking three variables to fetch three strings and to store Dim str1 As String Dim str2 As String Dim str3 As String 'Fetching the strings from Excel cells str1 = Range("A2").Value str2 = Range("B2").Value str3 = Range("C2").Value 'Find the concatenate and store in cell number D2 Range("D2").Value = str1 & str2 & str3 End Sub
CONCATENATED
Example 2: Let’s concatenate three strings and add in different lines and display them in a message box this time.
Create a new module and write the code. The keyword used for adding the string in the next line is vbNewLine.
The code is :
Sub Concatenate_DifferentLines() 'Taking three variables to store Dim str1 As String Dim str2 As String Dim str3 As String 'Initialize the strings str1 = "The best platform to learn any programming is" str2 = "none other than GeeksforGeeks" str3 = "Join today for best contents" 'Display the concatenated result in a message box MsgBox (str1 & vbNewLine & str2 & vbNewLine & str3) End Sub
Example 3: Let’s concatenate two strings with space in between by taking an example of the full name of a person which contains First Name and Last Name.
Create a new module Concatenate_Strings_Space and write the following code :
Sub Concatenate_Strings_Space() 'Taking two variables to fetch two strings and to store Dim fname As String Dim lname As String 'Fetching the strings from Excel cells fname = Range("A2").Value lname = Range("B2").Value 'Find the concatenate and store in cell number C2 Range("C2").Value = fname & " " & lname End Sub
amix_6 0 / 0 / 0 Регистрация: 31.01.2016 Сообщений: 16 |
||||
1 |
||||
Сцепить диапазон по столбцам31.03.2018, 15:42. Показов 3420. Ответов 6 Метки нет (Все метки)
Добрый день! Подскажите, пожалуйста, как сцепить диапазон ячеек по столбцам (вертикально). В интернете нашла отличный вариант через vba, но в нем только построчно. Excel 2013
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
31.03.2018, 15:42 |
6 |
Заблокирован |
||||
31.03.2018, 17:36 |
2 |
|||
Сообщение было отмечено amix_6 как решение Решениеamix_6, попробуйте —
1 |
0 / 0 / 0 Регистрация: 31.01.2016 Сообщений: 16 |
|
01.04.2018, 10:45 [ТС] |
3 |
Спасибо огромное, это то что надо!
0 |
Аксима 6076 / 1320 / 195 Регистрация: 12.12.2012 Сообщений: 1,023 |
||||
01.04.2018, 11:38 |
4 |
|||
Улучшил предложенную выше функцию: теперь в ее параметрах можно задавать отдельно разделитель строк и отдельно — разделитель столбцов.
С уважением,
1 |
0 / 0 / 0 Регистрация: 31.01.2016 Сообщений: 16 |
|
01.04.2018, 11:55 [ТС] |
5 |
Здравствуйте. Здорово Спасибо огромное! Правда если ячейка пустая разделитель все равно ставится.
0 |
Аксима 6076 / 1320 / 195 Регистрация: 12.12.2012 Сообщений: 1,023 |
||||||||||||
01.04.2018, 17:55 |
6 |
|||||||||||
Сообщение было отмечено amix_6 как решение Решение
если ячейка пустая разделитель все равно ставится Если это вам не нравится, то предлагаю такой вариант:
Правда, для меня загадка, как в таком случае вы будете различать массивы:
и
поскольку результат для них будет одинаковым — «1; 1; 1».
1 |
0 / 0 / 0 Регистрация: 31.01.2016 Сообщений: 16 |
|
02.04.2018, 09:21 [ТС] |
7 |
Спасибо огромное! Последний вариант для меня подошел идеально, тк в моем случае не бывает пустых столбцов между заполненными, данные заносятся подряд.
0 |