Не срабатывает BIND

187 views
Skip to first unread message

Анатолий Долидович

unread,
Mar 6, 2024, 7:44:24 AM3/6/24
to cla...@googlegroups.com
Здравствуй, Clalist.

По какой причине может не срабатывать BIND(Group)?
У меня в двух приложениях производится BIND записей файлов (структура RECORD) и групп локальных переменных.
Динамические выражения по Evaluate отрабатывают.
Перенес в третье приложение, а там BIND не срабатывает ни на RECORD, ни на группу локальных переменных.
Последующие  Evaluate выводят ошибку 1011.
Объявления переменных в дипамических сделаны как полагается, через префикс с двоеточием. Атрибут Bindable у файла есть.
Второй день сижу, читаю, нигде ничего не могу найти.
Может в общих свойствах приложений и/или словарей что-то такое неуловимое есть?

-- 
С уважением,
 Анатолий                          
mailto:anatoli.d...@asb.by

Анатолий Долидович

unread,
Mar 6, 2024, 7:47:00 AM3/6/24
to cla...@googlegroups.com
Уточняющая информация: Clarion 6.3.9059, ШВС.

Alexander Strumensky

unread,
Mar 6, 2024, 5:47:18 PM3/6/24
to cla...@googlegroups.com
если используется UNBIND - убрать, лучше использовать PUSHBIND/POPBIND

ещё могу посмотреть что происходит, если вышлите CLW и OBJ где не срабатывает - могу покопаться немного

--
Вы получили это сообщение, поскольку подписаны на группу ClaList.

Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.
Просмотреть это обсуждение в Сети можно по адресу https://groups.google.com/d/msgid/clalist/1748830745.20240306154656%40asb.by.

Анатолий Долидович

unread,
Mar 7, 2024, 12:58:15 AM3/7/24
to cla...@googlegroups.com
Добрый день всем!

Ситуация следующая. Мне досталось по наследству 4 приложения. Бизнес-аналитик по этим задачам замутил тему перехода в печати договоров страхования
на HTML-шаблоны. В двух приложениях все заработало на ура. Соответствующий фрагмент кода WORK.CLW прилагается. Это исходник функции, которая берет
HTML-файл и делает в него вставки данных в определенные места. Эта технология в моих разработках работает не только в этих приложениях.
В силу специфики (печать в бланк) одно приложение из этого списка выпало. Осталось последнее, соответствующая функция в котором не работает (DO NOT WORK.CLW).
Точнее, не работает вставка данных, основанная на выполнении динамических выражений из-за того, что BIND почему-то не работает.
Прилагаю еще фрагмент шаблона договора, для понимания что в нем за выражения.
Ничего сложного тут нет.
Но, как говорится, найдите 5 отличий :)

Буду весьма признателен за помощь. Хотя сроки и не горят, я всю эту неделю трахаюсь с этой долбаной ошибкой.

ЗЫ В новой задаче по этому приложению кардинальнопоменялся договор. Так вот до этого момента договор был оформлен в виде процедуры Report, пеерписывать который - 
так лучше сразу из окна выпрыгнуть.


-- 
С уважением,
 Анатолий                          
mailto:anatoli.d...@asb.by
Work.clw
Do not work.clw
dogovor.html

Vadim Sinyavskiy

unread,
Mar 7, 2024, 2:48:56 AM3/7/24
to cla...@googlegroups.com
Тут сложно что-то сказать без общей картинки (глобальных деклараций ect), но вот код из "Do not work.clw"
  PUSHBIND
  OpenFile:SPR_DK
  OpenFile:SPR_SOR
  FilesOpened = True
  bind(zod:record)
  bind(Locvars)
  retval=1
  close(wintext)
все же немного смущает... Ибо что там за структуры используются при открытии-закрытии структур и что байндится - мягко говоря неочевидно, но вот байндить, а потом закрывать структуру - вот как-то не комильфо. Как-то наталкивает на мысль о не самом правильном построении логики работы с данными... Тем более, что в "Work.clw" это логика реализована более корректно: открыли структуру -> забайндили переменные/группы -> наслаждаемся позитивным результатом


чт, 7 мар. 2024 г. в 07:58, 'Анатолий Долидович' via ClaList <cla...@googlegroups.com>:
--
Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/clalist/535245845.20240307085810%40asb.by.

Анатолий Долидович

unread,
Mar 7, 2024, 4:41:03 AM3/7/24
to cla...@googlegroups.com
В обоих клашниках:
Объект wintext - это ASCII-файл в кодировке 1251;
Locvars - это группа локальных переменных функции PrintHTMLDog;
ZOD, PON, ZOK - это собственно базы данных из которых печатается договор. Префиксы точно такие же как и имена баз данных.
Глобальные свойства приложений одинаковые.
Вызовы функции PrintHTMLDog одинаковы.
Тля, а работать в последнем модуле не хочет.
Хотя сколько раз уже такое со мной было здесь - чего-то не заметил сразу, потом исправил, и все нормально стало :)

-- 
С уважением,
 Анатолий                          
mailto:anatoli.d...@asb.by

Oleg Fomin

unread,
Mar 7, 2024, 6:19:42 AM3/7/24
to cla...@googlegroups.com

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

--

Анатолий Долидович

unread,
Mar 7, 2024, 7:32:17 AM3/7/24
to cla...@googlegroups.com
К сожалению, не получится почистить исходник настолько чтобы его можно было выложить для диагностики.
Я уже думал над этим. Надо переписывать кучу кода чтобы заглушки можно было поставить, и то я не уверен что все выйдет так как надо.
В общем прошу у всех прощения за беспокойство и считаем тему закрытой.

-- 
С уважением,
 Анатолий                          
mailto:anatoli.d...@asb.by

Александр Агеев

unread,
Mar 7, 2024, 11:36:19 AM3/7/24
to cla...@googlegroups.com
У меня 11 лет назад была подобная проблема, но точно уже не помню
Сейчас порылся в старых сырцах, нашел несколько рекомендаций самому себе
Какая именно рекомендация сработала - уже не помню

1. Не делать даже условного return до BIND
Т.е. 
i = 1
If i = 0 THEN RETURN
Bind(myRecord) ! может упасть при первом обращении в evaluate
Это результат клашиного оптимизатора

2. Не биндить структуры с указателями

3. Не биндить структуры с подструктурами

4. Не обращаться в evaluate к переменным под Over

Ограничения я обошел создав дублеры нужных файлов

чт, 7 мар. 2024 г. в 19:32, 'Анатолий Долидович' via ClaList <cla...@googlegroups.com>:
--
Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/clalist/725710564.20240307153212%40asb.by.

Анатолий Долидович

unread,
Mar 11, 2024, 1:53:30 AM3/11/24
to cla...@googlegroups.com
Здравствуйте, Александр.

Огромное спасибо за подсказку в виде списка.
Проверил все.
Структуры, которые биндятся, представляют собой обычные Group и Record, без подструктур, без использования Over и указателей.
А вот return в виде do procedurereturn в коде в районе BIND был.


