Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.11.2010, 20:26   #1
Meta2
Пользователь
 
Регистрация: 28.10.2009
Сообщений: 38
По умолчанию Загрузка в Excel html-страниц, ошибки при загрузке и как их побороть

Всем доброго дня!

Прошу помощи в решении такой задачки: есть несколько сотен файлов *.asp (пример во вложении) из которых я хочу достать данные при промщи скрипта. При загрузке файла *.asp в Excel вылезает сообщение: "Ошибки во время загрузки", в котором написано следующее:
При загрузке были обнаружены ошибки в следующих областях:
Отсутствующий файл: H:\css\base.css?30
Отсутствующий файл: H:\css\jquery-ui-1.8.custom.css
Отсутствующий файл: Н:\css\jquery.autocomplete.css?1
Отсутствующий файл: Н:\css\jquery.cluetip.css?1


Текстовый просмотр файла *.asp показал, что в самом начале файла есть содержатся строки:
<link type="text/css" rel="stylesheet" href="/css/base.css?30" />
<link type="text/css" rel="stylesheet" href="/css/jquery-ui-1.8.custom.css" />
<link type="text/css" rel="stylesheet" href="/css/jquery.autocomplete.css?1" />
<link type="text/css" rel="stylesheet" href="/css/jquery.cluetip.css?1" />


Также ссылки на эти таблицы стилей содержатся и ниже по файлу.
Так как файлов более 100, и загрузка каждого из них происходит около 30 (!!!) секунд, я не могу позволить себе сидеть рядом с компьютером и нажимать "ОК" всякий раз, когда выскочит предупреждение, однако, при удалении этих строк, загрузка происходит также долго, но без ошибок.

Поэтому я решил для начала загрузить все файлы как текст, удалить строки
<link type="text/css" rel="stylesheet" href="/css/base.css?30" />
<link type="text/css" rel="stylesheet" href="/css/jquery-ui-1.8.custom.css" />
<link type="text/css" rel="stylesheet" href="/css/jquery.autocomplete.css?1" />
<link type="text/css" rel="stylesheet" href="/css/jquery.cluetip.css?1" />

сохранить файлы, а потом загрузить их повторно и достать нужные мне данные.

Я пишу такой код:
Код:
Sub ЗагрузитьФайлы()

'текущий лист в книге
Dim sh As Worksheet: Set sh = ActiveSheet

'массив имён файлов
Dim sFname As Variant

'запретим перерисовку
Application.ScreenUpdating = False

'открыли массив имён файлов
sFname = Application.GetOpenFilename(FileFilter:="ASP Files, *.asp", FilterIndex:=1, MultiSelect:=True)

'если в нём что-то есть
If IsArray(sFname) Then

    'цикл по именам для переменной i
    For i = LBound(sFname) To UBound(sFname)
    
        'открываем книгу
        Set Wb = Application.Workbooks.OpenText(sFname(i))
        
        'делаем что-то
        
        'закрываем книгу
        Wb.Close SaveChanges:=True
        
    'следующий файл
    Next i
End If

End Sub
и получаю ошибку "Compile error: Expected Function or variable" и подсвечивается слово "OpenText". я не знаю, как с этим бороться.

Моя конечная цель - достать данные из таблиц, что лежат в *.asp
Если можно загрузить *.asp оптом без какой бы то ни было конвертации, игнорируя ошибку недостающих таблиц стилей, то я буду рад и бесконечно счастлив!!!

Прошу помощи в решении этой задачи. Если попутно мне объяснят, почему не работает OpenText - будет вообще супер.

PS
В приведённом мною коде написано:
Код:
    'цикл по именам для переменной i
    For i = LBound(sFname) To UBound(sFname)
    
        'открываем книгу
        Set Wb = Application.Workbooks.Open(sFname(i))
, хотя на форуме пишут так:
Код:
    'цикл по именам для переменной i
    For i = LBound(sFname) To UBound(sFname)
    
        'открываем книгу
        Set Wb = Application.Workbooks.Open(i)
и это работает (доказательство из моего предыдущего вопроса).

Объясните, что я делаю не так. Почему надо ставить индекс для прохода массива?
Вложения
Тип файла: zip asp.zip (23.5 Кб, 17 просмотров)
Meta2 вне форума Ответить с цитированием
Старый 05.11.2010, 22:15   #2
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

А что взять надо,таблицу с грузом
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 05.11.2010, 22:17   #3
Meta2
Пользователь
 
Регистрация: 28.10.2009
Сообщений: 38
По умолчанию

Ну да, её.
Meta2 вне форума Ответить с цитированием
Старый 05.11.2010, 22:40   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

А какие данные из этих файлов надо достать?
Можно, по идее, вообще не открывать эти файлы в Excel - можно выдрать нужные данные при помощи парсинга ваших ASP как текстовых файлов.

Но это долго и сложно - немного проще формировать временные файлы ASP, макросом удаляя ВСЁ лишнее (а не только ссылки на таблицы стилей)

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

Посмотрите готовое решение для парсинга сайтов и файлов HTML
http://excelvba.ru/programmes/Parser



Последний раз редактировалось EducatedFool; 04.11.2016 в 07:36.
EducatedFool вне форума Ответить с цитированием
Старый 05.11.2010, 22:50   #5
Meta2
Пользователь
 
Регистрация: 28.10.2009
Сообщений: 38
По умолчанию

Каждый из ASP содержит таблицу с грузом.
Надо вынуть эту таблицу.
Meta2 вне форума Ответить с цитированием
Старый 05.11.2010, 23:04   #6
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Я думаю функцию сможете применить
Проще открыть потом файл HTML в Excel для извлечения таблицы.

Код:
Function PARSER_ASP(F_Name As String)
Set oFSO = CreateObject("Scripting.FileSystemObject")
Dim s, Rez As String
On Error Resume Next
Set TXT = oFSO.OpenTextFile(F_Name, 1, True)

 Dim sl
   sl = Split(TXT.readall, "<H1")(1)
   dd = Split(sl, "</TABLE>", -1)
F_Name = Replace(F_Name, "asp", "html")
Rez = "<H1" & dd(0) & "</TABLE>" & dd(1) & "</TABLE>"
Set Myfile = oFSO.CreateTextFile(F_Name)
    Myfile.Write Rez
    Myfile.Close
Set TXT = Nothing: Myfile = Nothing
 Set oFSO = Nothing
End Function
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 05.11.2010, 23:17   #7
Meta2
Пользователь
 
Регистрация: 28.10.2009
Сообщений: 38
По умолчанию

doober
Спасибо, попробую.
Meta2 вне форума Ответить с цитированием
Старый 06.11.2010, 14:50   #8
Meta2
Пользователь
 
Регистрация: 28.10.2009
Сообщений: 38
По умолчанию

doober
Спасибо, работает.

Схема, правда, получается двухпроходной:
- сперва парсинг ASP в HTML
- потом загрузка из HTML

В связи с этим вопрос: допустим, я конвертировал 150 файлов, потом мне надо конвертировать ещё 10, которые свалились в этот же каталог.

Вот этот кусок кода:
Код:
Set Myfile = oFSO.CreateTextFile(F_Name)
    Myfile.Write Rez
    Myfile.Close
затрёт существующие файлы html? Или сгенерирует ошибку? Что произойдёт, в общем? Я не спец по файловым операциям в VBA, а проверить сейчас не могу, пишу не с рабочего компа...
Meta2 вне форума Ответить с цитированием
Старый 06.11.2010, 14:55   #9
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

А не проще скачать страницу и сразу обработать,если конечно известен заранее URL

Цитата:
F_Name
это имя файла asp,если такое уже есть,то затрет.

Если вас интересует только конечный результат,независимо какими путями получен.то дайте ссылку на страницы.
Возможно получится упростить ваши мучения
Анализ,обработка данных Недорого

Последний раз редактировалось doober; 06.11.2010 в 14:59.
doober вне форума Ответить с цитированием
Старый 06.11.2010, 15:58   #10
Meta2
Пользователь
 
Регистрация: 28.10.2009
Сообщений: 38
По умолчанию

doober
Не, адрес страницы дать не могу.
То есть могу, но там всё равно вход закрыт паролем, а его я дать точно не могу.

Имеющееся решение меня вполне устраивает.
Зашёл, скачал страницы, запустил скрипт.

Первая часть скрипта преобразовала ASP в HTML, вторая загрузила эти HTML, достала из них данные и построила итоговую таблицу.

Меня всё устраивает, спасибо.

Ещё хотел вот что спросить, в одном из аналогичных скриптов я загружаю файлы через конструкцию вида:
Код:
sFname = Application.GetOpenFilename(FileFilter:="Excel Files, *.xls", FilterIndex:=1, MultiSelect:=True)

If IsArray(sFname) Then
    For i = LBound(sFname) To UBound(sFname)
        Set Wb = Application.Workbooks.Open(i)
        ...
Загружать приходится около 2000 файлов, и сам процесс загрузки (я так понимаю, в этот момент Excel строит массив имён файлов) занимает оооооооооочень много времени. Обрабатывается потом всё довольно быстро. Не подскажете, с чем связано такое долгое построение списка имён?

Ну и последний вопрос, если позволите:
Я не могу понять, что я делаю не так, когда открываю список файлов при помощи конструкции вида
Код:
sFname = Application.GetOpenFilename(FileFilter:="Excel Files, *.xls", FilterIndex:=1, MultiSelect:=True)
Почему в одном случае надо писать
Код:
sFname = Application.GetOpenFilename(FileFilter:="Excel Files, *.xls", FilterIndex:=1, MultiSelect:=True)

If IsArray(sFname) Then
    For i = LBound(sFname) To UBound(sFname)
        Set Wb = Application.Workbooks.Open(i)
а в другом
Код:
sFname = Application.GetOpenFilename(FileFilter:="Excel Files, *.xls", FilterIndex:=1, MultiSelect:=True)

If IsArray(sFname) Then
    For i = LBound(sFname) To UBound(sFname)
        Set Wb = Application.Workbooks.Open(sFname(i))
иначе получаю ошибку, что файл не существует. Код абсолютно одинаковый, тиражирован методом copy/paste, но в одлном случае работает, а в другом - нет.
Meta2 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибки при загрузке Windows Syltan Операционные системы общие вопросы 6 20.04.2010 15:05
Как обработать ошибки при скачке html-страниц? delphyok Работа с сетью в Delphi 6 14.08.2009 14:06
ПРИ ЗАГРУЗКЕ ВИНДЫ ДАЕТ ВЫБОР ИЗ 3, КАК УБРАТЬ 2? iukash Windows 3 01.05.2009 14:04
как сделать на своем сайте возможность устанавливать его, как стартовую страницу при загрузке броузера Chaynik Помощь студентам 2 02.03.2009 23:10
Ошибка при загрузке файла html Ign Microsoft Office Excel 1 11.11.2007 13:55