Огромное всем спасибо за помощь и за рекомендации! Фронт работы понятен. Буду формировать этикетки на основании строк и столбцов, затем постараюсь реализовать через dpl.
Уважаемые 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 для программирования по части штрихкодов. Интересная тема. Буду над этим работать. Но сначала думаю, переписать класс модуля на основе строк и столбцов без использования объектов.
Добрый день! Написал макрос, который формирует этикетки с штрихкодом на основании данных из базы данных. Текст записывается в объекты типа "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" я не смогу решить задачу. В целом все работает, только вот с определением границ печати проблема.
Добрый день! Пишу процедуру смены кодировки данных из базы данных (БД). Идея следующая, вытаскиваю данные из БД и кладу их в массив. Затем запускаю процедуру, в которую передаю аргументы, делаю замену данных в массиве c новой кодировкой и затем отображаю их на листе. При компиляции возникает ошибка Argument not optional на строке .WriteText = strArr(iR, iC). Аргументы все заданы при вызове, массив заполнен данными. Если эту строку убрать, то все работает. С чем это может быть связано?
Код
Sub ConvertToCyrillic(strArr() As Variant, Sh As Worksheet, iRow As Integer, iCol As Integer)
'variables declaration
Dim TextStream As New ADODB.Stream
Dim iR As Integer, iC As Integer
' to specify the properties of the object
With TextStream
.Type = 2 'text data
.Mode = 3 'read/write
End With
' to start to convert of the Charset
For iC = 1 To UBound(strArr, 2) Step 1
For iR = 1 To UBound(strArr, 1) Step 1
With TextStream
.Charset = "ISO-8859-1"
.Open
.WriteText = strArr(iR, iC)
.Position = 0
.Charset = "Windows-1251"
strArr(iR, iC) = .ReadText
.Close
End With
Next iR
Next iC
' to delete the object from memory
Set TextStream = Nothing
' to assign the array to range
Sh.Range(Cells(iRow, iCol), Cells(UBound(strArr, 1), UBound(strArr, 2))) = strArr
Erase strArr
End Sub
Процедура выборки данных и запуск процедуры смены кодировки.
Код
SUB connection_db
Set CS = CreateObject("ADODB.Connection")
Set RS = CreateObject("ADODB.Recordset")
Set CMD = CreateObject("ADODB.Command")
'ISeries connection String
ConnectString = "Driver={ISeries Access ODBC Driver};System = 00.00.00.000;Uid=" & strLogin & ";Pwd=" & strPassword & ";Library=XXXX;CCSID=1251"
CS.Open (ConnectString)
'select from db
sqlstring = " SELECT * From ABC "
CMD.ActiveConnection = CS
CMD.CommandText = sqlstring
Set RS = CMD.Execute
'RS.Open sqlstring,CS
Dim A1() As Variant
A1 = RS.GetRows()
Call ConvertToCyrillic(A1, TST, 2, 1)
RS.Close
CS.Close
End Sub