Страницы: 1 2 След.
RSS
Объединение значений нескольких столбцов в один столбец с помощью макроса
 
Подскажите,
как объединить значения нескольких столбцов в один столбец (первый) с помощью макроса. Все находится на одном листе.
Файл прикрепил.
Спасибо)
 
Ну вот опять. Что значит "объединить"? И почему с "помощью макроса"? Может достаточно СЦЕПИТЬ() или & ? Покажите в файле желаемый результат
Согласие есть продукт при полном непротивлении сторон
 
Вот так должно получиться. Файл прикрепил.
Т.е. данные второго столбца помещаются в конец 1го столбца, данные 3го в конец первого, и т.д. Все выстраиваются в один столбик.
Макрос создает столбцы. Как их формулой скрепить в этом процессе?
 
Здравствуйте! Если формулами, то примерно так (два синих столбца сцеплены в зеленом) - тема здесь
 
Макросом
Код
Sub Perenos()
Dim j As Integer
Dim iLR_A As Long
Dim iLastRow
  For j = 2 To 5
    iLR_A = Cells(Rows.Count, "A").End(xlUp).Row + 1
    iLastRow = Cells(Rows.Count, j).End(xlUp).Row
    Range(Cells(1, j), Cells(iLastRow, j)).Cut Cells(iLR_A, 1)
  Next
  iLR_A = Cells(Rows.Count, "A").End(xlUp).Row
  For j = iLR_A To 1 Step -1
    If IsEmpty(Cells(j, 1)) Then Rows(j).Delete
  Next
End Sub
 
Спасибо. Глюк какой то.
Кнопка макроса мерцает.
Жмешь Esc, вылетает ошибка: Метод Delete из класса Range завершен неверно.
И подсвечивается строка If IsEmpty(Cells(j, 1)) Then Rows(j).Delete                       Подсвечивается (Rows(j).Delete)
Что исправлять?
 
См. вариант.
Изменено: Мотя - 09.01.2017 13:14:52
 
Можно существенно проще:
Код
Sub Collect()
    Dim i As Long, j As Long, a(), b()
    Application.ScreenUpdating = False
    a = ActiveSheet.UsedRange.Value: Cells.Clear
    For i = 1 To UBound(a, 2)
        j = Cells(Rows.Count, 1).End(xlUp).Row + 1
        b = Application.Index(a, 0, i)
        Cells(j, 1).Resize(UBound(b)).Value = b
    Next
    Columns(1).SpecialCells(4).Delete xlUp
End Sub
Пример во вложении.
Изменено: SAS888 - 09.01.2017 06:35:30
Чем шире угол зрения, тем он тупее.
 
Здравствуйте. Подскажите пожалуйста в чем ошибка?
Код
Sub Макрос1()

Dim cell As Range
    For Each cell In Range("BG1:BG" & Cells(Rows.Count, "A").End(xlUp).Row) ' Указываю диапазон в котором нужно получить значения
    
Range("[@[Fk_Project]],[@Договор],,"" "",[@[Договор номер]").Merge ' Указываю в диапазон колонки умной таблицы для объединения
  
   Next cell

End Sub
 
Объединение ячеек внутри умной таблицы
 
Цитата
Andreybukh написал: Подскажите пожалуйста в чем ошибка?
В отсутствии смыслового вопроса. Что делает Ваш макрос?
Andreybukh, файл-пример(Excel) приложите. Как есть - Как надо.
Согласие есть продукт при полном непротивлении сторон
 
Я извиняюсь.
Я хотел сделать конкатинацию нескольких столбцов умной таблицы и перепутал метод!
Мне по сути нужно объединить несколько столбцов умной таблицы.
:D  
Изменено: Andreybukh - 11.06.2025 15:18:07
 
Цитата
Sanja написал:
Andreybukh , файл-пример(Excel) приложите. Как есть - Как надо.
Согласие есть продукт при полном непротивлении сторон
 
:)  
 
Дочитался до того что нужно создать объект и обратиться к его методам, но дальше не понимаю как указать что нужно соединить колонки умной таблицы
Код
Sub ConcatColuvns()
    Dim wSh As Worksheet
    Dim tbl As ListObject
    
    Set wSh = Sheets("Договоры")
    Set tbl = wSh.ListObjects("Договоры")


End Sub
 
Потестируйте
Скрытый текст

The VBA Guide To ListObject Excel Tables
Согласие есть продукт при полном непротивлении сторон
 
Работает!
Это конечно сложно пока для меня, спасибо!
А если нужно соединить колонки по имени, которые идут не по очереди?
Есть какая то логика типа:
Объявляем объект "Умная таблица"
Указываем Range колонок с которыми хотим совершить действие
Показываем что хотим просмотреть в них все от первой строки (без заголовков), до последней
и далее либо перенести в коллекцию и потом последовательно достать соединяя, либо сразу указать на объединение ячеек каждого номера строк
 
эта строка
Код
arr = iTbl.DataBodyRange.Value

забирает ВСЕ данные из Умной таблицы (без заголовков и строки итогов) в массив.
Дальше разбирайте/объединяйте/удаляйте данные из него как Вам нужно
Согласие есть продукт при полном непротивлении сторон
 
Подскажите пожалуйста.
в этом решении использован метод Add (.ListColumns.Add)
а есть возможность использовать update?
Мне бы хотелось что бы столбец не добавлялся, а обновлялся.
У меня статично привязаны к расположению и обновление нужно всегда в одном диапазоне.
 
Цитата
Andreybukh написал: в этом решении использован метод Add (.ListColumns.Add)
Если у Вас уже есть столбец с объединением, то просто удалите эту строку. Объединение будет вставляться в крайний правый столбец. Если нужен другой столбец то
Код
   lClmn = .ListColumns.Count  'последний правый
  lClmn = 5 'пятый столбец
Согласие есть продукт при полном непротивлении сторон
 
