Доброго дня, Планетяне! В последнее время частенько приходится обрабатывать такие "диапазоны", как на скрине. Помогите с макросом, пожалуйста… Откопал в закромах макрос на объединение ячеек с сохранением содержимого (оставил в файле-примере), но это не то — тут как-то нужно Selection.Areas перебирать, вроде. Запоминать содержимое первой ячейки, добавлять его, как префикс с пробелом к другим ячейкам текущей зоны, а саму ячейку-источник вместе со строкой целиком удалять. Зоны через Ctrl выделяю сам - не всегда они, как на скрине, подряд идут
Код объединения ячеек
Код
Option Explicit
Sub MultiMergeInColoumnSpace()
Dim rng As Range, cl As Range
Dim sMergeStr As Variant, delim As Variant
delim = " "
Application.DisplayAlerts = 0
For Each rng In Selection.Columns
sMergeStr = ""
For Each cl In rng.Cells
sMergeStr = sMergeStr & delim & cl.Text
Next cl
Range(rng.Cells(1, 1), rng.Cells(Selection.Rows.Count, 1)).Merge Across:=False
rng.Item(1).Value = Mid(sMergeStr, 1 + Len(delim))
Selection.UnMerge 'закомментировать, если необходимо СОХРАНИТЬ объединение
Next rng
Application.DisplayAlerts = 1
End Sub
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Если как в примере - будет трудно. Если как на скрине - будет легко. Кусок, как на скрине в примере покажите. Там строки шерстить заполненные, по пустой правой ячейке определять значение "перфикса". Ячейка не пустая - добавляем запомненный перфикс. Появилась пустая? - перфикс переписываем. А потом циклом снизу вверх удаляем строки с пустыми значениями справа. Как-то так, навскидку.
Пытливый, а почему в примере сложнее? Я же сам выделю (руками) группы через Ctrl. Если сложности с удалением ячеек-префиксов, то пофиг на них - руками удалю. Главное дописать эти префиксы в остальные ячейки группы, а то долго…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
V, да. В столбце данные идут либо как на скрине, либо как положено — полное наименование в отдельной строке. Я просматриваю глазами все данные и выделяю через CTRL вот такие области, где каждая первая ячейка области - префикс, а в остальные ячейки этой зоны этот префикс нужно добавить, после чего саму эту первую ячейку удалить вместе со строкой (EntireRow)
Пока так получается только
Код
Sub MultiMergeInColoumnWithPrefix()
Dim ar As Range, pref_cl As Range, cl As Range
Dim prefix$, delim$
delim = " "
For Each ar In Selection.Areas
Set pref_cl = ar.Item(1)
prefix = pref_cl.Value
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Как удалять ненужное допилите сами по своему вкусу
Код
Sub AddPrefix()
Dim I&, J&
For I = 1 To Selection.Areas.Count
For J = 1 To Selection.Areas(I).Cells.Count
If J > 1 Then
Selection.Areas(I).Cells(J) = Selection.Areas(I).Cells(1) & " " & Selection.Areas(I).Cells(J)
End If
Next
Selection.Areas(I).Cells(1).ClearContents
Next
End Sub
Согласие есть продукт при полном непротивлении сторон
Sanja, спасибо большое! кажется я понял принцип по вашему коду!)))) отпишусь сюда…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Я про скрин писал, поскольку там есть доп.информация в соседних ячейках (или ее там нет), т.е. есть признак, по которому можно зацепиться и обрабатывать ячейки в определенных строках. А в примере - тупо столбец и неясно как программе объяснить (без участия оператора) что есть перфикс, а что есть данные.
Sub tt()
Dim d1_ As Range
Application.ScreenUpdating = 0
Application.Calculation = xlCalculationManual
If Selection.Count < 2 Then Exit Sub
For Each d1_ In Selection.Areas
co_ = d1_.Count
If co_ > 1 Then
rd_ = rd_ & " " & d1_(1).Row
ar = d1_
p_ = ar(1, 1)
For i = 2 To co_
ar(i, 1) = p_ & " " & ar(i, 1)
Next i
d1_ = ar
End If
Next d1_
aru = Split(rd_)
For j = UBound(aru) To 1 Step -1
Cells(aru(j), 1).EntireRow.Delete
Next j
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = 1
Selection(1).Select
End Sub
Пытливый, ну я же написал и в файле-примере и тут — в шапке темы, что сам (руками) выделять буду эти группы. А в каждой такой (мной выделенной) группе первая ячейка и есть префикс. Ориентироваться на соседние не стал, так как никакой надежды на корректность в этих отчётах нет. А в таком полуавтоматическом режиме - самое то. Спасибо вам большое за внимание к теме!
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
_Boroda_, ух интересно как попробую прогрызть)) спасибо вам большое! Приятно видеть вас на Планете
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Как-то так у меня вышло. Вроде работает. Были заморочки с удалением этих ячеек-префиксов. Union, вроде справился))
Код
Код
'В несмежных диапазонах вставить значение первой ячейки каждой группы в последующие ячейки внутри группы. Затем первые ячейки каждой группы удалить
'Автор: Sanja
'Допиливал: Jack Famous
'Тема на форуме: http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=1&TID=96762&TITLE_SEO=96762-dobavit-prefiks-iz-znacheniya-pervoy-yacheyki-v-nesmezhnykh-diapazonakh&logout_butt=%D0%92%D1%8B%D0%B9%D1%82%D0%B8
'====================================================================================================================================================================================================================================================
Option Explicit
Sub AddPrefixInAreas()
Dim pref_cl As Range, del_group As Range
Dim i&, j&
Dim prefix$, delim$
delim = " "
For i = 1 To Selection.Areas.Count
For j = 1 To Selection.Areas(i).Cells.Count
Set pref_cl = Selection.Areas(i).Cells(1)
prefix = pref_cl.Value
If j > 1 Then
Selection.Areas(i).Cells(j).Value = prefix & delim & Selection.Areas(i).Cells(j).Value
End If
Next j
If del_group Is Nothing Then
Set del_group = pref_cl
Else
Set del_group = Union(del_group, pref_cl)
End If
Next i
del_group.EntireRow.Delete
End Sub
По коду от уважаемого модератора с дружественного сайта: вроде более-менее разобрался в основных моментах)) Пока для меня слишком сложен синтаксис, но, думаю, что со временем и до этого дойду Спасибо всем за внимание к теме!
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
ну дак вы же ш))) здравствуйте! Спасибо Вечером пошагово прокомментирую ваш код и спрошу про непонятки
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