-- 
С уважением,
 Анатолий                          
mailto:anatoli.d...@asb.by

Анатолий Долидович

unread,
Mar 11, 2024, 5:23:20 AM3/11/24
to cla...@googlegroups.com
Огромное всем спасибо за поддержку.

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


-- 
С уважением,
 Анатолий                          
mailto:anatoli.d...@asb.by

Igor Smirnov

unread,
Oct 24, 2024, 6:19:52 AM10/24/24
to cla...@googlegroups.com

Здравствуйте, коллеги,

Есть необходимость выполнять с файлами Excel следующие операции:

1. Скопировать один из листов в новый файл (имя листа и его расположение относительно других заведомо известно)

2. Выделить область (координаты ячеек заведомо известны), скопировать ее в буфер, а затем вставить в ту же самую область, но с заменой формул значениями

 

Сам MS Excel на компе установлен. 

Также в наличии имеются наборы шаблонов OfficeTemplate (от Softmasters) и OfficeInside (от Capesoft), но к сожалоению я ни там, ни там не смог найти готовых подходящих функций.

Может, кто поможет?

  

 

-- 
Best regards,
Igor Smirnov

Rimantas Nedzinskas

unread,
Oct 24, 2024, 6:50:29 AM10/24/24
to cla...@googlegroups.com
Привет,

Давно не работал с Excel, просто мысли, куда бы я смотрел при работе с OfficeInside.
1. Скопировать файл и удалить ненужные листы (DeleteWorksheet()).
2. Использовать функции Copy()/Paste() 

Римас 

--
Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/1961341343.20241024131941%40gmail.com.

Валерий Будько

unread,
Oct 24, 2024, 7:51:46 AM10/24/24
to cla...@googlegroups.com

Вот по быстрому, как для помощи при старте то пригшодится

 

ExcelClass.SendCommand         PROCEDURE(STRING OleCommand)

  CODE

    SELF.Res = SELF.W $ SELF.Controls{OleCommand}

               

ExcelClass.GetProperty         PROCEDURE(STRING Property)

ReturnValue STRING(1024),AUTO

  CODE

    ReturnValue = SELF.W $ SELF.Controls{Property}

    RETURN ReturnValue             

 

ExcelClass.SelectCell PROCEDURE(ULONG x, USHORT y, ULONG xs, USHORT ys)

    CODE

    SELF.SendCommand('ActiveSheet.Range("' &SELF.Cels(x,y) & ':' & SELF.Cels(x+xs-1,y+ys-1) & '").Select')           

 

ExcelClass.GetCellValue PROCEDURE(ULONG x, USHORT y)

    CODE

    RETURN(SELF.GetProperty('Application.Cells(' & x & ',' & y & ').Value'))

 

ExcelClass.SetCellValue PROCEDURE(STRING CellValue, <STRING CellFormat>, SHORT StepLine, SHORT StepColumn)

    CODE

  IF CellFormat

    SELF.SetCellFormat(CellFormat)

  END

  SELF.SetProperty('Application.Cells(' & x & ',' & y & ').Value',CLIP(LEFT(CellValue)))

 

ExcelClass.Copy                PROCEDURE()

  CODE

    SELF.SendCommand('Selection.Copy')      

 

ExcelClass.Paste               PROCEDURE()

  CODE

    SELF.SendCommand('Selection.Paste')     

 

ExcelClass.GetCellsValue PROCEDURE(ULONG x, USHORT y, ULONG xs, USHORT ys)

OutString       &string

OutLen          LONG,AUTO

    CODE

   SELF.SelectCell(x,y,xs,ys)

    SELF.Copy()

    OutString&=DupSTR(CLIPBOARD(CF_TEXT),CHOOSE(xs=1,2,0))

    OutLen=LEN(OutString)

     SETCLIPBOARD('')

    PushTempStr(OutString,OutLen)

               

ExcelClass.Open PROCEDURE(STRING OpenFile)

  CODE

     SELF.SendCommand('Application.Workbooks.Open("' & CLIP(OpenFile) &'")')

 

!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

MyProc PROCEDURE

xlo ExcelClass

O    STRING(32)  !исходный файл

N    STRING(32)  !новый файл

W    ULONG

WS   ULONG

  CODE

 

  xlo.Open(MyFile)

  O=xlo.GetProperty('Application.ActiveWorkbook')

  xlo.SendCommand('Application.Workbooks.Add')

  N=xlo.GetProperty('Application.ActiveWorkbook')

  xlo.SendCommand(CLIP(O)&'.Sheets(1).Copy(,'&clip(xlo.GetProperty(clip(N)&'.Sheets('&clip(xlo.GetProperty(clip(N)&'.Sheets.Count'))&')'))&')')

  xlo.SendCommand(CLIP(O)&'.Close()')

  xlo.SendCommand(clip(N)&'.Activate()')

  !тут перебираешь ячейки и xlo.GetCellValue и xlo.SetCellValue

 

  SELF.SendCommand('ActiveWorkBook.SaveAs("'&CLIP(LEFT(MyNewFile))&'",'& Format & ',' & Password &','&WritePassword&')')

 

 

С уважением

   Валерий Будько

  mailto:w_b...@tut.by

Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/CAOv4sAiCyT364DUAjPs%3DK5-itb1Ezt%3D5dhyUehvd8RPgZZhKfg%40mail.gmail.com.

Evgeny Stefanenko

unread,
Oct 24, 2024, 8:02:21 AM10/24/24
to Rimantas Nedzinskas
Hi, Rimantas.

You wrote 24.10.24, 20:50:15:

> Давно не работал с Excel, просто мысли, куда бы я смотрел при работе с
> OfficeInside.
> 1. Скопировать файл и удалить ненужные листы (DeleteWorksheet()).
> 2. Использовать функции Copy()/Paste()

О-о-о, привет. Какие люди! :)
Как жизнь?

--
With Best Regards,
Evgeny mailto:mi...@clarionlife.net

Rimantas Nedzinskas

unread,
Oct 24, 2024, 8:27:19 AM10/24/24
to cla...@googlegroups.com
Да нормально, спасибо. 
Все еще поддерживаю старые программы на 6 Клаше ;)

Римас 

--
Вы получили это сообщение, поскольку подписаны на группу ClaList.

Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/1957975864.20241024220204%40clarionlife.net.

Evgeny Stefanenko

unread,
Oct 24, 2024, 8:58:17 AM10/24/24
to Rimantas Nedzinskas
Hi, Rimantas.

You wrote 24.10.24, 22:27:03:

> Да нормально, спасибо.
> Все еще поддерживаю старые программы на 6 Клаше ;)

Красавчик! А мы почти все. Перешли на 1с.

Rimantas Nedzinskas

unread,
Oct 24, 2024, 9:23:59 AM10/24/24
to cla...@googlegroups.com
В нашей конторе всё новое на .net теперь. И я туда двигаю.

Римас 

--
Вы получили это сообщение, поскольку подписаны на группу ClaList.

Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/1945981685.20241024225800%40clarionlife.net.

Alexander Strumensky

