Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/34: Рейтинг темы: голосов - 34, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 01.03.2013
Сообщений: 7
1
Excel

Объединение ячеек при вставке в разных диапазонах

01.03.2013, 14:02. Показов 6911. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Нужна помощь при создании макроса...
Дано 3 столбца, как объединить ячейки с одинаковыми значениями при помощи макроса при вставке (чтобы не приводило к потере информации) в данных диапазонах (например столбцы С1:С50, К1:к50, Н1:н50)...

Вот код, но он не до конца работает, только по стлобцу А и принажатии вручную макроса
Visual Basic
1
2
3
4
5
6
7
8
9
10
Sub qq()
    Dim i As Integer, x As Range: Set x = [A1]
    Application.ScreenUpdating = False: Application.DisplayAlerts = False
    For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
        If x.Cells(1, 1) = Cells(i, 1) Then
            Set x = Union(x, Cells(i, 1)): x.Merge
        Else: Set x = Cells(i, 1)
        End If
    Next
End Sub
Я только учусь...Много пересмотрела кодов, но они не подходили.... и как это точно сделать не знаю, пожалуйста можете исправить этот код или что надо добавить?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.03.2013, 14:02
Ответы с готовыми решениями:

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

Объединение содержимого нескольких ячеек при различных условиях
Excel Т.е. мне должны предоставить документы (список документов - 1-й столбец) 2-й столбец -...

Объединение содержимого ячеек в одну при нескольких условиях
Доброго времени суток, Уважаемые. Подскажите, пожалуйста, как с помощью формулы решить задачу по...

Создать макрос для рабочей книги MS Excel, позволяющий формировать значения в диапазонах ячеек
Помогите пожалуйста, я начинающий пр. мне очень трудно решать 1. Создать макрос для рабочей книги...

13
0 / 0 / 0
Регистрация: 01.03.2013
Сообщений: 7
01.03.2013, 14:05  [ТС] 2
Пример Результата
Объединение ячеек при вставке в разных диапазонах
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,518
01.03.2013, 14:51 3
Цитата Сообщение от Mila_str Посмотреть сообщение
при помощи макроса при вставке
напишите на примере вашей задачи и скриншота, что подразумевается под фразой "при вставке".
0
0 / 0 / 0
Регистрация: 01.03.2013
Сообщений: 7
02.03.2013, 08:16  [ТС] 4
Цитата Сообщение от Скрипт Посмотреть сообщение
напишите на примере вашей задачи и скриншота, что подразумевается под фразой "при вставке".
При изменении или редактировании ячеек
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,518
02.03.2013, 08:31 5
Mila_str,
  1. т.е. вы вносите изменения в первые три столбца и должны происходить изменения в других трёх столбцах? Т.е. в других трёх столбцах должны ячейки заново объединяться в соответствии с новыми данными?
  2. изменения должны сразу происходить или после нажатия кнопки для вызова макроса?
0
0 / 0 / 0
Регистрация: 01.03.2013
Сообщений: 7
02.03.2013, 09:50  [ТС] 6
Цитата Сообщение от Скрипт Посмотреть сообщение
Mila_str,
  1. т.е. вы вносите изменения в первые три столбца и должны происходить изменения в других трёх столбцах? Т.е. в других трёх столбцах должны ячейки заново объединяться в соответствии с новыми данными?
  2. изменения должны сразу происходить или после нажатия кнопки для вызова макроса?
