Страницы: 1
RSS
Парсер VBA
 
Добрый день!  
 
Есть парсер, который вызывается n-ное кол-во раз из другой фунции:  
 
Dim oIE As Object  
Dim oSheet As Excel.Worksheet  
Dim jjj As DataObject  
Dim wb As Workbook  
Set wb = Workbooks("fs_pars.xlsm")  
Set jjj = New DataObject  
Set oIE = CreateObject("internetexplorer.application")  
oIE.Navigate "с:\temp\" & page_s & "index.html"  
Do While (oIE.ReadyState <> 4)  
Loop  
oIE.Visible = 0  
jjj.SetText oIE.document.Body.innertext  
jjj.PutInClipboard  
Application.DisplayAlerts = False  
Set oSheet = wb.Worksheets.add()  
oSheet.Name = "Temp"  
wb.Worksheets("Temp").Activate  
wb.Worksheets("Temp").Cells.NumberFormat = "@"  
wb.Worksheets("Temp").Cells(1, 1).Select  
wb.Worksheets("Temp").Paste  
Set jjj = Nothing  
oIE.Quit  
Set oIE = Nothing  
If page_s = "" Then page_s = "1"  
End Sub  
 
Он работает, но переодически выдаёт ошибку на строчке jjj.PutInClipboard:  
Run-time error '-2147221040(800401d0)':  
DataObject:PutInClipboard Ошибка при вызове OpenClipboard  
 
Подскажите в чём ошибка пожалуйста!
 
вряд ли буду прав, но может быть это как-то связано с переполнением буфера?
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
{quote}{login=nerv}{date=15.08.2011 06:35}{thema=}{post}вряд ли буду прав, но может быть это как-то связано с переполнением буфера?{/post}{/quote}  
При ошибке можно зайти в дебаг и продолжить - всё продолжается до следующей такой же ошибки. Буфер пробовал очищать функцией  
Private Declare Function OpenClipboard Lib "user32" (ByVal hWnd As Long) As Long  
Private Declare Function EmptyClipboard Lib "user32" () As Long  
Private Declare Function CloseClipboard Lib "user32" () As Long  
 
Private Function rClipboard()  
Dim X As Long, a As Long  
   a = OpenClipboard(0&)  
   X = EmptyClipboard()  
   a = CloseClipboard()  
End Function  
 
Не помогает.
 
> Есть парсер, который вызывается n-ное кол-во раз из другой фунции  
 
Может, не стОит каждый раз создавать и удалять объекты? Попробуйте  
 
'код модуля  
 
Dim oIE As Object  
Dim jjj As DataObject  
 
'код парсера  
 
if oIE is nothing then Set oIE = CreateObject("internetexplorer.application")  
if jjj is nothing then Set jjj = New DataObject  
 
'эти строки переместить в Sub auto_close  
 
Set jjj = Nothing  
oIE.Quit  
Set oIE = Nothing
 
Кстати, IE и сам может помещать данные в буфер обмена, так что, наверно, можно обойтись без DataObject:  
http://www.potolook.ru/blog/p,213/
 
Спасибо, но не получилось, всё та же ошибка (((  
Кстати ещё такой синдром:  
если поставить обработчик ошибок, который выдерживает небольшую паузу и включает дальнейшее выполнение макроса, то jjj.PutInClipboard выполняется как следует, но на какой-то итерации ошибка становится постоянной, т.е. паузы уже не помогают. Такое ощущение что где-то что-то переполняется, только где и как очистить? :)
 
А зачем вообще буфер обмена использовать? У Вас же есть текст (oIE.document.Body.innertext). Разбейте его на строки функцией Split, загрузите в столбец, потом Данные - Текст по столбцам. При разделении текста по ячейкам при вставке Excel использует параметры, заданные для метода RangeToColumns. Так что должно получиться то же самое.  
Если будут затруднения, выложите пример HTML файла.
 
А пробовали HTML прямо в Экселе открывать?  
Если там нет сложного форматирования, и текст не формируется скриптами, то, в принципе, должно то же самое получиться.
Страницы: 1
Читают тему
Наверх