unread,
Oct 24, 2024, 9:27:58 AM10/24/24
to cla...@googlegroups.com
Привет.

у меня кое-что ещё на 4ке есть )))
но теперь в основном на 11 пишу (в том числе на С/С++)

чт, 24 окт. 2024 г. в 14:27, Rimantas Nedzinskas <r40...@gmail.com>:
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/CAOv4sAg%2Bc3LwW%3DN5mjUiY6zrtp0DmJfkKPvveF4U2uz0Whrxyw%40mail.gmail.com.


--
Best regards,
  Strumensky Alexander

Rimantas Nedzinskas

unread,
Oct 24, 2024, 10:09:21 AM10/24/24
to cla...@googlegroups.com
Привет , 

Интересно, для каких задач C/C++? Я так понял, Topspeed C/C++?

Римас  
 

Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/CAJ4HZHsd5E25WKh26PLByXM72AC03o2RmyGe5xT%3D3cbv8ri__g%40mail.gmail.com.

Igor Smirnov

unread,
Oct 24, 2024, 2:15:19 PM10/24/24
to Rimantas Nedzinskas

Hello Rimantas,

С удалением ненужных листов всё получилось, но....

Проблема со вставкой значений вместо формул. Ни в том, ни в другом из упомянутых наборов шаблонов функционала "PasteSpecial" нет.

Есть только простая вставка (Paste), которая вставляет из буфера те же самые формулы, что и были ранее скопированы.

Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/CAOv4sAiCyT364DUAjPs%3DK5-itb1Ezt%3D5dhyUehvd8RPgZZhKfg%40mail.gmail.com.

Валерий Будько

unread,
Oct 24, 2024, 2:34:30 PM10/24/24
to cla...@googlegroups.com

Я ж скидывал

ExcelClass.GetCellValue PROCEDURE(ULONG x, USHORT y)

    CODE

    RETURN(SELF.GetProperty('Application.Cells(' & x & ',' & y & ').Value'))

 

Этот метод копирует именно значение а не формулу.

Далее это в CLIPBOARD и простое PASTE

ExcelClass.SetProperty('Application.Cells(' & x & ',' & y & ').Value',CLIP(LEFT(CellValue)))

 

А вот этот  получить формулу из  текущей ячейки

ExcelClass.GetCellFormula PROCEDURE(<ULONG x>, <USHORT y>)

    CODE

    RETURN(SELF.GetProperty('Application.Cells(' & x & ',' &  y & ').FormulaR1C1'))

 

 

С уважением

   Валерий Будько

  mailto:w_b...@tut.by

 

Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/1656492098.20241024211508%40gmail.com.

Igor Smirnov

unread,
Oct 24, 2024, 2:42:16 PM10/24/24
to Валерий Будько

Hello Валерий,


Спасибо! Завтра на свежую голову попробую.

Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/002001db2643%2459f98270%240dec8750%24%40gmail.com.

Igor Smirnov

unread,
Oct 24, 2024, 3:17:13 PM10/24/24
to Валерий Будько

Hello Валерий,

 

Не стал ждать завтрашнего дня - попробовал.

И... да, ваш метод работает! Ура!

Однако, есть и печалька.

В моем конкретном случае область, содержащая формулы, довольно большая - это 7 столбцов, а количество строк может доходить до 100.

Ваш метод работает только для одной ячейки, поэтому придется его применять через LOOP'ы по столбцам и по строкам.

Получается, что должно обработаться поочередно 700 ячеек. Сколько на это уйдет времени, я пока смутно представляю.

И ещё один "отягчающий" момент - среди ячеек имеются объединенные, поэтому в LOOP'ах будут попадаться обращения к несуществующим ячейкам.

К чему это приведет, я тоже пока не знаю - буду завтра пробовать.

 

 



Thursday, October 24, 2024, 9:34:24 PM, you wrote:


Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/002001db2643%2459f98270%240dec8750%24%40gmail.com.

Alexander Strumensky

unread,
Oct 24, 2024, 9:04:47 PM10/24/24
to cla...@googlegroups.com
он самый. сейчас уже не много на нем, большая часть вся на кларе. но есть вещи, которые проще и понятнее писать на С, ибо на Кларе приходится извращаться.
ещё вариант применения С/С++ для исключения Клариных пролога и эпилога процедуры, как в прикрепленном примере. позволяет обойти лишнее копирование данных и дает хороший выигрыш на длинных строках.

ЗЫ: пример можно свободно пользовать, при выходе новой версии клары проверю работоспособность и сделаю правки если нужно будет.
ЗЗЫ: readme.txt нормально переводится гуглопереводчиком, если кто не понимает аглицкий

чт, 24 окт. 2024 г. в 16:09, Rimantas Nedzinskas <r40...@gmail.com>:
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/CAOv4sAgUXiu9D5hJEiWu52K4XN-KuXwjjdU-R1WZgo_g%3DXz_mA%40mail.gmail.com.
VarStr.zip

Валерий Будько

unread,
Oct 25, 2024, 3:20:36 AM10/25/24
to cla...@googlegroups.com

Вот нашел как прочиtать весь блок одной командой

Lines.Set(xlo.GetCellsValue(x,y,xs,ys)     в полученной строке строкми разделены '<13,10>' а поля в них  '<9>'

У меня есть класс для работы со строками почти как у вас

Lines StringClass

Line StringClass

Val   StringClass

Lines.SplitQ('<13,10>')

LOOP L=1 TO Lines.RecordsQ()

             Line.Set(Lines.GetQ(L))

             Line.SplitQ('<9>')

            LOOP C=1 TO Lines.RecordsQ()

                   Val.Set(Line.GetQ(C))

                   Далее значение Val.V пишешь в соотв. ячейку

                  

А можно попробовать

xlo.SetProperty('Application.Selection.Value',CLIP(LEFT(Lines.V)))   !вдруг прокатит

или

SETCLIPBOARD Lines.V)

SELF.SendCommand('Selection.Paste')

Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/761160357.20241024214206%40gmail.com.

Igor Smirnov

unread,
Oct 25, 2024, 4:20:17 AM10/25/24
to Валерий Будько

Hello Валерий,

Короче, выяснилось, что проблема не в поочередной обработке ячеек.

Практика показала, что это происходит довольно быстро - на 700 ячеек у меня ушло секунд 5 всего.

А проблема в другом - при таком "копипастинге" слетает формат ячеек.

На текстовые ячейки это не оказывает негативных последствий, а вот с числовыми беда.

В частности, слетает денежный или процентный формат - остается только "голое" число.

Например, в ячейке была формула, выдававшая "37%" - теперь там "0,37".

Excel метит такие ячейки зеленым треугольником ("число в ячейке отформатировано как текст")

Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/000001db26ae%245f199a40%241d4ccec0%24%40gmail.com.

Rimantas Nedzinskas

unread,
Oct 25, 2024, 4:50:12 AM10/25/24
to cla...@googlegroups.com
Спасибо за пример. Возможно пригодится. Есть задача на переделку одной программы.

