Всем привет, являюсь новичком в мире VBA, тема для меня очень интересная, ее сейчас изучаю, по этой причине пишу с вопросом
У меня задача извлечь данные из открытой страницы IE, где данные представлены в виде таблицы с определенным количеством столбцов. В интернете нашел код, который подходит мне, однако он выводит значение из браузера не учитывая столбцы, идет разбивка только на строки. В интернете уже неделю пытаюсь найти способ разделения данных на столбцы Сам код представлен ниже, буду очень благодарен в помощи
[vba]
Код
Sub d() Dim i2 As Long
a = GetIE.Document.body.innerText arr = Split(a, vbLf) Cells(1, 1).Resize(UBound(arr) + 1, 1) = Application.Transpose(arr) End Sub
Function GetIE() As Object Dim ShellApp As Object, ShellWindows As Object, i As Long Dim IEObject As Object Set ShellApp = CreateObject("Shell.Application") Set ShellWindows = ShellApp.Windows() For Each It In ShellWindows Debug.Print It.FullName If InStr(1, It.FullName, "IEXPLORE", vbTextCompare) <> 0 Then Set IEObject = It Exit For 'No need to continue.... End If Next Set GetIE = IEObject
End Function
[/vba]
Всем привет, являюсь новичком в мире VBA, тема для меня очень интересная, ее сейчас изучаю, по этой причине пишу с вопросом
У меня задача извлечь данные из открытой страницы IE, где данные представлены в виде таблицы с определенным количеством столбцов. В интернете нашел код, который подходит мне, однако он выводит значение из браузера не учитывая столбцы, идет разбивка только на строки. В интернете уже неделю пытаюсь найти способ разделения данных на столбцы Сам код представлен ниже, буду очень благодарен в помощи
[vba]
Код
Sub d() Dim i2 As Long
a = GetIE.Document.body.innerText arr = Split(a, vbLf) Cells(1, 1).Resize(UBound(arr) + 1, 1) = Application.Transpose(arr) End Sub
Function GetIE() As Object Dim ShellApp As Object, ShellWindows As Object, i As Long Dim IEObject As Object Set ShellApp = CreateObject("Shell.Application") Set ShellWindows = ShellApp.Windows() For Each It In ShellWindows Debug.Print It.FullName If InStr(1, It.FullName, "IEXPLORE", vbTextCompare) <> 0 Then Set IEObject = It Exit For 'No need to continue.... End If Next Set GetIE = IEObject
По идее, получившиеся строки надо еще раз сплитануть (Split) по какому-то разделителю (обычно vbTab). Но он что-то не просматривается в ваших строках, возможно, съедается при конвертации (потому как засунуть табуляцию в ячейку Excel - это еще надо постараться). Возможно, этот разделитель надо еще перед первым Split'ом c помощью Replace превратить в какой-то более осязаемый "несъедаемый" символ, например, тильду (~) или подчеркивание (_).
Надо бы взглянуть на исходную таблицу в Интернете. Ссылку можете дать?
По идее, получившиеся строки надо еще раз сплитануть (Split) по какому-то разделителю (обычно vbTab). Но он что-то не просматривается в ваших строках, возможно, съедается при конвертации (потому как засунуть табуляцию в ячейку Excel - это еще надо постараться). Возможно, этот разделитель надо еще перед первым Split'ом c помощью Replace превратить в какой-то более осязаемый "несъедаемый" символ, например, тильду (~) или подчеркивание (_).
Надо бы взглянуть на исходную таблицу в Интернете. Ссылку можете дать?Gustav
Скорее всего, Вам нужно у GetIE.Document.Body использовать свойство innerHTML, а не innerText. В этом случае можно опереться на имеющиеся тэги таблицы, строк и полей внутри строк.
Я не большой спец по разбору HTML, поэтому обратился к Всемирному Разуму и нашёл нечто подходящее на дружественном форуме. После небольшой правки процедура "Plangrafik" (это оригинальное название по ссылке) приобрела следующий вид, который Вы можете далее максимально адаптировать под свои нужды: [vba]
Код
Sub Plangrafik() Dim Tr As Object Dim Td As Object Dim Tab1 As Object
a = GetIE.Document.Body.innerHTML 'не .innerText
Set HTML_Content = CreateObject("htmlfile") HTML_Content.Body.innerHTML = a
Column_Num_To_Start = 1 iRow = 2 iCol = Column_Num_To_Start iTable = 0 For Each Tab1 In HTML_Content.getElementsByTagName("table") With HTML_Content.getElementsByTagName("table")(iTable) For Each Tr In .Rows For Each Td In Tr.Cells Sheets(1).Cells(iRow, iCol) = Td.innerText iCol = iCol + 1 Next Td iCol = Column_Num_To_Start iRow = iRow + 1 Next Tr End With iTable = iTable + 1 iCol = Column_Num_To_Start iRow = iRow + 1 Next Tab1 End Sub
[/vba]
Скорее всего, Вам нужно у GetIE.Document.Body использовать свойство innerHTML, а не innerText. В этом случае можно опереться на имеющиеся тэги таблицы, строк и полей внутри строк.
Я не большой спец по разбору HTML, поэтому обратился к Всемирному Разуму и нашёл нечто подходящее на дружественном форуме. После небольшой правки процедура "Plangrafik" (это оригинальное название по ссылке) приобрела следующий вид, который Вы можете далее максимально адаптировать под свои нужды: [vba]
Код
Sub Plangrafik() Dim Tr As Object Dim Td As Object Dim Tab1 As Object
a = GetIE.Document.Body.innerHTML 'не .innerText
Set HTML_Content = CreateObject("htmlfile") HTML_Content.Body.innerHTML = a
Column_Num_To_Start = 1 iRow = 2 iCol = Column_Num_To_Start iTable = 0 For Each Tab1 In HTML_Content.getElementsByTagName("table") With HTML_Content.getElementsByTagName("table")(iTable) For Each Tr In .Rows For Each Td In Tr.Cells Sheets(1).Cells(iRow, iCol) = Td.innerText iCol = iCol + 1 Next Td iCol = Column_Num_To_Start iRow = iRow + 1 Next Tr End With iTable = iTable + 1 iCol = Column_Num_To_Start iRow = iRow + 1 Next Tab1 End Sub
Спасибо большое Код выводит данные в виде таблицы но почему-то пропало оглавление
Код съедает оглавление "Магазин ХХ", как-то возможно чтоб данное оглавление осталось? У меня будет большой объём выгрузок, и все будут относится к разным магазинам, именно по оглавлению планировал искать совпадения с разными магазинами
Спасибо большое Код выводит данные в виде таблицы но почему-то пропало оглавление
Код съедает оглавление "Магазин ХХ", как-то возможно чтоб данное оглавление осталось? У меня будет большой объём выгрузок, и все будут относится к разным магазинам, именно по оглавлению планировал искать совпадения с разными магазинамиMapkycMex