Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Или если в прайсе есть больше 2х колонок групп, и с помощью макроса их можно объединить в одну (так же для каждой строки с товаром).

...

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

В прайс нужно добавить следующий макрос и в нем поменять настройки:
Expand
titleКак объединить группы из нескольких колонок в одну? Макрос (разверните)

Code Block
languagevb

'индекс листа SHEET_

Dim idx_row, idx_group, j, k, idx_from, idx_to As Long
Dim group_full As String
Dim group_col As Integer

'индекс листа
SHEET_IDX = 1

'строка с которой начинается прайс
START_ROW = 13

'колонки CLMS_LIST

CLM_LAST = 

Array(1, 2, 3

"ZZ" 'последняя колонка в прайсе, буквами

CLMS_LIST = Array(1) 'список индексов колонок, в каком порядке их нужно объединять

CLM_RESULT

, индексы колонок вводятся через запятую
'CLMS_LIST = 

1 'колонка в которую будут записываться объединенные группы CLM_PRICE = 9 'колонка с ценой товара (должна быть заполнена у каждого товара) CHR_DELIMITER = ">" 'разделитель между группами (не должен встречаться в названиях групп)

Array(3, 4, 5) 'пример если несколько колонок групп

CHR_DELIMITER = " >> " 'разделитель между группами

CLM_GROUP_IDX = 2 'номер колонки с группой (в нее же помещается объединенная группа)
CLM_GROUP_L = "B" 'буква колонки с группой
CLM_GROUP_LEVEL = 20 'номер колонки с уровнем группировки
CLM_PRICE = 9 'колонка, в которой указана цена товара

Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.EnableEvents = False

Set 

Sht

SHT = Sheets(SHEET_IDX)

For i = START_ROW To Sht.UsedRange.Rows.Count If Sht.Cells(i, CLM_PRICE).Value <> "" Then s_res = "" For j = LBound(CLMS_LIST) To UBound(CLMS_LIST) clm_group = CLMS_LIST(j)

SHT.Select
Cells.Select
Selection.ClearOutline
Selection.UnMerge

SHT.Cells(1, 1).Select

row_count = SHT.UsedRange.Rows.Count
prev_level = Array("", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "")

'формируем группы из нескольких колонок
For i = START_ROW To row_count
	group_text = ""
	If Sht.Cells(i, 

clm

CLM_

group

PRICE).Value <> "" Then
		For j = LBound(CLMS_LIST) To UBound(CLMS_LIST)
			clm_group = CLMS_LIST(j)
			
			If SHT.Cells(i, clm_group).Value <> "" Then
				If (

s

group_

res

text = "") Then
					group_text = SHT.Cells(i, clm_group).Value
				Else
					group_text = group_text 

s_res = Sht

& CHR_DELIMITER & SHT.Cells(i, 

CLMS_LIST(j)

clm_group).Value
				End If
			Else
			   Exit For
			End If
		Next j

Else s_res = s_res & CHR_DELIMITER & Sht

				
		If group_text <> "" Then
			SHT.Cells(i, 

clm

CLM_GROUP_

group

IDX).Value = group_text
		Else
			SHT.Cells(i, CLM_GROUP_IDX).Value = "не 

распределено"
		End If
	Else
		Sht.Cells(i, CLM_GROUP_IDX).Value = ""
	End if
Next i


'сортировка по колонке с группой
Columns(CLM_GROUP_L & ":" & CLM_GROUP_L).Select
SHT.Sort.SortFields.Clear
SHT.Sort.SortFields.Add Key:=Range(CLM_GROUP_L & "1"), _
	SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With SHT.Sort

Sht.Cells(i, clm_group).Value = "" End If Next j Sht.Cells(i, CLM_RESULT).Value = s_res Else Sht.Cells(i, CLM_RESULT

	.SetRange Range("A" & CStr(START_ROW) & ":" & CLM_LAST & CStr(row_count))
	.Header = xlNo
	.MatchCase = False
	.Orientation = xlTopToBottom
	.SortMethod = xlPinYin
	.Apply
End With


'Добавление строчек с группами
idx_row = START_ROW

Do While ActiveSheet.Cells(idx_row, CLM_GROUP_IDX).Value <> ""
	group_full = ActiveSheet.Cells(idx_row, CLM_GROUP_IDX).Value
	ActiveSheet.Cells(idx_row, CLM_GROUP_LEVEL).Value = ""
	
	'Разделитель
	group_part = 

End If Next i Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic Application.EnableEvents = True

Split(group_full, CHR_DELIMITER)
			
	For i = LBound(group_part) To UBound(group_part)
		If group_part(i) <> prev_level(i) Then
			Rows(CStr(idx_row) & ":" & CStr(idx_row)).Select
			Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
			
			ActiveSheet.Cells(idx_row, CLM_GROUP_LEVEL).Value = i + 1
			ActiveSheet.Cells(idx_row, CLM_GROUP_IDX).Value = group_part(i)
			prev_level(i) = group_part(i)
			
			idx_row = idx_row + 1
		End If
	Next i
	
	idx_row = idx_row + 1
Loop

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True

Note

Перед копированием макроса из инструкции переключите раскладку клавиатуры на русский язык

Макрос добавляется в карточке прайса во вкладке “Макрос”

Image Added

Нужно указать значения настроек для вашего прайса. В комментариях рядом со значением указано, что туда нужно вводить.

Image Added

Пример прайса (группы в каждой строке в первых трех колонках):

Image Added

Пример настройки (результат помещается в колонку А):

Image Added

Note

Если прайс большой, то макрос может выполняться долго

После выполнения макроса в файле будет такой результат:

...

Группы вынесены в отдельные строки, а в 20-ой колонке указан уровень, на котором находится группа.

Для его загрузки указываются следующие настройки:

...

В Название группы и Название вышестоящей группы указывается колонка А, т.е. та колонка, в которую записывался результат макроса (CLM_GROUP_IDX )

Колонка 20 (CLM_GROUP_LEVEL из макроса) указывается как Код вышестоящей группы.

Устанавливаются птички Группа в отдельной строке и Дерево. Загрузка группы по наименованию.

В строку, с которой начинается загрузка прайса, указывается строка, в которой название первой группы.

Определение группировки по форматированию

...