Римас  

Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/CAJ4HZHtQg0JYUb6K12iZN0x78Jzu9OYLxvNywbw76DENtR_nGw%40mail.gmail.com.

Валерий Будько

unread,
Oct 25, 2024, 4:54:42 AM10/25/24
to cla...@googlegroups.com

Тогда такое:

ExcelClass.GetCellFormat PROCEDURE( SHORT x, SHORT y)

    CODE

    RETURN(SELF.GetProperty('Application.Cells(' & x & ',' & y & ').NumberFormat'))

 

ExcelClass.SetCellFormat PROCEDURE(STRING CellFormat, SHORT x,SHORT y)

    CODE

  IF CellFormat

    SELF.SetProperty('Application.Cells(' & x & ',' & y & ').NumberFormat','"' & CLIP(LEFT(CellFormat)) & '"')

  END

 

ExcelClass.SetCellValue PROCEDURE(STRING CellValue, , SHORT x,SHORT y, <STRING CellFormat>)

    CODE

  IF CellFormat

    SELF.SetCellFormat(CellFormat,x,y)

  END

  SELF.SetProperty('Application.Cells(' & x & ',' & y & ').Value',CLIP(LEFT(CellValue)))

Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/1405415896.20241025112009%40gmail.com.

Igor Smirnov

unread,
Oct 26, 2024, 1:53:31 PM10/26/24
to Валерий Будько

Короче, увяз я в своем Excel'е, толлком ничего не получается.

Пытался сделать решение на двух видах шаблонов:

1. OfficeInside4 (Capesoft)

2. Office (Softmasters)

Далее по тексту так и буду для краткости изх обозначать - 1 и 2.

И у тех, и у других шаблонов есть свои преимущества и недостатки. И самое печальное, что нельзя пользоваться теми и другими одновременно.

 

А. Удаление лишних листов (стоит такая задача - удалить все листы, кроме одного с заранее известным именем)

1: нет возможности получить имя активного листа, хотя перейти на лист, зная его имя, можно. Соответственно, удалить все "лишние" листы методом исключения по имени нельзя.

Но это ещё не всё. Удалить лист по номеру тоже нельзя. Нужно сначала бырать этот лист (т.е., перейти на него), а затем удалять командой. А если лист скрыт (а такие бывают), то перейти на него нельзя и удалить, соответственно, невозможно. 

И это тоже ещё не всё. После отправки команды на удаление листа Excel вывешивает предупреждение "действительно ли вы собираетесь удалить лист". Преодолеть это предупреждение "на автомате" никак не получается.

2: есть возможность получить имя активного листа, но на этом всё - т.к. функции удаления листов нет. От слова "совсем".

 

Б. Копипаст ячеек "самих в себя" с заменой формул на значения.

1: К сожалению, вместо ожидаемого "Select All - Copy - Paste" пришлось разбивать ячейки по типам (текст, число, проценты) и для каждого типа писать свой алгоритм копипастинга (а чтобы узнать типы ячеек, пришлсоь соорудить мощный парсинг с поиском ла листе ключевых фраз и соответствующим вычислением номеров столбцов и рядов). Опытным путем было выявлено, что для текстовых ячеек, содержащих текст (да-да, опечатки нет - потому что текстовые ячейки вполне могут содержать и числа) работает простой копипастинг. Для числовых ячеек сначала копирование, затем замена в скопированном тексте точек на запятые и только потом вставка в ячейку. Такой же метод работает и для ячеек, содержащих значения в процентах. Но особенно пришлось повозиться с ячейками, содержащими составные номера (например, 11.15.8 или 6.4.9). Простой копипастинг проставляет в ячейку число, если вдруг Excel'ю покажется, что это формат даты, и надо бы ее преобразовать в число дней с 1 января 1970 года (ну, или от какой начальной даты он там считает). Здесь выручил старый прием с простановкой апострофа (') перед значением - Excel воспринимает такие значения как текстовые, и сам апостроф в ячейке не показывает.

 

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

 

Но вот, что интересное я заметил. Если в Excel'е на исходном листе нажать на квадратик "начала координат" в левом верхнем углу таблицы (при этом выделятся все ячейки листа, включа неиспользуемые), затем выполнить команду "Копировать", затем на новом листе тоже нажать на "начало координат", а затем выполнить команду "Вставить", то происходит полное копирование содержимого листа вместе со всем макетом - сохраняются и шрифты, и рамки, и объединенные ячейки и вообще всё.

Вот только непонятно, как это реализовать через Clarion.

 

 

-- 
Best regards,
Igor Smirnov
.

 

 


Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/001701db26bb%2482b436b0%24881ca410%24%40gmail.com.

Andrey Kuznetsov

unread,
Oct 26, 2024, 4:25:33 PM10/26/24
to cla...@googlegroups.com

По первому пункту. Нельзя ли из клариона или запуском бат файлом создать новый ексел файл и скопировать туда нужный шиит? Оригинальный файл потом удалить командой ОС?

Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/566902742.20241026205319%40gmail.com.

Igor Smirnov

unread,
Oct 26, 2024, 5:12:30 PM10/26/24
to Andrey Kuznetsov

Hello Andrey,


Я ж про то и говорю - при простом копировании (Ctrl-C, Ctrl-V) копируются формулы из ячеек. А надо, чтобы копировались значения, а не формулы.

Это раз. А во-вторых, при таком копировании слетает форматирование - размеры столбцов, строк, рамки, шрифты и прочее.

В самом Экселе делается всё очень просто - сначала по Ctrl-A выделяются все данные, затем через команду "Специальная вставка - Вставить значения" на те же места вставляются именно значения, а не формулы, а затем по правой кнопке на ярлыке листа выбирается вариант "копировать лист в новый файл".

Но это в Эксцеле. А надо в Кларионе :-).

Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/009401db27e5%2432bad260%2498307720%24%40gmail.com.

Vladimir Urbanskiy

unread,
Oct 27, 2024, 3:18:05 AM10/27/24
to cla...@googlegroups.com
Привет!
Может через какую-нибудь промежуточную выгрузку листа в CSV?

С уважением, Владимир Урбанский.

вс, 27 окт. 2024 г. в 00:12, Igor Smirnov <imsm...@gmail.com>:

Rimantas Nedzinskas

unread,
Oct 27, 2024, 4:22:44 AM10/27/24
to cla...@googlegroups.com
А как насчет варианта написать обработку excel файла на C# и прикрутить DLL? Я так делаю, когда надо что - то прикрутить нестандартне.
На C# возможнностей разбирать Excel файлы побольше будет. Да и информации в сети как грязи. Тот же ChatGPT в помощь.   

Римас 

Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/566902742.20241026205319%40gmail.com.

Rimantas Nedzinskas

unread,
Oct 27, 2024, 4:27:34 AM10/27/24
to cla...@googlegroups.com
Если лень заморачиваться с DLL, самый простой вариант - скомпилить ЕХЕ на C# и вызывать из Клашиной программы при помощи RUN()  

Igor Smirnov

unread,
Oct 27, 2024, 4:28:55 AM10/27/24
to Vladimir Urbanskiy

Hello Vladimir,

А как вы форматирование (рамки, шрифты, объединенные ячейки и прочее) сохраните в CSV, стесняюсь я спросить?

--
Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/CANRHm6KF3WkDx5FqJW0bQhBqEALxmgzWHqjrxaqCqX_2DTgX7g%40mail.gmail.com.

Igor Smirnov

unread,
Oct 27, 2024, 4:32:46 AM10/27/24
to Rimantas Nedzinskas

Hello Rimantas,


Хороший вариант. Но тут у нас после 60-ти на курсы C# не принимают.

Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/CAOv4sAi5prP-AGJ35WHcYYGc0DwL7mC_rHJjVdO8XPf5c%3Dvr-Q%40mail.gmail.com.

Vladimir Urbanskiy

unread,
Oct 27, 2024, 4:40:09 AM10/27/24
to cla...@googlegroups.com



Здесь я только про значения ячеек я увидел...


 Hello Andrey,


Я ж про то и говорю - при простом копировании (Ctrl-C, Ctrl-V) копируются формулы из ячеек. А надо, чтобы копировались значения, а не формулы.

Это раз. А во-вторых, при таком копировании слетает форматирование - размеры столбцов, строк, рамки, шрифты и прочее.

В самом Экселе делается всё очень просто - сначала по Ctrl-A выделяются все данные, затем через команду "Специальная вставка - Вставить значения" на те же места вставляются именно значения, а не формулы, а затем по правой кнопке на ярлыке листа выбирается вариант "копировать лист в новый файл".

Но это в Эксцеле. А надо в Кларионе :-).

 



--

вс, 27 окт. 2024 г. в 11:28, Igor Smirnov <imsm...@gmail.com>:
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/182524123.20241027112846%40gmail.com.

Rimantas Nedzinskas

unread,
Oct 27, 2024, 4:41:11 AM10/27/24
to cla...@googlegroups.com
На самом деле не так страшен черт. Я тоже не мальчик,  но как - то осилил ;)


Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/915651792.20241027113237%40gmail.com.

Rimantas Nedzinskas

unread,
Oct 27, 2024, 4:48:29 AM10/27/24
to cla...@googlegroups.com
Вот решение первой задачи от ChatGPT. Я не проверял, но код вполне читабельный :

using System;
using Microsoft.Office.Interop.Excel;

namespace ExcelWorksheetCopy
{
    class Program
    {
        static void Main(string[] args)
        {
            Application excelApp = new Application();
            Workbook sourceWorkbook = null;
            Workbook newWorkbook = null;

            try
            {
                // Open the source workbook
                string sourcePath = @"C:\path\to\your\sourceWorkbook.xlsx";
                sourceWorkbook = excelApp.Workbooks.Open(sourcePath);

                // Create a new workbook
                newWorkbook = excelApp.Workbooks.Add();

                // Copy the worksheet from the source workbook
                Worksheet sourceWorksheet = (Worksheet)sourceWorkbook.Worksheets[1]; // Assuming we want the first worksheet
                sourceWorksheet.Copy(newWorkbook.Worksheets[1]);

                // Optional: Save the new workbook to a specific location
                string newPath = @"C:\path\to\your\newWorkbook.xlsx";
                newWorkbook.SaveAs(newPath);

                Console.WriteLine("Worksheet copied successfully!");
            }
            catch (Exception ex)
            {
                Console.WriteLine("An error occurred: " + ex.Message);
            }
            finally
            {
                // Clean up resources
                sourceWorkbook?.Close(false);
                newWorkbook?.Close(true); // Save changes if needed
                excelApp.Quit();

                // Release COM objects
                System.Runtime.InteropServices.Marshal.ReleaseComObject(sourceWorkbook);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(newWorkbook);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
            }
        }
    }
}


Rimantas Nedzinskas

unread,
Oct 27, 2024, 4:55:18 AM10/27/24
to cla...@googlegroups.com
Вот решение второй задачи для одной ячейки о т ChatGPT. Не проверял:

using System;
using Microsoft.Office.Interop.Excel;

namespace ExcelCellValueCopy

{
    class Program
    {
        static void Main(string[] args)
        {
            Application excelApp = new Application();
            Workbook workbook = null;
            Worksheet worksheet = null;

            try
            {
                // Open the workbook
                string workbookPath = @"C:\path\to\your\workbook.xlsx";
                workbook = excelApp.Workbooks.Open(workbookPath);
                worksheet = (Worksheet)workbook.Worksheets[1]; // Use the desired worksheet index or name

                // Specify the cell you want to process
                Range cell = worksheet.Range["A1"]; // Change "A1" to the target cell address

                // Check if the cell has a formula
                if (cell.HasFormula)
                {
                    // Get the cell's value
                    object cellValue = cell.Value;

                    // Clear the formula, keeping the cell's format intact
                    cell.Formula = "";  // Removes the formula from the cell
                    cell.Value = cellValue;  // Sets the cell's value to the previously obtained value

                    Console.WriteLine("Cell formula replaced with its value while preserving formatting.");
                }
                else
                {
                    Console.WriteLine("The cell does not contain a formula.");
                }

                // Save the workbook
                workbook.Save();

            }
            catch (Exception ex)
            {
                Console.WriteLine("An error occurred: " + ex.Message);
            }
            finally
            {
                // Clean up resources
                workbook?.Close(true); // Save changes if needed

                excelApp.Quit();

                // Release COM objects
                System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
            }
        }
    }
}

Валерий Будько

unread,
Oct 28, 2024, 3:04:48 AM10/28/24
to cla...@googlegroups.com

 

 

С уважением

   Валерий Будько

  mailto:w_b...@tut.by

 

From: cla...@googlegroups.com <cla...@googlegroups.com> On Behalf Of Igor Smirnov
Sent: Saturday, October 26, 2024 8:53 PM
To: Валерий Будько <cla...@googlegroups.com>
Subject: Re: {ClaList:13364} Excel

 

Короче, увяз я в своем Excel'е, толлком ничего не получается.

Пытался сделать решение на двух видах шаблонов:

1. OfficeInside4 (Capesoft)

2. Office (Softmasters)

Далее по тексту так и буду для краткости изх обозначать - 1 и 2.

И у тех, и у других шаблонов есть свои преимущества и недостатки. И самое печальное, что нельзя пользоваться теми и другими одновременно.

 

А. Удаление лишних листов (стоит такая задача - удалить все листы, кроме одного с заранее известным именем)

1: нет возможности получить имя активного листа, хотя перейти на лист, зная его имя, можно. Соответственно, удалить все "лишние" листы методом исключения по имени нельзя.

ExcelClass.GetSheetName        PROCEDURE(<SHORT Sheet>)

  CODE

    IF Sheet

      RETURN SELF.GetProperty('Sheets(' & Sheet & ').Name')

    ELSE

      RETURN SELF.GetProperty('ActiveSheet.Name')

    END

Но это ещё не всё. Удалить лист по номеру тоже нельзя. Нужно сначала бырать этот лист (т.е., перейти на него), а затем удалять командой. А если лист скрыт (а такие бывают), то перейти на него нельзя и удалить, соответственно, невозможно. 

И это тоже ещё не всё. После отправки команды на удаление листа Excel вывешивает предупреждение "действительно ли вы собираетесь удалить лист". Преодолеть это предупреждение "на автомате" никак не получается.

2: есть возможность получить имя активного листа, но на этом всё - т.к. функции удаления листов нет. От слова "совсем".

 

Б. Копипаст ячеек "самих в себя" с заменой формул на значения.

1: К сожалению, вместо ожидаемого "Select All - Copy - Paste" пришлось разбивать ячейки по типам (текст, число, проценты) и для каждого типа писать свой алгоритм копипастинга (а чтобы узнать типы ячеек, пришлсоь соорудить мощный парсинг с поиском ла листе ключевых фраз и соответствующим вычислением номеров столбцов и рядов). Опытным путем было выявлено, что для текстовых ячеек, содержащих текст (да-да, опечатки нет - потому что текстовые ячейки вполне могут содержать и числа) работает простой копипастинг. Для числовых ячеек сначала копирование, затем замена в скопированном тексте точек на запятые и только потом вставка в ячейку. Такой же метод работает и для ячеек, содержащих значения в процентах. Но особенно пришлось повозиться с ячейками, содержащими составные номера (например, 11.15.8 или 6.4.9). Простой копипастинг проставляет в ячейку число, если вдруг Excel'ю покажется, что это формат даты, и надо бы ее преобразовать в число дней с 1 января 1970 года (ну, или от какой начальной даты он там считает). Здесь выручил старый прием с простановкой апострофа (') перед значением - Excel воспринимает такие значения как текстовые, и сам апостроф в ячейке не показывает.

Я в переписке скидывал как скопировать лист excel как есть, не надо ничего форматировать и т.д.

Все работает  в старых пригах до сих пор.

Сейчас я уже этим не пользуюсь-пишу файлы xlsx напрямую

Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/566902742.20241026205319%40gmail.com.

Валерий Будько

unread,
Oct 28, 2024, 3:21:58 AM10/28/24
to cla...@googlegroups.com

 

Так я ж скидывал это решение, только на кларионе

 

С уважением

   Валерий Будько

  mailto:w_b...@tut.by

 

Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/CAOv4sAhuuHhQqUPDmH3WLY_L7hFahgnd4-zycxwvODuis-Sm6Q%40mail.gmail.com.

Валерий Будько

unread,
Oct 28, 2024, 3:24:10 AM10/28/24
to cla...@googlegroups.com

И вот что про PasteSpecial

 

xlPasteValues equate(-4163)

 

SELF.SendCommand('Selection.PasteSpecial(' & xlPasteValues & ',0,false,0,false,0)')

 

Возможно можно и так, но я этим не пользовался

 

SELF.SendCommand('Selection.PasteSpecial(' & xlPasteValues & ')')

 

 

 

С уважением

   Валерий Будько

  mailto:w_b...@tut.by

 

From: cla...@googlegroups.com <cla...@googlegroups.com> On Behalf Of Rimantas Nedzinskas


Sent: Sunday, October 27, 2024 11:55 AM
To: cla...@googlegroups.com
Subject: Re: {ClaList:13375} Excel

 

Вот решение второй задачи для одной ячейки о т ChatGPT. Не проверял:

Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/CAOv4sAhuuHhQqUPDmH3WLY_L7hFahgnd4-zycxwvODuis-Sm6Q%40mail.gmail.com.

Валерий Будько

unread,
Oct 28, 2024, 3:33:38 AM10/28/24
to cla...@googlegroups.com

А что бы всякие диалоги не мешали

 

                  xlo.SetProperty('Application.ScreenUpdating',False)

                    xlo.SetProperty('Application.Calculation',xlCalculationManual)

                    xlo.SetProperty('Application.DisplayAlerts',False)

                    xlo.SetProperty('Application.EnableEvents',False)

а перед согранением все обратно

                   xlo.SetProperty('Application.ScreenUpdating',True)

                   xlo.SetProperty('Application.EnableEvents',True)

                  xlo.SetProperty('Application.Calculating',xlCalculationAutomatic)

                  xlo.SendCommand('Application.Calculate')

  

 

                   

 

С уважением

   Валерий Будько

  mailto:w_b...@tut.by

 

Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/004b01db290a%245b035b40%24110a11c0%24%40gmail.com.

ПОЛОВИНКИН СЕРГЕЙ АЛЕКСАНДРОВИЧ

unread,
Oct 28, 2024, 3:44:41 AM10/28/24
to cla...@googlegroups.com
Я бы так делал.
Записал макрос, который копирует  лист1 в новый,
потом выделяется область приемника, Copy, PasteSpecial
туда же.
 
Sub Макрос11()
'
' Макрос11 Макрос
'
'
   Sheets("Лист1").Select
    Sheets("Лист1").Copy Before:=Sheets(1)
    Cells.Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
   
End Sub
 
