Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 3.00/1: Рейтинг темы: голосов - 1, средняя оценка - 3.00
0 / 0 / 0
Регистрация: 27.03.2025
Сообщений: 17
Excel

Макрос для объединения ячеек на основании данных других столбцов

27.03.2025, 21:24. Показов 4094. Ответов 32

Студворк — интернет-сервис помощи студентам
Добрый день.
Подскажите пожалуйста, 2 день мучаюсь.
Есть Excel Файл в котором уже есть макрос для вставки данных. (проба) Он из формы для заполнения переносит данные в базу оценки рисков. Но не в тот вид который мне нужно.
Есть 2 столбца R и S куда вставляется не 1 строчка а несколько ( так сделано в форме)
И после того как произойдет вставка, мне нужно чтобы на количество вставленных строчек из формы, остальные столбцы объединялись в одну ячейку (Объединение ячеек) Как написать такой код в Vba?
Файл прилагаю с примером
У меня получается как в примере 1 (фото)
А нужно как в примере 2 ( фото)
Я заранее, очень благодарен за помощь.
Много перерыл тем за 2 дня, но везде всё не то.
Миниатюры
Макрос для объединения ячеек на основании данных других столбцов   Макрос для объединения ячеек на основании данных других столбцов  
Вложения
Тип файла: zip ОР 2025.zip (71.6 Кб, 29 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.03.2025, 21:24
Ответы с готовыми решениями:

Макрос: значения ячеек в зависимости от значений других ячеек
помогите с макросами значений ячеек в зависимости от значений ячеек в других столбцах в примере показано как нужно

Макрос объединения ячеек
Добрый вечер! Нужна помощь, необходим макрос который будет объединять строки при условии, что слева уже имеется объединенный блок...

Макрос объединения всех столбцов, содержащих данные об адресе, в один
помогите пожалуйста очень нужно макрос объединения всех столбцов, содержащих данные об адресе в один. Результирующие данные проставить в...

32
Одесса - Украина
 Аватар для MikeVol
530 / 207 / 71
Регистрация: 01.04.2020
Сообщений: 629
01.04.2025, 14:21
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Sergey_Kud Посмотреть сообщение
чтобы было объединение
Дали вам вариант в #13 посте.
Цитата Сообщение от Sergey_Kud Посмотреть сообщение
чтобы каждое значение было отдельной строкой
Чем не подходит вам решение без объединения ячеек из #14 поста?
Миниатюры
Макрос для объединения ячеек на основании данных других столбцов  
0
0 / 0 / 0
Регистрация: 27.03.2025
Сообщений: 17
03.04.2025, 16:49  [ТС]
Меня не устроил ответ из 13 сообщения тем, что там надо в ручную прописывать номера столбцов и строк, а мне нужно чтобы excel сам понимал это в зависимости от количества вставленных строк в столбцы QRS
0
Одесса - Украина
 Аватар для MikeVol
530 / 207 / 71
Регистрация: 01.04.2020
Сообщений: 629
05.04.2025, 09:42
Sergey_Kud, Я вас спрашивал и ещё за #14 пост, без объединнёных ячеек. Нормальное решение же.
0
0 / 0 / 0
Регистрация: 27.03.2025
Сообщений: 17
05.04.2025, 18:49  [ТС]
Да, я смотрел.
Он объединяет просто значения из нескольких ячеек в одну ячейку, без объединения.
Но, мне не нужно чтобы он объединял данные в столбцах R и S. А в остальных нужно.
0
0 / 0 / 0
Регистрация: 27.03.2025
Сообщений: 17
10.04.2025, 09:25  [ТС]
Коллеги, мастера VBA, поможете с этим?)

Добавлено через 1 час 57 минут
Что в этом макросе не так?


Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Dim iStartRow%, iEndRow%, iVal%
Dim objWS As Worksheet
Const istartColumn% = 2 ' Ñî ñòîëáöà "B"
Const iEndColumn% = 17   ' Ïî ñòîëáåö "I"
Const istartColumn1 = 20
Const iEndColumn2 = 37
 
 
    iStartRow = 11 ' Ñî ñòðîêè 11
    iEndRow = 13   ' Ïî  ñòðîêó 13
    Set objWS = ThisWorkbook.Worksheets(4) '"áàçà îöåíêè ðèñêîâ"
    
    For iVal = istartColumn To iEndColumn
    For ival1 = istartColumn1 To iEndColumn2
        objWS.Range(objWS.Cells(iStartRow, iVal), objWS.Cells(iEndRow, iVal)).Merge
        objWS.Range(objWS.Cells(iStartRow, ival1), objWS.Cells(iEndRow, ival1)).Merge
    Next iVal
    Set objWS = Nothing
0
Часто онлайн
 Аватар для КостяФедореев
987 / 637 / 280
Регистрация: 09.01.2017
Сообщений: 2,080
10.04.2025, 10:03
Sergey_Kud, как минимум не хватает
Visual Basic
1
next ival1
0
0 / 0 / 0
Регистрация: 27.03.2025
Сообщений: 17
10.04.2025, 13:01  [ТС]
Добавил. Теперь вот такая ошибка:
Миниатюры
Макрос для объединения ячеек на основании данных других столбцов  
0
Часто онлайн
 Аватар для КостяФедореев
987 / 637 / 280
Регистрация: 09.01.2017
Сообщений: 2,080
10.04.2025, 13:04
Sergey_Kud,
Visual Basic
1
2
3
4
5
6
 For iVal = istartColumn To iEndColumn
    For ival1 = istartColumn1 To iEndColumn2
        objWS.Range(objWS.Cells(iStartRow, iVal), objWS.Cells(iEndRow, iVal)).Merge
        objWS.Range(objWS.Cells(iStartRow, ival1), objWS.Cells(iEndRow, ival1)).Merge
    Next iVal1
Next iVal
Добавлено через 32 секунды
Порядок for и next не верный
0
0 / 0 / 0
Регистрация: 27.03.2025
Сообщений: 17
10.04.2025, 13:56  [ТС]
поправил спасибо.
Теперь ошибка в другом месте....
Миниатюры
Макрос для объединения ячеек на основании данных других столбцов  
0
Одесса - Украина
 Аватар для MikeVol
530 / 207 / 71
Регистрация: 01.04.2020
Сообщений: 629
10.04.2025, 20:20
Sergey_Kud, ...из той-же серии... Вы пытаетесь вставить скопирвоанные данные в объединённую ячеейку, вот тут и ошибка данная у вас выскакивате. Всё никак вы не хотите отказатся от них, а зря.
0
Модератор
Эксперт MS Access
 Аватар для shanemac51
12512 / 5086 / 814
Регистрация: 07.08.2010
Сообщений: 14,971
Записей в блоге: 4
11.04.2025, 14:13
Цитата Сообщение от MikeVol Посмотреть сообщение
Вы пытаетесь вставить скопированные данные в объединённую ячейку
я бы тоже отказалась
- от объединенных ячеек
- от очистки листа ввода после переписи в сводный лист, мало ли потребуются корректировки
- видимо разделила бы свод на 2 листа(по ширине экрана)

уж слишком тяжко вводить данные, супер мелко
Миниатюры
Макрос для объединения ячеек на основании данных других столбцов   Макрос для объединения ячеек на основании данных других столбцов  
1
0 / 0 / 0
Регистрация: 27.03.2025
Сообщений: 17
14.04.2025, 08:38  [ТС]
Всем привет.
Большое спасибо за комментарии по формату, с этим я разберусь)
Я не хочу отказываться от объединённых ячеек, т.к. в столбце предупреждающие и смягчающие действия, может быть много текста, а в сути меры только либо смягчение либо предупреждение.
В итоге если эти все моменты объединить в 1 ячейку, получится просто каша.
Поэтому эти столбцы объединять не нужно.
Если не объединять остальные столбцы согласно наполнению столбцов с действиями и сутью мер, то получатся большие пробелы во всех остальных столбцах, что будет смотрется так же не информативно.
Поэтому еще раз прошу помочь сделать так, как выше я написал.
Сможете помочь?
0
Одесса - Украина
 Аватар для MikeVol
530 / 207 / 71
Регистрация: 01.04.2020
Сообщений: 629
14.04.2025, 09:14
Sergey_Kud, А зря, вот код
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
Option Explicit
 
