Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 27

/ вопрос открыт /

Приветствую! Помогите пожалуйста начинающему.
Возник такой вопрос. Работаю с поздним связыванием. Прилагаю код, который загружает имена листов указанной рабочей книги
Приведённый код работает. Но бывают случаи, когда возникает ошибка OLE Error 800A9C64. При этом было выяснено, что это возникает при работе с файлом, у которого в исходном тексте имеется любой символ(ы). Исходный код - это если кликнуть правой кнопкой мыши по ярлычку и выбрать в меню "Исходный текст". Похоже, что при активации листа Эксель пытается выполнить имеющийся там "код". Как обойти эту проблему программно? Буду признателен за любую помощь. (Win XP, D7, Excel 2003)

Приложение:
  1. procedure LoadSheetNames(FName: string; aCombo: TComboBox);
  2. var
  3. Excel, WBook: OLEVariant;
  4. SheetsCount, i, x, y, k, r: Integer;
  5. begin
  6. try
  7. Excel:= GetActiveOleObject('Excel.Application');
  8. except
  9. Excel:= CreateOleObject('Excel.Application');
  10. end;
  11. try
  12. Excel.DisplayAlerts:= false;
  13. Excel.Visible := false;
  14. Excel.Workbooks.Open(FName);
  15. WBook := Excel.ActiveWorkBook;
  16.  
  17.  
  18. SheetsCount:= WBook.Sheets.Count;
  19.  
  20.  
  21. ACombo.Items.Clear;
  22. for i:= 1 to SheetsCount do
  23. ACombo.Items.Add(WBook.Worksheets[i].Name); //GLUCK
  24. ACombo.ItemIndex:= 0;
  25.  
  26. {Finalization}
  27. finally
  28. if not VarIsEmpty(Excel) then
  29. begin
  30. Excel.Quit;
  31. Excel:= Unassigned;
  32. end;
  33. WBook:= Unassigned;
  34. end;
  35. end;


Discorezzz Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Discorezzz (статус: Посетитель)
Вопрос отправлен: 7 октября 2006, 13:47
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Косолапов Дмитрий Юрьевич

Сдается мне, цикл должен быть от 0 до SheetsCount-1

Приложение:
  1. for i:= 0 to SheetsCount-1 do
  2. ACombo.Items.Add(WBook.Worksheets[i].Name);


Ответ отправил: Косолапов Дмитрий Юрьевич (статус: 8-ой класс)
Время отправки: 7 октября 2006, 13:59
Оценка за ответ: 2

Комментарий к оценке: Вы не правы. В Экселе всё нумеруется начиная с 1. Если внимательно прочитать вопрос, то будет ясно, что код работает, но выдаёт ошибку только на вышеописанных листах рабочей книги.

Ответ #2. Отвечает эксперт: ANBsoft

У меня не получилось повторить Вашу ошибку - код работает. Дайте ссылку на пример файла, на котором происходит ошибка, или уточните что значит " При этом было выяснено, что это возникает при работе с файлом, у которого в исходном тексте имеется любой символ(ы). Исходный код - это если кликнуть правой кнопкой мыши по ярлычку и выбрать в меню "Исходный текст"." - какой конкретнее символ и в чем нужно кликать по ярлычку и что за ярлычок?

Ответ отправил: ANBsoft (статус: Студент)
Время отправки: 8 октября 2006, 01:19
Оценка за ответ: 3


Мини-форум вопроса

Всего сообщений: 3; последнее сообщение — 8 октября 2006, 17:17; участников в обсуждении: 2.
Discorezzz

Discorezzz (статус: Посетитель), 8 октября 2006, 12:50 [#1]:

Извиняюсь, если сумбурно описал проблему. Поясняю. Если открыть файл в Экселе, а затем кликнуть правой кнопкой мыши по ярлычку (вкладке, закладке - выберите привычное название) внизу листа (там, где названия рабочих листов) и в выпавшем контекстном меню выбрать пункт "Исходный текст", то появится окно редактора кода VBA. В нормально открывающихся файлах там ничего нет и всё соответственно работает. Но если там есть любой символ - буква(ы), цифра(ы), неважно, то тут и проявляется проблема при обращении к такому файлу. Пример файла можно посмотреть тут - (файл удалён)
Там "ненужные" символы (ABC123) есть в коде листа "MP3". Если их оттуда убрать, то всё заработает опять нормально. Надеюсь, понятно объяснил... По идее, эта ошибка выскакивает не только при обращении к WBook.Worksheets[i].Name, но во многих других случаях (при активации области, например, или при ячейки). Могу привести полный код процедур, которые использую. Первая загружает с комбобокс список листов книги и грузит первый лист. Вторая - загружает лист с нужным номером.
ANBsoft

ANBsoft (статус: Студент), 8 октября 2006, 15:57 [#2]:

Судя по всему, Excel проверяет синтаксис макросов, записаных в листе, при обращении к листу, ошибка выскакивает даже в самом Excele при выполнении подобного макроса:
Sub Lister()
For f = 1 To ActiveWorkbook.Sheets.Count
Cells(f, 1) = ActiveWorkbook.Worksheets(f).Name
Next f
End Sub
Если добавить символы в книгу, то невозможно даже запросить WBook.Sheets.Count.
Вопрос в том, кто вставляет туда символы и зачем, если уж очень нужно, то вставляйте их начиная с "'" - коментарий в Бейсике.
Discorezzz

Discorezzz (статус: Посетитель), 8 октября 2006, 17:17 [#3]:

Вопрос кто вставляет... Это загадка :) Мне приходится иметь дело с большим кол-вом xls-файлов и периодически попадаются такие.
А нет ли такой команды, которая позволяла бы отключать проверку перед работой с рабочей книгой? Либо как-нибудь удалять оттуда текст...
Ещё хотел поинтересоваться. Для определения занятой области используют свойства либо
UsedRange (x := UsedRange.Row.Count), либо координаты последней ячейки -
Sheet.Cells.SpecialCells(xlLastCell, EmptyParam).Activate;
x := Excel.ActiveCell.Row;
Дело в том, что если кто-либо сделал форматирование всего листа, то Эксель может выдать координаты с максимальными значениями (225, 65535, либо просто с намного большей величиной)даже если текстом занято всего 100 строк, 10 столбцов. То что Эксель считает последней ячейкой можно увидеть нажав Ctrl+End на рабочем листе. При условии, что эта область присваивается вариантной матрице, то выделение памяти и время загрузки достигает огромных размеров. Нет ли более надёжного способа узнать область которая содержит текст? Либо только "вручную" пробегать по ячейкам и находить, где текста нет?

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 29 июня 2017, 17:07
Выполнено за 0.04 сек.
Рейтинг@Mail.ru