нужно перевести команды в Office (Softmasters) как-то так
!xlPasteValues =-4163
!xlNone = -4142
SELF.SendCommand('
Selection.PasteSpecial Paste:='&-4163&', Operation:='&-4142&', SkipBlanks  :=False, Transpose:=False'
')
-- 
С уважением,
Сергей Половинкин
 
 
 
 
 
27.10.2024, 12:56, "Rimantas Nedzinskas" <r40...@gmail.com>:
ВНЕШНЯЯ ПОЧТА | Будьте ОСТОРОЖНЫ, особенно со ссылками и вложениямиНаправляйте подозрительные письма в адрес отдела информационной безопасности
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/CAOv4sAhuuHhQqUPDmH3WLY_L7hFahgnd4-zycxwvODuis-Sm6Q%40mail.gmail.com.

Валерий Будько

unread,
Oct 28, 2024, 3:54:23 AM10/28/24
to cla...@googlegroups.com

Вот получился метод

 

ExcelClass.PasteSpecial        PROCEDURE(SHORT paste=xlPasteValues,SHORT oper=0,BYTE SkipBlanks=False,BYTE Transpose=False)

  CODE    

    SELF.SendCommand('Selection.PasteSpecial('&xlPasteValues&','&oper&','&SkipBlanks&','&Transpose&')')

 

С уважением

   Валерий Будько

  mailto:w_b...@tut.by

 

From: 'ПОЛОВИНКИН СЕРГЕЙ АЛЕКСАНДРОВИЧ' via ClaList <cla...@googlegroups.com>

Sent: Monday, October 28, 2024 10:45 AM
To: cla...@googlegroups.com

Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/57261291730098773%40mail.yandex.ru.

Дмитрий Осипов

unread,
Oct 28, 2024, 4:16:43 AM10/28/24
to cla...@googlegroups.com
Добрый день всем
Вот сел и накидал рабочий пример для SoftMasters
 
MSExcel1.AddSheet(1)
MSExcel1.SetSheetName(1,'Тест')
 
LOOP i#=MSExcel1.GetSheetCount() to 1 by -1
    if MSExcel1.GetProperty('Sheets('&i#&').Name')<>'Тест'
        MSExcel1.SendCommand('Sheets('&i#&').delete')
    end
END
 
MSExcel1.Assign(1,1,10)
MSExcel1.Assign(2,1,30)
 
MSExcel1.Select('A3')
MSExcel1.ExecFunction('=A1/A2')
MSExcel1.SetNumberFormat('0%')
 
MSExcel1.Select('A1:A3')
MSExcel1.SetProperty('Selection.Borders(7).Weight',2)
MSExcel1.SetProperty('Selection.Borders(8).Weight',2)
MSExcel1.SetProperty('Selection.Borders(9).Weight',2)
MSExcel1.SetProperty('Selection.Borders(10).Weight',2)
MSExcel1.SetProperty('Selection.Borders(11).Weight',2)
MSExcel1.SetProperty('Selection.Borders(12).Weight',2)
MSExcel1.SetProperty('Selection.Interior.Color', 65535)
 
MSExcel1.SendCommand('Selection.Copy')
MSExcel1.Select('C1')
MSExcel1.SendCommand('Selection.PasteSpecial(12)')
MSExcel1.SendCommand('Selection.PasteSpecial(-4122)')
 
 
 
 
 
Понедельник, 28 октября 2024, 10:54 +03:00 от Валерий Будько <wbu...@gmail.com>:
 
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/005901db290e%2496a2bc50%24c3e834f0%24%40gmail.com.
 
 
С уважением,
Дмитрий Осипов
zh_dis...@mail.ru
 

Igor Smirnov

unread,
Oct 28, 2024, 5:03:48 AM10/28/24
to Валерий Будько

Hello Валерий,

Попробовал этот ваш метод К сожалению, не заработал. Вставляет обратно формулы, а не значения.

Придется делать SETCLIPBOARD()/CLIPBOARD() перебором ячеек

Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/005901db290e%2496a2bc50%24c3e834f0%24%40gmail.com.

ПОЛОВИНКИН СЕРГЕЙ АЛЕКСАНДРОВИЧ

unread,
Oct 28, 2024, 5:45:26 AM10/28/24
to cla...@googlegroups.com
ищите ошибку,
макрос на VB работает.
например oper=0 должен быть oper=-4142
 
и на VB более правильно делать
With ActiveSheet.UsedRange.Cells
  .Value = .Value
End With
-- 
С уважением,
Сергей Половинкин
 
Менеджер по продукту в области ИТ
Направление ИС по производству и цепочке поставок
Дирекция по информационным системам АО АВТОВАЗ
 
 
 
28.10.2024, 13:04, "Igor Smirnov" <imsm...@gmail.com>:
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/368540551.20241028120337%40gmail.com.

Валерий Будько

unread,
Oct 28, 2024, 6:35:52 AM10/28/24
to cla...@googlegroups.com

Я не проверял, надо подбирать

Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/22586111730107267%40mail.yandex.ru.

Igor Smirnov

unread,
Oct 28, 2024, 7:33:32 AM10/28/24
to 'Дмитрий Осипов' via ClaList

Hello 'Дмитрий,

Проверил.

На практике оказалось, что этой команды...

MSExcel1.SendCommand('Selection.PasteSpecial(12)')

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

А вот эта команда...

MSExcel1.SendCommand('Selection.PasteSpecial(-4122)')

разделяет объединенные ячейки и вставляет обратно формулы, а не значения.

 

P.S. Я тут слегка "доработал" шаблоны Softmasters. Добавил функционал "Select All"

 

abexcel.inc - добавил:

SelectAll             PROCEDURE(),VIRTUAL

 

abexcel.clw - добавил:

MSExcelClass.SelectAll         PROCEDURE()

  CODE

    SELF.SendCommand('Cells.Select')

Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/1730103393.594790315%40f326.i.mail.ru.

Igor Smirnov

unread,
Oct 28, 2024, 7:42:36 AM10/28/24
to Igor Smirnov

Эх, поспешил радостно отрапортовать.

Короче

MSExcel1.SendCommand('Selection.PasteSpecial(12)')

почему-то тоже иногда разделяет объединенные ячейки, а иногда нет.

Закономерности я не обнаружил.

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

Отличие между файлами - только в количестве строк в таблице.

Заголовки над таблицами (и соответственно, объединенные ячейки) - одни и те же.

Но вот почему-то эта команда сохраняети объединенные ячейки во втором файле (где в таблице пара строк всего) - и над и под таблицей

А во втором файле (там в таблице около 50 строк) разделяет объединенные ячейки - и тоже и над, и под таблицей

Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/1651315300.20241028143320%40gmail.com.

Дмитрий Осипов

unread,
Oct 28, 2024, 8:12:08 AM10/28/24
to cla...@googlegroups.com
 
Имя
ЗначениеОписание
xlPasteAll-4104Все будет вставлено.
xlPasteAllExceptBorders7Все, кроме границ, будет вставлено.
xlPasteAllMergingConditionalFormats14Все будет вставлено, и условные форматы будут объединены.
xlPasteAllUsingSourceTheme13Все будет вставлено с помощью темы источника.
xlPasteColumnWidths8Вставляется ширина скопированного столбца.
xlPasteComments-4144Примечания вставляются.
xlPasteFormats-4122Скопированный исходный формат вставлен.
xlPasteFormulas-4123Формулы вставляются.
xlPasteFormulasAndNumberFormats11Вставляемые формулы и числовые форматы.
xlPasteValidation6Проверки вставляются.
xlPasteValues-4163Значения вставляются.
xlPasteValuesAndNumberFormats12
Значения и числовые форматы вставляются.
 
 
 
Понедельник, 28 октября 2024, 14:42 +03:00 от Igor Smirnov <imsm...@gmail.com>:
 
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/1455632899.20241028144227%40gmail.com.

Igor Smirnov

unread,
Oct 28, 2024, 2:52:16 PM10/28/24
to 'Дмитрий Осипов' via ClaList

Hello 'Дмитрий,

Ну, в-общем, всё задуманное у меня получилось. Благодарю за помощь.

Хотелось бы, конечно, ускорения отработки, ибо сейчас она идет достаточно медленно.

И вот, почему.

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

приходится делать мощный парсинг  с пробежкой по всем ячейкам. Что-то типа такого:

LOOP row#=1 TO 200

  LOOP col#=1 TO 10

    IF INSTRING('Адрес объекта',MSExcel.Read(row#,col#),1,1)

      LOC:Address = Read(row#,col#+1)

   END 

    IF INSTRING('Дата составления',MSExcel.Read(row#,col#),1,1)

      LOC:DocDate = Read(row#,col#+1)

   END 

....

  END

END

А все потому, что у Softmasters Office Templates нету функционала поиска и возврата координат текущей ячейки.

Собственно, поиск еще как-то можно реализовать через грамотный вызов "SendCommand".

Но вот как прочитать координаты ячейки с найденным текстом?

Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/1730117519.966587854%40f752.i.mail.ru.

Дмитрий Осипов

unread,
Oct 29, 2024, 2:21:47 AM10/29/24
to cla...@googlegroups.com
А зачем так жизнь себе усложнять :)
 
Rows#=MSExcel1.GetProperty('ActiveSheet.UsedRange.Rows.Count') !Заполненных строк на листе
message(Rows#,'Строк')
 
Column_#=MSExcel1.GetProperty('ActiveSheet.UsedRange.Find("30").column') !Столбец первого вхождения числа 30 
message(Column_#,'Column')
 
Row_#=MSExcel1.GetProperty('ActiveSheet.UsedRange.Find("30").row') !Строка первого вхождения числа 30 
message(Row_#,'Row')
Понедельник, 28 октября 2024, 21:52 +03:00 от Igor Smirnov <imsm...@gmail.com>:
 
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/1705890722.20241028215206%40gmail.com.

Дмитрий Осипов

unread,
Oct 29, 2024, 2:48:59 AM10/29/24
to cla...@googlegroups.com
Посмотрел и инете
 
Чтобы поиск два раза не вызывать
 
addr string(10)
Addr=MSExcel1.GetProperty('ActiveSheet.UsedRange.Find("30").address')
 
 
 
Вторник, 29 октября 2024, 9:21 +03:00 от 'Дмитрий Осипов' via ClaList <cla...@googlegroups.com>:
 
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/1730182882.386401166%40f533.i.mail.ru.

Igor Smirnov

unread,
Oct 29, 2024, 4:12:59 AM10/29/24
to 'Дмитрий Осипов' via ClaList

Hello 'Дмитрий,

 

Этот вариант работает только для поиска по полному содержанию ячейки.

То есть, если, например, в ячейке записано "Дядя Вася", то 

Addr=MSExcel1.GetProperty('ActiveSheet.UsedRange.Find("Дядя Вася").address')

возвращает адрес ячейки, но

Addr=MSExcel1.GetProperty('ActiveSheet.UsedRange.Find("Дядя").address')

возвращает пустоту

 

Я тоже порылся в Интернете и попробовал сделать так:

 Addr=MSExcel1.GetProperty('ActiveSheet.UsedRange.Find("Дядя",LookAt:=xlPart).address')

... но не сработало

Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/1730184530.743824823%40f746.i.mail.ru.

Дмитрий Осипов

unread,
Oct 29, 2024, 4:42:46 AM10/29/24
to cla...@googlegroups.com
ИмяОбязательный или необязательныйТип данныхОписание
WhatОбязательныйVariantИскомые данные. Может быть строкой или любым типом данных Microsoft Excel.
AfterНеобязательныйVariantЯчейка, после которой нужно начать поиск. Соответствует положению активной ячейки, когда поиск выполняется из пользовательского интерфейса.

Обратите внимание, что параметр After должен быть одной ячейкой в диапазоне. Помните, что поиск начинается после этой ячейки; указанная ячейка не входит в область поиска, пока метод не возвращается обратно в эту ячейку.

Если не указать этот аргумент, поиск начинается после ячейки в левом верхнем углу диапазона.
LookInНеобязательныйVariantМожет быть одной из следующих констант XlFindLookIn: xlFormulas, xlValues, xlComments или xlCommentsThreaded.
LookAtНеобязательныйVariantМожет быть одной из следующих констант XlLookAt: xlWhole или xlPart.
SearchOrderНеобязательныйVariantМожет быть одной из следующих констант XlSearchOrder: xlByRows или xlByColumns.
SearchDirectionНеобязательныйVariantМожет быть одной из следующих констант XlSearchDirection: xlNext или xlPrevious.
MatchCaseНеобязательныйVariantЗначение True, чтобы выполнять поиск с учетом регистра. Значение по умолчанию — False.
MatchByteНеобязательныйVariantИспользуется только в том случае, если выбрана или установлена поддержка двухбайтовых языков. Значение True, чтобы двухбайтовые символы сопоставлялись только с двухбайтовым символами. Значение False, чтобы двухбайтовые символы сопоставлялись с однобайтовыми эквивалентами.
 
 
 
xlPart2Совпадение с любой частью текста поиска.
xlWhole1
Совпадение со всем текстом поиска.
 
Addr=MSExcel1.GetProperty('ActiveSheet.UsedRange.Find("Дядя",,,2).address')
 
А так?
Вторник, 29 октября 2024, 11:13 +03:00 от Igor Smirnov <imsm...@gmail.com>:
 
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/569340563.20241029111246%40gmail.com.

Igor Smirnov

unread,
Oct 29, 2024, 4:51:58 AM10/29/24
to 'Дмитрий Осипов' via ClaList

Hello 'Дмитрий,

 

Addr=MSExcel1.GetProperty('ActiveSheet.UsedRange.Find("Дядя",,,2).address')

Не сработало.  Возвращает пустышку.

Еще пробовал:
Addr=MSExcel1.GetProperty('ActiveSheet.UsedRange.Find("Дядя",,,LookAt:=2).address')

Тоже не работает

Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/1730191343.785834154%40f524.i.mail.ru.

Дмитрий Осипов

unread,
Oct 29, 2024, 4:59:23 AM10/29/24
to cla...@googlegroups.com
И в догонку
 
Получение всех результатов поиска
 
vrange"=MSExcel1.GetProperty('ActiveSheet.UsedRange')
obj"=MSExcel1.GetProperty(clip(vrange")&'.Find("Дядя",,,2)')
objFirst"=MSExcel1.GetProperty(clip(obj")&'.Address')
loop while obj"<>''
    message(MSExcel1.GetProperty(clip(obj")&'.Address'),'Адрес')
    obj"=MSExcel1.GetProperty(clip(vrange")&'.FindNext('&clip(obj")&')')
    if objFirst"=MSExcel1.GetProperty(clip(obj")&'.Address') then break.
end
Вторник, 29 октября 2024, 11:42 +03:00 от 'Дмитрий Осипов' via ClaList <cla...@googlegroups.com>:
 
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/1730191343.785834154%40f524.i.mail.ru.

Igor Smirnov

unread,
Oct 29, 2024, 6:10:46 AM10/29/24
to 'Дмитрий Осипов' via ClaList

Hello 'Дмитрий,

Кажись, разобрались

Оказалось, что вот в таком виде...

Addr=MSExcel1.GetProperty('ActiveSheet.UsedRange.Find("Дядя",,,2).address')  

...работает  только, если в искомой ячейке не формула, а статическое значение.

А если там формула, то для поиска по значению надо использовать такую конструкцию...

Addr=MSExcel1.GetProperty('ActiveSheet.UsedRange.Find("Дядя",,,-4163,2).address') 

 

-4163 - это значение константы xlValues

 

Причем, гораздо удобнее использовать именно числовые значения констант, ибо иначе получится слишком громоздкая конструкция:

Addr=MSExcel1.GetProperty('ActiveSheet.UsedRange.Find("Дядя",,,' & xlValues & ',' & xlPart &').address') 

Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/1730192352.221202467%40f161.i.mail.ru.
Reply all
Reply to author
Forward
0 new messages