Sub Проба_v1()
    Dim lastRow As Long, col As Long, i As Long
    Dim rCell As Range, cell As Range
 
    Dim wsSource    As Worksheet
    Set wsSource = ThisWorkbook.Worksheets("Форма для заполнения")
 
    With Application
        .ScreenUpdating = False
        .DisplayAlerts = False
 
        With ThisWorkbook.Worksheets("база оценки рисков")
 
            Dim copyRanges As Variant, targetCols As Variant
            copyRanges = Array("C5", "D5", "F5", "C8", "F8", "C13", "F13", "C16", "B28", "D28", "F28", "C34:C46", "D34:D46", "B50", "D50", "F50", "B58", "D58", "F58")
            targetCols = Array(3, 4, 27, 5, 6, 7, 8, 9, 10, 12, 14, 18, 19, 20, 22, 24, 30, 32, 34)
 
            Dim textQ As String
            textQ = ""
 
            For Each cell In wsSource.Range("F16:F24")
 
                If cell.Value <> "" Then
                    textQ = textQ & cell.Value & vbCrLf
                End If
 
            Next cell
 
            If Len(textQ) > 0 Then
                textQ = Left(textQ, Len(textQ) - Len(vbCrLf))
            End If
 
            '            Debug.Print textQ
 
            Dim rng As Range
            Set rng = wsSource.Range("C34:C46")
 
            Dim rowCount As Long
            rowCount = Application.WorksheetFunction.CountA(rng)
            If rowCount = 0 Then Exit Sub
 
            Dim Mergecell As Range
            Set Mergecell = .Range("C7:C" & .Cells(.Rows.Count, "C").End(xlUp).Row)
 
            Dim iMergecell As Boolean
            iMergecell = False
 
            For Each cell In Mergecell
 
                If cell.MergeCells Then
                    iMergecell = True
                    Exit For
                End If
 
            Next cell
 
            For i = LBound(copyRanges) To UBound(copyRanges)
                wsSource.Range(copyRanges(i)).Copy
 
                If iMergecell Then
                    Dim resultCell As Range
 
                    lastRow = .Cells(.Rows.Count, targetCols(i)).End(xlUp).Row
                    Set cell = .Cells(lastRow, targetCols(i))
 
                    If cell.MergeCells Then
                        Set resultCell = cell.MergeArea.Cells(cell.MergeArea.Cells.Count)
                    Else
                        Set resultCell = cell
                    End If
 
                    lastRow = resultCell.Row + 1
                Else
                    lastRow = .Cells(.Rows.Count, targetCols(i)).End(xlUp).Row + 1
                End If
 
                If iMergecell And i = 12 Or i = 13 Then
                    lastRow = lastRow
                End If
 
                .Cells(lastRow, targetCols(i)).PasteSpecial Paste:=xlPasteValues
                '        Debug.Print "target Column is: " & targetCols(i)
            Next i
 
            If Application.WorksheetFunction.CountA(rng) > 1 Then
                '                Debug.Print "В диапазоне больше одного значения"
 
                Dim insertRow As Long
                insertRow = .Cells(.Rows.Count, "T").End(xlUp).Row
                '                Debug.Print insertRow
 
                .Range(.Cells(insertRow, 2), .Cells(insertRow + rowCount - 2, 16)).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
                .Range(.Cells(insertRow, 20), .Cells(insertRow + rowCount - 2, 36)).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
 
                For col = 2 To 16
                    '                    Debug.Print "target Column is: " & Cells(1, col).Address
 
                    With .Range(.Cells(insertRow, col), .Cells(insertRow + rowCount - 1, col))
                        .Merge
                        .HorizontalAlignment = xlCenter
                        .VerticalAlignment = xlCenter
                    End With
 
                Next col
 
                For col = 17 To 17
 
                    With .Range(.Cells(insertRow, col), .Cells(insertRow + rowCount - 1, col))
                        .Merge
                        .Value = textQ
                        .HorizontalAlignment = xlCenter
                        .VerticalAlignment = xlCenter
                    End With
 
                Next col
 
                For col = 20 To 36
 
                    With .Range(.Cells(insertRow, col), .Cells(insertRow + rowCount - 1, col))
                        .Merge
                        .HorizontalAlignment = xlCenter
                        .VerticalAlignment = xlCenter
                    End With
 
                Next col
 
            Else
                '                Debug.Print "В диапазоне одно или нет значений"
 
                For col = 17 To 17
                    insertRow = .Cells(.Rows.Count, "R").End(xlUp).Row
                    '                    Debug.Print insertRow
 
                    With .Range(.Cells(insertRow, col), .Cells(insertRow + rowCount - 1, col))
                        '                        Debug.Print "insert Row is: " & insertRow
 
                        .Value = textQ
                        .HorizontalAlignment = xlCenter
                        .VerticalAlignment = xlCenter
                    End With
 
                Next col
            End If
 
            Set rng = Nothing
        End With
 
        Set wsSource = Nothing
        .CutCopyMode = False
        .DisplayAlerts = True
        .ScreenUpdating = True
    End With
 
End Sub
но чувствую что вы будете нашим постоянным клиентом с этими объединёнными ячейками и с этим же проэктом. Удачи.
P.S. Топорный макрос получился, может кто вам его и оптимизирует или новый напишит.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.04.2025, 09:14

Макрос объединения столбцов Excel
доброго времени суток форумчане помогите пожалуйста очень нужно макрос объединения всех столбцов, содержащих данные об адресе в один....

Макрос объединения столбцов Excel
доброго времени суток форумчане помогите пожалуйста очень нужно макрос объединения всех столбцов, содержащих данные об адресе в один....

Макрос снятия объединение ячеек БЕЗ заполения всех разъединенных ячеек значением, которое было в объединенной ячейке
Ребят нужен МАКРОС,который вернет прежнее состояние объединенных ячеек в исходный вид. Без заполнения всех разъединенных ячеек ...

Объединение ячеек одного столбца при совпадении ячеек в другом
Здравствуйте, В таблице необходимо объединить все телефоны в одну ячейку, если совпадение по сайту или по названию+адрес Стороку с...

Макрос выделения диапазона ячеек-объединение их в одну-переход на след.строку-повтор пред.действия
Добрый день. Помогите плиз решить задачу. Я с VBA столкнулся впервые 1) в строке необходимо объединить диапазон ячеек (в каждой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru