Страницы: 1
RSS
VBA: подобрать расстояние между этикетками
 
Добрый день! Написал макрос, который формирует этикетки с штрихкодом на основании данных из базы данных.
Текст записывается в объекты типа "Label" ( надпись) класса "shape". Штрихкод создается объектом Barcode.Ctrl.1 класса object.(activeX)Принцип работы следующий:
1. Запрос к БД
2. Полученные данные записываются на лист "RecordSet"
3. Созданный мною модуль класса "Classlabel_1" генерирует одну этикетку. Цикл обрабатывает класс столько раз, сколько нужно этикеток. Этикеток может быть от 1 до 500. Все этикетки уникальные. Размер этикетки составляет 58 мм х 40 мм. Расстояние между первой этикеткой и последующей задается переменной dTop (код создания этикетки ниже) и далее печатается на принтер этикеток:
Код
Sub CreateLabels(lRows)
Dim i As Integer, x As Integer
Dim dTop As Double
dTop = 0
Dim lab As New ClassLabel_1
Dim arrdata() As Variant
arrdata() = Sh1.Range(Sh1.Cells(2, 10), Sh1.Cells(lRows, 15))

For i = 1 To UBound(arrdata, 1) Step 1
With lab
            .stLabArticle = arrdata(i, 3)
            .stLabBarcode = arrdata(i, 6)
            .stLabName = arrdata(i, 1)
            lab.createLabel (dTop)
        End With
dTop = dTop + 115
Next i
Erase arrdata()
Приложенный файл возможно не запуститься, т.к. там нужна спец. библиотека которая формирует activeX элемент - штрихкод.

Проблема в следующем.
На моем мониторе параметр dTop я задал как 115, но на других компьютерах нужно этот параметр подбирать. Этот параметр служит для расположения в зоне печати одной этикетки. Если создается их n-количество штук, то текст сползает вниз или вверх тем самым заходя на другую этикетку.
Можно это как то решить? Может я иду неправильным путем и через объекты "Label" я не смогу решить задачу. В целом все работает, только вот с определением границ печати проблема.

Как правильно лучше решить эту проблему?
 
попробуйте в дебагере посмотреть на компах с разным отображением значения таких свойств как ActiveSheet.PageSetup.PrintQuality и подобное имеющее отношение к размерам страницы или экрана...
 
Цитата
Dionysus написал:
Расстояние между первой этикеткой и последующей задается переменной dTop (код создания этикетки ниже) и далее печатается на принтер этикеток:
Это обычны просто принтер или специализированный? Если Специализированный(а судя по области печати в один столбец это так), то какой смысл делать разметку таким образом, если достаточно разрыв страницы поставить. Да для этого придется подобрать высоту строк(строки) но на этом всё. Корректно настроенный на размер таких этикеток принтер просто прогонит ленту на начало следующей.
Цитата
Dionysus написал:
Может я иду неправильным путем и через объекты "Label"
- на мой взгляд - В результате работы кода у вас образуется куча объектов на листе, что не полезно. Какой в этом смысл, если можно подготовить шаблон этикетки обычными строками и столбцами. Останется только занести информацию в необходимые (заранее отформатированные  ячейки (ну может строки  блока по высоте тоже подправить) и относительно одной ячейки вставить контрл с штрихкодом. При этом разрыв страницы все равно предпочтителен для начала следующей этикетки, так как при рендеринге (особенно большого количества этикеток, набежит ошибка и появится сдвиг.

P.S. Обращаю внимание, что как правило штрихкодовые принтера достаточно интелектуальны и имеют все для того чтоб генерить штрихкод самостоятельно, но для этого этикетку на до оформит на их языке. Печать при этом происходит в разы быстрее, так как рендеринг растрового изображения этикетки из документа, занимает больше ресурсов. По этому в ряде случаев проще генерить последовательность управляющих символов и отправлять её в порт к которому подключен притер. Да надо SDK смотреть, и сперва трудно, но это компенсируется потом скоростью надежностью.
По вопросам из тем форума, личку не читаю.
 
Уважаемые DenSyo, БМВ огромное Вам спасибо за отклик и помощь.
Цитата
БМВ написал: Это обычны просто принтер или специализированный?
Касательно принтера - это обычный термо принтер для печати этикеток ( citizen cl-7000). Разрыв страницы я могу выставить, только в любом случае объект label(надпись) может выходить за границы разрыва т.к. объект не привязан к ячейке. Координаты построения объекта Label в свою очередь создаются параметрами left = постоянному значению, и Top = dTop, который равен 115, т.е. dTop обозначает, что через 115 points нужно начинать рисовать снова объект Label.
Цитата
БМВ написал: В результате работы кода у вас образуется куча объектов на листе, что не полезно. Какой в этом смысл, если можно подготовить шаблон этикетки обычными строками и столбцами
Сначала я создал класс модуля, в котором все Label создавались как object, при этом вставка большого количества объектов занимала очень много времени. Потом класс был переписан на использование объектов типа Shape и вставка объектов осуществляется моментально.
Почему я начал реализовывать через объекты label, а не через строки и столбцы? Хотел сделать универсальную программу которая на основании созданного шаблона будет создавать любые этикетки, т.е. добавлять и размещать на листе объекты label и затем программа получает координаты всех объектов и далее строит их, но сейчас понимаю что это проще сделать через строки и столбцы.
Цитата
БМВ написал: относительно одной ячейки вставить контрл с штрихкодом
Не совсем понимаю, что имеется ввиду "относительно одной ячейки" здесь? Ведь штрихкод это activex элемент, координаты (left и Top) которого задаются в point'ах. Боюсь что он будет у меня смещаться вниз/вверх на каждой этикетке. Можно ли как нибудь зафиксировать объект в ячейке.
Цитата
БМВ написал: штрихкодовые принтера достаточно интелектуальны и имеют все для того чтоб генерить штрихкод самостоятельно, но для этого этикетку на до оформит на их языке.
Спасибо за информацию, я не знал об этом. Принтер работает c языком DPL. Уже нашел мануал по dpl для программирования по части штрихкодов. Интересная тема. Буду над этим работать. Но сначала думаю, переписать класс модуля на основе строк и столбцов без использования объектов.
 
Цитата
Dionysus написал:
Не совсем понимаю, что имеется ввиду "относительно одной ячейки" здесь?
Я имел в виду, что если подготовить шаблон на основе строк и столбцов , то можно разместить штрихкод со смещением относительно левого верхнего угла предопределенной ячейки. Следующая группа будет состоять из аналогичных строи и ячейка будет другая, но мы её знаем ,так как знаем период строк.

Конечно для разовых работ рендеринг драйвером принтера применим, но DPL или ZPL (Zebra) быстрее в работе, не требует установки activeX, но медленнее в разработке. Тут надо взвешивать.
По вопросам из тем форума, личку не читаю.
 
Делали, печатали. Задача была - подогнать размеры этикетки. Больше никах расстояний между - на листе один шаблон этикетки.
 
Огромное всем спасибо за помощь и за рекомендации!  
Фронт работы понятен. Буду формировать этикетки на основании строк и столбцов, затем постараюсь реализовать через dpl.
Страницы: 1
Наверх