У меня аналог базы данных по договорам и их свойствам.
Крайний столбец у меня используется для дальнейшего переименования файлов PDF.
Логика такая:
Есть реквизиты договора, есть Ваш макрос, который фиксирует в в столбце будущее название файла.
Далее, через регулярки я заменяю знаки которые запрещены в именах файловой системы виндовс (/," итд)
Далее регулярка убирает лишние пробелы
Далее макрос переименования файлов (старое название в одном столбце, новое в столбце где мы объединяем название.
Поэтому обновление всегда должно быть в одном столбце.

Я мыслю языком SQL и всегда процесс представляю более линейно без творчества.
Указываем столбец в нашем случае ("Объединить")
ЧТо делаем в этом диапазоне? Чистим если там есть данные и заполняем конкотинацией.

Или сразу производим Update при каждом выполнении макроса вне зависимости от данных.
Код
Перед выполнением Регулярок будет Ваш макрос
Тогда после того ка появились нове договоры или обновили старые, мы получим в столбце BG актуальные данные;
Далее обработаем их RegExp для того что бы потом переименовать их под хранение на серваке.
Потом получим их ссылку и прикрепим к названию файла.
В итоге юзер открывая файл эксель, получит и реестр договоров и ссылку на сервер данных где этот договор лежит.

Поэтому мне обязательно нужно обновлять столбец данных.
А я пока вижу только ListObject только методы ADD? Application, Count, ...
Update не нахожу.


Sub ReplaceVWithGInColumn()
    Dim regEx As Object
    Dim cell As Range
    Dim originalText As String
    Dim resultText As String
    
    Set regEx = CreateObject("VBScript.RegExp")
    regEx.Pattern = "[«»]"
    regEx.Global = True
    
    For Each cell In Range("BG1:BG" & Cells(Rows.Count, "A").End(xlUp).Row)
        If Not IsEmpty(cell.Value) Then
            originalText = cell.Value
            resultText = regEx.Replace(originalText, "")
            cell.Value = resultText
        End If
    Next cell
End Sub
Sub ReplaceVWithGInColumn1()
    Dim regEx As Object
    Dim cell As Range
    Dim originalText As String
    Dim resultText As String
    
    Set regEx = CreateObject("VBScript.RegExp")
    regEx.Pattern = "[/]"
    regEx.Global = True
    
    For Each cell In Range("BG1:BG" & Cells(Rows.Count, "A").End(xlUp).Row)
        If Not IsEmpty(cell.Value) Then
            originalText = cell.Value
            resultText = regEx.Replace(originalText, "_")
            cell.Value = resultText
        End If
    Next cell
End Sub
Sub ReplaceVWithGInColumn2()
    Dim regEx As Object
    Dim cell As Range
    Dim originalText As String
    Dim resultText As String
    
    Set regEx = CreateObject("VBScript.RegExp")
    regEx.Pattern = "\s{2,}"
    regEx.Global = True
    
    For Each cell In Range("BG1:BG" & Cells(Rows.Count, "A").End(xlUp).Row)
        If Not IsEmpty(cell.Value) Then
            originalText = cell.Value
            resultText = regEx.Replace(originalText, " ")
            cell.Value = resultText
        End If
    Next cell
End Sub

Sub ReplaceVWithGInColumn3()
    Dim regEx As Object
    Dim cell As Range
    Dim originalText As String
    Dim resultText As String
    
    Set regEx = CreateObject("VBScript.RegExp")
    regEx.Pattern = "^\s+"
    regEx.Global = True
    
    For Each cell In Range("BG1:BG" & Cells(Rows.Count, "A").End(xlUp).Row)
        If Not IsEmpty(cell.Value) Then
            originalText = cell.Value
            resultText = regEx.Replace(originalText, "")
            cell.Value = resultText
        End If
    Next cell
End Sub

Sub Reg()
Call ReplaceVWithGInColumn
Call ReplaceVWithGInColumn1
Call ReplaceVWithGInColumn2
Call ReplaceVWithGInColumn3
End Sub
 
Думаю что можно Вашу логику использовать и просто всегда перед выполнением макроса выполнять макрос который удалит крайний столбец, а потом уже он появится при выполнении макроса конкотинации, может это даже оптимальнее когда не знаешь где буте фиксированная граница данных. Надо думать.
 
Здравствуйте, подскажите пожалуйста, а как можно в этом макросе:
Код
Sub Perenos()
Dim j As Integer
Dim iLR_A As Long
Dim iLastRow
  For j = 2 To 5
    iLR_A = Cells(Rows.Count, "A").End(xlUp).Row + 1
    iLastRow = Cells(Rows.Count, j).End(xlUp).Row
    Range(Cells(1, j), Cells(iLastRow, j)).Cut Cells(iLR_A, 1)
  Next
  iLR_A = Cells(Rows.Count, "A").End(xlUp).Row
  For j = iLR_A To 1 Step -1
    If IsEmpty(Cells(j, 1)) Then Rows(j).Delete
  Next
End Sub
собрать не со 2-ой столбец по 5-ый, а конкретно 2 и 4, и собрать их в столбце "D"? Очень нужно подскажите! Ну или может другой есть макрос. Только не формулой

Изменено: Voltz - 16.06.2025 09:16:42
 
Voltz, файл-пример приложите. Как есть - как надо
Согласие есть продукт при полном непротивлении сторон
 
Цитата
написал:
а как можно в этом макросе:
Если именно "в этом макросе", то можно так:
Код
Sub Perenos()
Const D = "D"
Dim j As Variant
Dim iLR_A As Long
Dim iLastRow As Long
  For Each j In Array(2, 4)
    iLR_A = Cells(Rows.Count, D).End(xlUp).Row + 1
    iLastRow = Cells(Rows.Count, j).End(xlUp).Row
    Range(Cells(1, j), Cells(iLastRow, j)).Cut Cells(iLR_A, D)
  Next
  iLR_A = Cells(Rows.Count, D).End(xlUp).Row
  For j = iLR_A To 1 Step -1
    If IsEmpty(Cells(j, D)) Then Rows(j).Delete
  Next
End Sub
 
Sanja, здравствуйте вот пример, код предоставил МатросНаЗебре, за что спасибо:
Код
Sub Perenos()
Const H = "H"
Dim j As Variant
Dim iLR_A As Long
Dim iLastRow As Long
  For Each j In Array(2, 4)
    iLR_A = Cells(Rows.Count, H).End(xlUp).Row + 1
    iLastRow = Cells(Rows.Count, j).End(xlUp).Row
    Range(Cells(1, j), Cells(iLastRow, j)).Cut Cells(iLR_A, H)
  Next
  iLR_A = Cells(Rows.Count, H).End(xlUp).Row
  For j = iLR_A To 1 Step -1
    If IsEmpty(Cells(j, H)) Then Rows(j).Delete
  Next
End Sub
Тут столбцы только поменял. Единственное можно подправить, чтобы столбцы копировались, и первая строка не удалялась. А так код работает, как надо
 
Код
Sub Perenos()
Const H = "H"
Dim j As Variant
Dim iLR_A As Long
Dim iLastRow As Long
  For Each j In Array(2, 4)
    iLR_A = Cells(Rows.Count, H).End(xlUp).Row + 1
    iLastRow = Cells(Rows.Count, j).End(xlUp).Row
    Range(Cells(1, j), Cells(iLastRow, j)).Copy Cells(iLR_A, H)
  Next
  iLR_A = Cells(Rows.Count, H).End(xlUp).Row
  For j = iLR_A To 2 Step -1
    If IsEmpty(Cells(j, H)) Then Cells(j, H).Delete
  Next
End Sub
- диапазоны копируются. Слово .Copy тут "Range(Cells(1, j), Cells(iLastRow, j)).Copy Cells(iLR_A, H)"
- первая строка не удаляется. 2 тут "For j = iLR_A To 2 Step -1"
 
МатросНаЗебре, спасибо Вашу помощь. Единственное можно, чтобы при переносе в столбец сохранялись ссылки на ячейки в формуле "B24", ну это например как, в предыдущем Вашем примере или вставлялись, значения? А так огромнейшее спасибо!!!
 
С сохранением формул.
Код
Sub Perenos()
Const H = "H"
Dim j As Variant
Dim iLR_A As Long
Dim iLastRow As Long
  For Each j In Array(2, 4)
    iLR_A = Cells(Rows.Count, H).End(xlUp).Row + 1
    iLastRow = Cells(Rows.Count, j).End(xlUp).Row
    Range(Cells(1, j), Cells(iLastRow, j)).Copy Cells(iLR_A, H)
    Cells(iLR_A, H).Resize(iLastRow).Formula = Range(Cells(1, j), Cells(iLastRow, j)).Formula
  Next
  iLR_A = Cells(Rows.Count, H).End(xlUp).Row
  For j = iLR_A To 2 Step -1
    If IsEmpty(Cells(j, H)) Then Cells(j, H).Delete
  Next
End Sub
 
Только значения.
Код
Sub Perenos()
Const H = "H"
Dim j As Variant
Dim iLR_A As Long
Dim iLastRow As Long
  For Each j In Array(2, 4)
    iLR_A = Cells(Rows.Count, H).End(xlUp).Row + 1
    iLastRow = Cells(Rows.Count, j).End(xlUp).Row
    Range(Cells(1, j), Cells(iLastRow, j)).Copy Cells(iLR_A, H)
    Cells(iLR_A, H).Resize(iLastRow).Value = Range(Cells(1, j), Cells(iLastRow, j)).Value
  Next
  iLR_A = Cells(Rows.Count, H).End(xlUp).Row
  For j = iLR_A To 2 Step -1
    If IsEmpty(Cells(j, H)) Then Cells(j, H).Delete
  Next
End Sub
Страницы: 1 2 След.
Читают тему
Наверх