--
Вы получили это сообщение, поскольку подписаны на группу ClaList.
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.
Просмотреть это обсуждение в Сети можно по адресу https://groups.google.com/d/msgid/clalist/1748830745.20240306154656%40asb.by.
--
Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/clalist/535245845.20240307085810%40asb.by.
По предоставленным очень неполным исходникам действительно сложно с ходу поставить диагноз. Я бы попросил подготовить максимально изолированное рабочее приложение, демонстрирующее проблему, завернуть в зип и выложить на любой общедоступный ресурс, либо таки вложить сюда. Как правило, в процессе такой подгтовки (отсечения всего лишнего) причина становится очевидна и вопрос решается самостоятельно. Если что, конечно поможем.
--
--
Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/clalist/725710564.20240307153212%40asb.by.
Здравствуйте, коллеги,
Есть необходимость выполнять с файлами Excel следующие операции:
1. Скопировать один из листов в новый файл (имя листа и его расположение относительно других заведомо известно)
2. Выделить область (координаты ячеек заведомо известны), скопировать ее в буфер, а затем вставить в ту же самую область, но с заменой формул значениями
Сам MS Excel на компе установлен.
Также в наличии имеются наборы шаблонов OfficeTemplate (от Softmasters) и OfficeInside (от Capesoft), но к сожалоению я ни там, ни там не смог найти готовых подходящих функций.
Может, кто поможет?
--
Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/1961341343.20241024131941%40gmail.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&')')
С уважением
Валерий Будько
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/CAOv4sAiCyT364DUAjPs%3DK5-itb1Ezt%3D5dhyUehvd8RPgZZhKfg%40mail.gmail.com.
--
Вы получили это сообщение, поскольку подписаны на группу ClaList.
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/1957975864.20241024220204%40clarionlife.net.
--
Вы получили это сообщение, поскольку подписаны на группу ClaList.
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/1945981685.20241024225800%40clarionlife.net.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/CAOv4sAg%2Bc3LwW%3DN5mjUiY6zrtp0DmJfkKPvveF4U2uz0Whrxyw%40mail.gmail.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/CAJ4HZHsd5E25WKh26PLByXM72AC03o2RmyGe5xT%3D3cbv8ri__g%40mail.gmail.com.
Hello Rimantas,
С удалением ненужных листов всё получилось, но....
Проблема со вставкой значений вместо формул. Ни в том, ни в другом из упомянутых наборов шаблонов функционала "PasteSpecial" нет.
Есть только простая вставка (Paste), которая вставляет из буфера те же самые формулы, что и были ранее скопированы.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/CAOv4sAiCyT364DUAjPs%3DK5-itb1Ezt%3D5dhyUehvd8RPgZZhKfg%40mail.gmail.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'))
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/1656492098.20241024211508%40gmail.com.
Hello Валерий,
Спасибо! Завтра на свежую голову попробую.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/002001db2643%2459f98270%240dec8750%24%40gmail.com.
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.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/CAOv4sAgUXiu9D5hJEiWu52K4XN-KuXwjjdU-R1WZgo_g%3DXz_mA%40mail.gmail.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.
Hello Валерий,
Короче, выяснилось, что проблема не в поочередной обработке ячеек.
Практика показала, что это происходит довольно быстро - на 700 ячеек у меня ушло секунд 5 всего.
А проблема в другом - при таком "копипастинге" слетает формат ячеек.
На текстовые ячейки это не оказывает негативных последствий, а вот с числовыми беда.
В частности, слетает денежный или процентный формат - остается только "голое" число.
Например, в ячейке была формула, выдававшая "37%" - теперь там "0,37".
Excel метит такие ячейки зеленым треугольником ("число в ячейке отформатировано как текст")
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/000001db26ae%245f199a40%241d4ccec0%24%40gmail.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/CAJ4HZHtQg0JYUb6K12iZN0x78Jzu9OYLxvNywbw76DENtR_nGw%40mail.gmail.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.
Короче, увяз я в своем 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.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/001701db26bb%2482b436b0%24881ca410%24%40gmail.com.
По первому пункту. Нельзя ли из клариона или запуском бат файлом создать новый ексел файл и скопировать туда нужный шиит? Оригинальный файл потом удалить командой ОС?
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/566902742.20241026205319%40gmail.com.
Hello Andrey,
Я ж про то и говорю - при простом копировании (Ctrl-C, Ctrl-V) копируются формулы из ячеек. А надо, чтобы копировались значения, а не формулы.
Это раз. А во-вторых, при таком копировании слетает форматирование - размеры столбцов, строк, рамки, шрифты и прочее.
В самом Экселе делается всё очень просто - сначала по Ctrl-A выделяются все данные, затем через команду "Специальная вставка - Вставить значения" на те же места вставляются именно значения, а не формулы, а затем по правой кнопке на ярлыке листа выбирается вариант "копировать лист в новый файл".
Но это в Эксцеле. А надо в Кларионе :-).
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/009401db27e5%2432bad260%2498307720%24%40gmail.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/566902742.20241026205319%40gmail.com.
Hello Vladimir,
А как вы форматирование (рамки, шрифты, объединенные ячейки и прочее) сохраните в CSV, стесняюсь я спросить?
--
Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/CANRHm6KF3WkDx5FqJW0bQhBqEALxmgzWHqjrxaqCqX_2DTgX7g%40mail.gmail.com.
Hello Rimantas,
Хороший вариант. Но тут у нас после 60-ти на курсы C# не принимают.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/CAOv4sAi5prP-AGJ35WHcYYGc0DwL7mC_rHJjVdO8XPf5c%3Dvr-Q%40mail.gmail.com.
Hello Andrey,
Я ж про то и говорю - при простом копировании (Ctrl-C, Ctrl-V) копируются формулы из ячеек. А надо, чтобы копировались значения, а не формулы.
Это раз. А во-вторых, при таком копировании слетает форматирование - размеры столбцов, строк, рамки, шрифты и прочее.
В самом Экселе делается всё очень просто - сначала по Ctrl-A выделяются все данные, затем через команду "Специальная вставка - Вставить значения" на те же места вставляются именно значения, а не формулы, а затем по правой кнопке на ярлыке листа выбирается вариант "копировать лист в новый файл".
Но это в Эксцеле. А надо в Кларионе :-).
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/182524123.20241027112846%40gmail.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/915651792.20241027113237%40gmail.com.
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.
Так я ж скидывал это решение, только на кларионе
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/CAOv4sAhuuHhQqUPDmH3WLY_L7hFahgnd4-zycxwvODuis-Sm6Q%40mail.gmail.com.
И вот что про PasteSpecial
xlPasteValues equate(-4163)
SELF.SendCommand('Selection.PasteSpecial(' & xlPasteValues & ',0,false,0,false,0)')
Возможно можно и так, но я этим не пользовался
SELF.SendCommand('Selection.PasteSpecial(' & xlPasteValues & ')')
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.
А что бы всякие диалоги не мешали
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')
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/004b01db290a%245b035b40%24110a11c0%24%40gmail.com.
ВНЕШНЯЯ ПОЧТА | Будьте ОСТОРОЖНЫ, особенно со ссылками и вложениями Направляйте подозрительные письма в адрес отдела информационной безопасности
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/CAOv4sAhuuHhQqUPDmH3WLY_L7hFahgnd4-zycxwvODuis-Sm6Q%40mail.gmail.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&')')
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.
Понедельник, 28 октября 2024, 10:54 +03:00 от Валерий Будько <wbu...@gmail.com>:
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/005901db290e%2496a2bc50%24c3e834f0%24%40gmail.com.
Hello Валерий,
Попробовал этот ваш метод К сожалению, не заработал. Вставляет обратно формулы, а не значения.
Придется делать SETCLIPBOARD()/CLIPBOARD() перебором ячеек
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/005901db290e%2496a2bc50%24c3e834f0%24%40gmail.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/368540551.20241028120337%40gmail.com.
Я не проверял, надо подбирать
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/22586111730107267%40mail.yandex.ru.
Hello 'Дмитрий,
Проверил.
На практике оказалось, что этой команды...
MSExcel1.SendCommand('Selection.PasteSpecial(12)')
...вполне достаточно, чтобы скопировать и вставить в тот же выделенный диапазон значения вместо формул.
А вот эта команда...
MSExcel1.SendCommand('Selection.PasteSpecial(-4122)')
разделяет объединенные ячейки и вставляет обратно формулы, а не значения.
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.
Эх, поспешил радостно отрапортовать.
Короче
MSExcel1.SendCommand('Selection.PasteSpecial(12)')
почему-то тоже иногда разделяет объединенные ячейки, а иногда нет.
Закономерности я не обнаружил.
Вот я гоняю два тестовых файла - там таблицы с перечнем объектов, ценами, количеством, общей стоимостью и т.д.
Отличие между файлами - только в количестве строк в таблице.
Заголовки над таблицами (и соответственно, объединенные ячейки) - одни и те же.
Но вот почему-то эта команда сохраняети объединенные ячейки во втором файле (где в таблице пара строк всего) - и над и под таблицей
А во втором файле (там в таблице около 50 строк) разделяет объединенные ячейки - и тоже и над, и под таблицей
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/1651315300.20241028143320%40gmail.com.
Имя | Значение | Описание |
|---|---|---|
| xlPasteAll | -4104 | Все будет вставлено. |
| xlPasteAllExceptBorders | 7 | Все, кроме границ, будет вставлено. |
| xlPasteAllMergingConditionalFormats | 14 | Все будет вставлено, и условные форматы будут объединены. |
| xlPasteAllUsingSourceTheme | 13 | Все будет вставлено с помощью темы источника. |
| xlPasteColumnWidths | 8 | Вставляется ширина скопированного столбца. |
| xlPasteComments | -4144 | Примечания вставляются. |
| xlPasteFormats | -4122 | Скопированный исходный формат вставлен. |
| xlPasteFormulas | -4123 | Формулы вставляются. |
| xlPasteFormulasAndNumberFormats | 11 | Вставляемые формулы и числовые форматы. |
| xlPasteValidation | 6 | Проверки вставляются. |
| xlPasteValues | -4163 | Значения вставляются. |
| xlPasteValuesAndNumberFormats | 12 | Значения и числовые форматы вставляются. |
Понедельник, 28 октября 2024, 14:42 +03:00 от Igor Smirnov <imsm...@gmail.com>:
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/1455632899.20241028144227%40gmail.com.
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.
Понедельник, 28 октября 2024, 21:52 +03:00 от Igor Smirnov <imsm...@gmail.com>:
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/1705890722.20241028215206%40gmail.com.
Вторник, 29 октября 2024, 9:21 +03:00 от 'Дмитрий Осипов' via ClaList <cla...@googlegroups.com>:
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/1730182882.386401166%40f533.i.mail.ru.
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.
| Имя | Обязательный или необязательный | Тип данных | Описание |
|---|---|---|---|
| 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, чтобы двухбайтовые символы сопоставлялись с однобайтовыми эквивалентами. |
| xlPart | 2 | Совпадение с любой частью текста поиска. |
| xlWhole | 1 | Совпадение со всем текстом поиска. |
Вторник, 29 октября 2024, 11:13 +03:00 от Igor Smirnov <imsm...@gmail.com>:
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/569340563.20241029111246%40gmail.com.
Hello 'Дмитрий,
Не сработало. Возвращает пустышку.
Тоже не работает
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/1730191343.785834154%40f524.i.mail.ru.
Вторник, 29 октября 2024, 11:42 +03:00 от 'Дмитрий Осипов' via ClaList <cla...@googlegroups.com>:
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/1730191343.785834154%40f524.i.mail.ru.
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.