• 🚨 Ещё можно успеть на курс «OSINT: технология боевой разведки» от Академии Кодебай

    🔍 Изучите методы разведки с использованием открытых источников (OSINT) для проведения успешных атак.
    🛠️ Освойте ключевые инструменты, такие как Maltego, TheHarvester и другие.
    🧪 Пройдите практические лабораторные работы, имитирующие реальную разведку.
    🧠 Развивайте навыки, которые помогут вам стать экспертом в области информационной безопасности.

    Запись открыта до 23 мая Подробнее о курсе ...

Ms Excel 97, Ole, Pivottable и проблемы :-)

  • Автор темы Автор темы dobozy
  • Дата начала Дата начала
D

dobozy

Всем привет!

Есть такая проблемка. Требует отчёт, который будет генерится на MS Excel 97 шедульным агентом (что поделаешь так задумано). Скрипт создаёт PivotTable, форматирует её и всё такое. Всё бы ничего, но есть такие проблемы (ма):

1. Call xl.workbooks(1).Close(false, false) не работает ("OLE automation error")
Причём это не работает только для workbook-a на котором создан PivotTable через метод Wizard.

2. Если закрыть на это глаза, то xl.Quit всё решает, но:
  • работает на W2000 Server
  • На XP - Excel crash происходит и инстанс остаётся висеть в памяти

Код примерно так выглядит

Set xl = createObject("excel.Application")
...
Call xl.Workbooks.OpenText(f.FilePath)
...
Call xl.ActiveWorkbook.WorkSheets.Add
Call xl.WorkSheets(1).PivotTableWizard(1, cDataSourceName & "1!" & maxSelectionRange, "Sheet1!R5C1", g_ReportHeading, , , , False, , , , True)
...
xl.displayalerts = False
Сall xl.workbooks(1).SaveAs(strReportFilename, -4143)
Call xl.workbooks(1).Close(False, False) 'Call xl.workbooks.close тоже не работает, флаг Saved = True
Call xl.Quit
Set xl = Nothing

Что кто скажет? Спасибо!
 
Почему в одном месте xl.ActiveWorkbook, а в другом xl.workbooks(1)? Может везде xl.ActiveWorkbook использовать?
 
Я так понял это не имеет значения... Я и так и так использовал...
 
Здесь второй параметр - имя файла.
Call xl.workbooks(1).Close(False, False)
 
в коде удивляет создания пивотныхтаблов (а что - рэндж зафиксировать низя?)...
мобуть - просто создать таблу (исходных данных) по-максимуму строк и менять её, а пивотную - пересчитывать...

значить вот...
запуск шедульных активХэ - это непредсказуемое (страшно-глючное) поведение приложения
воизбежании таких мук, хайлирекоменд - перепишите код для ОО (Сергей приводил пример работы с ХМЛ для ОДФ-а), где сможете обойтись без МСкостылей
да - это отнимет время, но получите предсказуемый результат и кроссплатформенность как бонус :(

ОДФ документирован и стандартизован:


 
мобуть - просто создать таблу (исходных данных) по-максимуму строк и менять её, а пивотную - пересчитывать...
думаю, что речь идет не о шаблоне, а о создании док-та с "нуля"

воизбежании таких мук, хайлирекоменд - перепишите код для ОО
одно дело писать для "себя", либо для заказчика с "нуля" :( другое дело - доработка существующего приложения и такое изменение архитектуры не за минуту решается...
 
а что мешает сделать шаблон?
 
Здесь второй параметр - имя файла.
Call xl.workbooks(1).Close(False, False)

Верно, это строку просто писал по памяти. Эти все параметры необязатeльны. Идущие следом варианты не работают тоже:
close()
close(false)
close(false, strReportFilename)

в коде удивляет создания пивотныхтаблов (а что - рэндж зафиксировать низя?)...
мобуть - просто создать таблу (исходных данных) по-максимуму строк и менять её, а пивотную - пересчитывать...

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

В данной задаче шаблон намного неудобней лепить чем просто создать PivotTable.

значить вот...
запуск шедульных активХэ - это непредсказуемое (страшно-глючное) поведение приложения
воизбежании таких мук, хайлирекоменд - перепишите код для ОО (Сергей приводил пример работы с ХМЛ для ОДФ-а), где сможете обойтись без МСкостылей
да - это отнимет время, но получите предсказуемый результат и кроссплатформенность как бонус wink.gif

ОДФ документирован и стандартизован:



за ссылки спасибо, но пока я должен работать с тем, что есть. Akupaka верно подметил
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!

Курс AD