Нет, я вношу данные в столбцы А, С, К и в этих же столбцах должно происходить изменение...просто на рисунке показала в разных столбцах, чтобы было видно, что есть и как должно быть...
Изменения должны происходить также как в этом документе...
А как можно сделать так.rar
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,518
02.03.2013, 09:57 7
Mila_str, на примере выложенной книги (сообщение #6) напишите, какое вы вносите изменение и что должно произойти. Например, я вношу изменения на лист "Лист1" в ячейку "A2" и должно произойти то-то и то-то.
0
0 / 0 / 0
Регистрация: 01.03.2013
Сообщений: 7
02.03.2013, 10:49  [ТС] 8
Цитата Сообщение от Скрипт Посмотреть сообщение
Mila_str, на примере выложенной книги (сообщение #6) напишите, какое вы вносите изменение и что должно произойти. Например, я вношу изменения на лист "Лист1" в ячейку "A2" и должно произойти то-то и то-то.
Например. Изменения в "Лист1" в ячейку "А2" вношу значение 1, в "А3" вношу значение 1 ,"А4" вношу значение 1 и.т.д если в ячейка А2, А3, А4 будут одинаковые значения (т.е. 1) , то эти ячейки должны объединиться см.пример 1, а если нет, то ничего не надо делать см.пример 2
Название: 4.JPG
Просмотров: 1090

Размер: 7.0 Кб
Объединение ячеек при вставке в разных диапазонах
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,518
02.03.2013, 11:33 9
Цитата Сообщение от Mila_str Посмотреть сообщение
Дано 3 столбца, как объединить ячейки с одинаковыми значениями при помощи макроса при вставке (чтобы не приводило к потере информации)
вот эта фраза "чтобы не приводило к потере информации" что означает. Напишите на примере книги из сообщения #6.
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
02.03.2013, 20:42 10
Здрасьте. А прогнать циклом столбцы, и в него вписать что-то типа:
Visual Basic
1
2
3
4
5
Application.DisplayAlerts = False
If (Cells(1, 1).Value And Cells(2, 1).Value And Cells(3, 1).Value) = 1 Then
    Range(Cells(1, 1), Cells(3, 1)).MergeCells = True
End If
Application.DisplayAlerts = True
Не подойдет?

Добавлено через 1 час 21 минуту
Попробуйте так сделать. Хотя я, честно, не понимаю для чего обьединение. Все стараются от этого уйти, если есть возможность.
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
Sub mMergeCells()
'Будем считать, что данные в ст. "А" уже _
       отсортированые.
Dim stRow&, endRow&, mStr$, i&, j&
    For i = 1 To (ActiveSheet.UsedRange.Row - 1 + _
                        ActiveSheet.UsedRange.Rows.Count)
        stRow = 0: endRow = 0
        If Cells(i, 1).Value = Cells(i + 1, 1).Value Then stRow = i
        mStr = Cells(i, 1).Value
        Do
            If Cells(i, 1).Value = Cells(i + 1, 1).Value Then
                endRow = i + 1
            End If
            i = i + 1
        Loop Until Cells(i, 1).Value <> mStr
        Application.DisplayAlerts = False
            If stRow > 0 And endRow > 0 Then
                With Range(Cells(stRow, 1), Cells(endRow, 1))
                    .HorizontalAlignment = xlCenter
                    .VerticalAlignment = xlCenter
                    .MergeCells = True
                    i = endRow + 1
                End With
            End If
        Application.DisplayAlerts = True
        i = endRow
    Next 'i
End Sub
0
0 / 0 / 0
Регистрация: 01.03.2013
Сообщений: 7
04.03.2013, 10:21  [ТС] 11
Igor_Tr, Здравствуйте! Я так поняла, что этот код только считает по столбцу А? и что-то он у меня зависает..когда я его прогоняю...А как можно сделать не по одному столбцу?
У меня данные заполняются построчно, данные уже упорядочены...и известно, что в столбцах А, С, Е и Н должны объединяться ячейки с одинаковыми значениями (например при нажатии клавиши enter), хотя нужно чтобы срабатывало это автоматически.....
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
04.03.2013, 13:59 12
Замените вот эти две строки
If Cells(i, 1).Value = Cells(i + 1, 1).Value Then stRow = i
mStr = Cells(i, 1).Value
на следующее (так будет надежней):
Visual Basic
1
2
3
4
If Cells(i, 1).Value = Cells(i + 1, 1).Value Then
   stRow = i
    mStr = Cells(i, 1).Value
End if
На счет других столбцов. Я не понимаю четко задачу. Но в принцыпе, поступил бы следующим образом.
1. Определил по каким-то признакам (например, перебрал циклом шапку) НОМЕРА столбцов, к которым хочу применить все написанное выше (например, мне нужны ст.А, ст.С, ст.F). В даном случае это будет массив номеров 1, 3, 6.
2. Номера загнал в массив (~ arrColumn()).
3. Добавил несколько строк в мой код.
В конце выглядело б все вот так:
Visual Basic
1
2
3
4
5
6
7
8
      For j=Lbound(arrColumn) to Ubound(arrColumn) ' перебор по очереди столбцов
        For i = 1 To (ActiveSheet.UsedRange.Row - 1 + _
                        ActiveSheet.UsedRange.Rows.Count) ' перебор очередного столбца по рядам
          '!!! дальше без изменений....
          '----------------------------
          '----------------------------
        next i
     next j
И скажите, где зависает.

Добавлено через 19 минут
Подумал тут. Давайте для пробы укажем вручную номера столбцов
arrColumnn=Array(a,b,....,n) - где (a, b,...., n) реальные номера нужных Вам столбцов. Протестируйте, а дальше подумаете, как автоматизировать определение a, b,...., n
И нужны, все таки изменения (извините, на работе, дергают)
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
Sub mMergeCells()
'Будем считать, что данные в ст. "А" уже _
       отсортированые.
Dim arrColumn()
Dim stRow&, endRow&, mStr$, i&, j&
arrColumnn=Array(a,b,....,n) ' Здесь замените буквы реальными номерами
For j=lbound(arrColumn) to ubound(arrColumn)
    For i = 1 To (ActiveSheet.UsedRange.Row - 1 + _
                        ActiveSheet.UsedRange.Rows.Count)
        stRow = 0: endRow = 0
        If Cells(i, j).Value = Cells(i + 1, j).Value Then 
             stRow = i
             mStr = Cells(i, j).Value
        End if
        Do
            If Cells(i, j).Value = Cells(i + 1, j).Value Then
                endRow = i + 1
            End If
            i = i + 1
        Loop Until Cells(i, 1).Value <> mStr
        Application.DisplayAlerts = False
            If stRow > 0 And endRow > 0 Then
                With Range(Cells(stRow, j), Cells(endRow, j))
                    .HorizontalAlignment = xlCenter
                    .VerticalAlignment = xlCenter
                    .MergeCells = True
                    i = endRow + 1
                End With
            End If
        Application.DisplayAlerts = True
        i = endRow
    Next 'i
End Sub
0
0 / 0 / 0
Регистрация: 01.03.2013
Сообщений: 7
04.03.2013, 14:41  [ТС] 13
Спасибо за ответы...у меня известны номера столбцов какие надо менять так, что они постоянны, но у меня выдает ошибку я добавляла еще один Next (For without Next – Использование For без Next)...может не туда...потому, что там другие начали ошибки выходить....Как правильно изменить?

Объединение ячеек при вставке в разных диапазонах
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
04.03.2013, 15:25 14
Правильно, пропустил, потому-что пишу прямо в здесь в окне, а не в модуле. После "next i" нужно "next j"

Добавлено через 16 минут
Да, и цыклы реагируют на уставку Option base. Если Вы не выставили Option base 1, тогда цикл For j=lbound(arrColumn) to ubound(arrColumn) сразу будет ругаться. Проще всего выйти с этого так: В самом-самом верху модуля, сразу под Option Explicit (если есть), напишите Option base 1. Другими словами, индекс первого элемента массива будет не ноль (как по умолчанию), а 1. Можно оставить и установку по умолчанию, но тогда нужны доп. действия.

Добавлено через 9 минут
Вы меня сейчас УБЬЕТЕ. Все, что к Option Base - правильно. Но есть грубейшая ошибка. И вроде трезвый. Нам нужен не индекс массива arrColumn, А ЕГО ЗНАЧЕНИЕ!!!!. Т. е. arrColumn(j)
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
Sub mMergeCells()
'Будем считать, что данные в ст. "А" уже _
       отсортированые.
Dim arrColumn()
Dim stRow&, endRow&, mStr$, i&, j&
arrColumnn=Array(a,b,....,n) ' Здесь замените буквы реальными номерами
For j=lbound(arrColumn) to ubound(arrColumn)
    For i = 1 To (ActiveSheet.UsedRange.Row - 1 + _
                        ActiveSheet.UsedRange.Rows.Count)
        stRow = 0: endRow = 0
        If Cells(i, arrColumn(j)).Value = Cells(i + 1, arrColumn(j)).Value Then 
             stRow = i
             mStr = Cells(i, arrColumn(j)).Value
        End if
        Do
            If Cells(i, arrColumn(j)).Value = Cells(i + 1, arrColumn(j)).Value Then
                endRow = i + 1
            End If
            i = i + 1
        Loop Until Cells(i, arrColumn(j)).Value <> mStr
        Application.DisplayAlerts = False
            If stRow > 0 And endRow > 0 Then
                With Range(Cells(stRow, arrColumn(j)), Cells(endRow, arrColumn(j)))
                    .HorizontalAlignment = xlCenter
                    .VerticalAlignment = xlCenter
                    .MergeCells = True
                    i = endRow + 1
                End With
            End If
        Application.DisplayAlerts = True
        i = endRow
    Next 'i
Next j
End Sub
Если можете, киньте лист с Вашими несколькими столбцами, а то изобретать здесь в окне без тестировки - результат на лице.
1
04.03.2013, 15:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.03.2013, 15:25
Помогаю со студенческими работами здесь

Ошибка при сравнении значений ячеек в разных книгах
Извините может кто подскажет, столкнулся с такой проблемой. У меня выгружаются в excel программно...

Сравнение ячеек на разных страницах и копирование строки при совпадении
Здравствуйте! Помогите пожалуйста! С vba раньше ничего не связвало, а сейчас появилась огромная...

Выбрать данные из разных (конкретных) ячеек листа, произвести замену данных ячеек
Что нужно от макроса: выбрать данные из разных (конкретных) ячеек листа, произвести замену данных...

Cбор данных с разных одинаковых по смыслу, но разных по значению ячеек, книг
Суть вот в чем, идет сбор данных с разных одинаковых по смыслу, но разных по значению ячеек, книг...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru