Quad.Wiki

Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 25 Current »

Где в программе увидеть группы из прайса?


Группы в прайсах нужны для удобного сопоставления товаров, например, чтобы можно было выбрать какую-то одну группу товаров и связывать ее + нужны для автоматического добавления товаров в свой прайс, по соответствию между вашими группами и группами поставщиков. Если ни одно ни второе вам не нужно, то не стоит тратить время на настройку групп из прайсов поставщиков, если там не какой-то простой вариант.


1. Перейти во вкладку Прайсы и выбрать слева прайс, справа над таблицей товаров должно быть установлено "1 выбранный"


2. В левом нижнем углу перейти во вкладку Группы



Как настраиваются группы?

Для настройки групп можно указать 2 колонки:

"Название группы" - это колонка, в которой находится название группы товара

"Название вышестоящей группы" - это колонка, в которой находится вышестоящая (родительская) группа.

Если и то и то в прайсе находится в одной колонке, то загрузить целиком структуру групп можно только если в прайсе они сгруппированы средствами эксель или с помощью макроса, который разрабатывается специально под каждый прайс за дополнительную плату (т.е. нет одинакового макроса для всех прайсов).


Товары Основного прайса (вашего каталога товаров, который загружается во вкладку Продукция) можно распределить по группам так же по какому-то ИД группы, который указан в прайсе. В этом случае прайс может быть без Названия группы.

Чтобы товары распределились, нужно заполнить в группах основного прайса поле Код группы, которое будет соответствовать этому ИД из прайса. Заполнить поле можно или вручную или через Импорт групп.

Колонка, в которой указан ИД/Код группы указывается так:

Код группы можно загружать так же, если в прайсе указаны и код группы и название группы. В этом случае можно указать загрузку групп по Коду и они не будут дублироваться, в случае, если в прайсе меняется название какой-то группы.

Для управления загрузкой групп в настройках прайса есть пункт 6. Группы.

Здесь выбирается по какому полю загружаются группы, возможные варианты:

"Не загружать группы" - из прайса не будут загружаться группы вообще, а товар попадет в группу "Без группы"

"Загружать по коду" - можно выбирать, если в прайсе присутствует код группы и поставщик его не меняет.

"Загружать по наименованию" - используется для большинства прайсов, в этом случае при загрузке группа будет проверяться по названию, есть такая в базе или еще нет.

Птичка "Группа в отдельной строке" используется для указания программе места расположения групп в прайсе.

Если установить птичку, то программа будет в прайсе искать строки в которых есть текст в колонке "Название группы" и нет текста в колонке "Цена" или "Рекомендованная цена", если в прайсе есть только РРЦ.


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

Т.е. в строках всех товаров указано название группы.


Птичка “Дерево” - устанавливается, если прайс сгруппирован стандартными средствами Excel.

Группы в прайсе сформированы стандартной группировкой Excel


Пример прайса:


1. Нужно указать поля "Название группы" и "Название вышестоящей группы".

Обычно в таких прайсах они в одной колонке, на скриншете выше это колонка B


2. Поставить птичку "Группа в отдельной строке"


3. Поставить птичку "Дерево"


4. Загружать прайс нужно начиная со строки, в которой идет первая группа


В результате вы получите группы 1 в 1 как они идут в прайсе



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


Пример прайса

в поле "Название группы" можно указать колонку С

в поле "Название вышестоящей группы" - колонку B или A, или, так как в этом прайсе 3 колонки, то можно название вышестоящей группы объединить из двух колонок A+B

Загрузить дерево групп из 3х уровней при такой структуре прайса нельзя, только группа и вышестоящая группа. Или делать специальный макрос, который из 3х колонок сделает две.

При настройке этого прайса нужно убрать так же птичку "Группа в отдельной строке", так как группы в этом прайсе указаны в каждой строке.


Группа в прайсе указана в отдельной строке, без группировки средствами Excel

пример прайса:


Как видно из примера - это такой же прайс как в первом пункте этой инструкции, только он не сгруппирован в экселе.


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

Здесь указывается просто поле "Название группы" с колонкой B. Вот такие группы будут у товаров в программе:

Нужно так же установить птичку "Группа в отдельной строке".

В колонке B в данном прайсе находится и название группы в отдельных строках и название товара - нужно одну и ту же колонку указывать и в поле "Название группы" и "Название", т.е. ничего страшного, программа определит где группа, а где товар, по колонке цены. Там где цены нет (пусто в колонке) - будет считаться группа, где есть цена - товар.

Группа в одной ячейке в виде полного пути, с разделителем

Данный способ подойдет в случае, когда полный путь группы (группа и все вышестоящие группы) указаны в одной ячейке, через какой-то разделитель, для каждой строчки с товаром в прайсе.

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

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

 Макрос (разверните)

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
CLM_LAST = "ZZ" 'последняя колонка в прайсе, буквами

CLMS_LIST = Array(1) 'список индексов колонок, в каком порядке их нужно объединять, индексы колонок вводятся через запятую
'CLMS_LIST = Array(3, 4, 5) 'пример если несколько колонок групп

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

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

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

Set SHT = Sheets(SHEET_IDX)
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_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 (group_text = "") Then
					group_text = SHT.Cells(i, clm_group).Value
				Else
					group_text = group_text & CHR_DELIMITER & SHT.Cells(i, clm_group).Value
				End If
			Else
			   Exit For
			End If
		Next j
				
		If group_text <> "" Then
			SHT.Cells(i, CLM_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
	.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 = 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Часто в прайсах указывают группы, которые не сгруппированы средствами Excel, но текст в каждом уровне имеет разное форматирование (разный шрифт, или цвет шрифта, или цвет ячейки, или разные отступы от начала ячейки). В этом случае группы можно загрузить, но для этого нужно составить макрос:

 Развернуть текст макроса


Макрос
###DECLARE###  
    Public Type GroupLevel
        ColIndex As Integer 'номер колонки, в которой указано название группы
        InterColor As Long 'цвет ячейки
        IsBold As Integer '1 - жирный 0 - нет
        IsItalic As Integer '1 - курсив 0 - нет
        FontName As String 'название шрифта
        FontColor As Long 'цвет шрифта
        FontSize As Long 'размер шрифта
        Indent As Integer 'отступ
		IsUnderline As Integer 'подчеркнут
    End Type  
###DECLARE###      
    'Укажите после "To" количество уровней группировки,
    '3 (три) означет что у группы есть подгруппы и у подгруппы есть еще вложенные подгруппы
    Const lvlCount = 3
	
    Dim i, j, clmnPriceIndex, clmnOutIndex, rowFirstData As Integer
    
    'Укажите номер колонки, в которой указана цена товара
    clmnPriceIndex = 0
    
    'Укажите номер колонки, в которую будет помещен результат
    clmnOutIndex = 0
    
    'Укажите номер первой строки с данными
    rowFirstData = 0
    
    Dim GroupLevels(1 To lvlCount) As GroupLevel

    'Укажите настройки для каждого уровня, пример:
GroupLevels(1).ColIndex = 2
GroupLevels(1).InterColor = 11842740
GroupLevels(1).IsBold = 1
GroupLevels(1).IsItalic = 1
GroupLevels(1).IsUnderline = -4142
GroupLevels(1).FontName = "Arial"
GroupLevels(1).FontColor = 0
GroupLevels(1).FontSize = 9
GroupLevels(1).Indent = 0

GroupLevels(2).ColIndex = 2
GroupLevels(2).InterColor = 12829635
GroupLevels(2).IsBold = 1
GroupLevels(2).IsItalic = 1
GroupLevels(2).IsUnderline = -4142
GroupLevels(2).FontName = "Arial"
GroupLevels(2).FontColor = 0
GroupLevels(2).FontSize = 9
GroupLevels(2).Indent = 0
    

    
    For i = rowFirstData To ActiveSheet.UsedRange.Rows.Count
        If ActiveSheet.Cells(i, clmnPriceIndex).Value = "" Then
            For j = 1 To lvlCount
                Set cel = ActiveSheet.Cells(i, GroupLevels(j).ColIndex)
                
                If (cel.Interior.Color = GroupLevels(j).InterColor) And _
                    ((-1) * CInt(cel.Font.Bold) = GroupLevels(j).IsBold) And _
                    ((-1) * CInt(cel.Font.Italic) = GroupLevels(j).IsItalic) And _
                    (cel.Font.Name = GroupLevels(j).FontName) And _
                    (cel.Font.Color = GroupLevels(j).FontColor) And _
                    (cel.Font.Size = GroupLevels(j).FontSize) And _                    
                    (cel.IndentLevel = GroupLevels(j).Indent) Then
                        
                       ActiveSheet.Cells(i, clmnOutIndex).Value = j
                       Exit For
                End If
            Next j
        End If
    Next i

 



Вам так же понадобится этот файл, для определения форматирования в ячейках, скачайте его себе:

При открытии этого файла нужно разрешить ему работу с макросами


Что нужно делать:

1. Скопируйте текст макроса в блокнот, можете использовать для этого программу-блокнот с подсветкой синтаксиса, например Notepad++ (качайте самую последнюю версию)

Установите в нем синтаксис Visual Basic


В макросе укажите:

Количество уровней групп, которые собираетесь загружать из прайса


Номер колонки в которой цена товара


Номер колонки, в которую будет помещен код уровня группировки:

Здесь нужно указать какую-то пустую колонку, после всех колонок прайса. Указывайте с запасом, на случай, если поставщик добавит в прайс колонки, чтобы не переделывать макрос. Обычно указывается 20-ая колонка, если в прайсе колонок меньше.


Укажите номер строки, с которой начинается прайс (первая строка после шапки)


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


2. Откройте файл "Проверка формата ячейки"

В этом файле нужно получить код для каждого уровня группировки. Пример прайса, в котором каждый уровень группировки обозначен с помощью различного цвета ячейки:


Копируем ячейку с названием первого уровня групп (если в экселе для названия группы объединено несколько ячеек, то их нужно разъединить)

после этого скопировать

и вставить в файл с макросом проверки, ввести номер уровня группы и нажать "Проверить"

в результате получим код, который нужно скопировать в макрос для прайса:


Копируем код вместо того, который был в макросе:


Аналогично делаем для второго и третьего уровней.



Для каждого уровня указываем номер колонки, в которой указано название группы этого уровня (в примере это колонка B, указывается номер 2)


Вот здесь должен быть указан уровень, разный в каждом блоке



Полученный результат копируется в настройку прайса


3. В настройке прайса указываются колонки "Название группы" и "Название выш. гр." - в моем примере одна и та же колонка B, в которой находятся группы в прайсе.

Указываем так же поле "Код вышестоящей группы" - это та колонка, в которую в макросе указали помещать номер уровня группы (20-ая колонка)


Устанавливаем птичку "Дерево"

Загружать группу по наименованию + птичка Группа в отдельной строке


Сохраняем настройки и пробуем загрузить. В моем примере получились такие настройки:


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


Удаление всех групп из прайса

Если что-то загрузилось с группами не так, можно удалить только группы прайса, при этом оставить товар, чтобы не пропали привязки. Для этого во вкладке Прайсы выберите слева нужный прайс и нажмите эту кнопку:





  • No labels