Очистка таблицы VBA

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

Графство| Шропшир Адрес| Средняя школа Адамса, Хай-стрит, Ньюпорт TF10 7BD так далее

Но я получаю следующее:

ГрафствоШропшир АдресAdams Grammar School, High Street, Newport TF10 7BD TypeBoys Grammar Ученики799

Так что нет места внутри.

Что мне не хватает?

Sub scrapeschools()



Dim ie As New SHDocVw.InternetExplorer
Dim htmldoc As MSHTML.HTMLDocument

Dim htmltable As MSHTML.htmltable

Dim tablerow As MSHTML.IHTMLElement
Dim tablecell As MSHTML.IHTMLElement
Dim tablecol As MSHTML.IHTMLElement

ie.Visible = True

ie.navigate "https://www.11plusguide.com/grammar-school-test-areas/wolverhampton-shropshire-walsall/adams-grammar-school/"

Do While ie.readyState < READYSTATE_COMPLETE Or ie.Busy
Loop

Set htmldoc = ie.document


Set htmltable = htmldoc.getElementsByTagName("table")(0)


    For Each tablerow In htmltable.Children
    
            For Each tablecell In tablerow.Children
                Debug.Print tablecell.innerText
            Next tablecell
   
    Next tablerow


End Sub
Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения &quot;многие ко многим&quot; в Laravel с методами присоединения и отсоединения
Отношения &quot;многие ко многим&quot; в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
0
0
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваши элементы в цикле не относятся к тому классу, который вы ожидаете (на основе вашего именования переменных). Это прошло без возникновения ошибки, поскольку вы объявили элементы, участвующие в цикле, в общем виде как MSHTML.IHTMLElement.

Шагом отладки может быть изучение соответствующего HTML, чтобы понять, что производит htmltable.Children.

Вы также можете добавить паруDebug.Print TypeName(foo) вызовов в свой цикл, чтобы увидеть, с чем вы на самом деле работаете:

For Each tablerow In htmltable.Children
    Debug.Print TypeName(tablerow)
    For Each tablecell In tablerow.Children
        Debug.Print TypeName(tablecell)
    Next tablecell
Next tablerow

Сначала вы работаете с разделом, затем вы зацикливаете строки таблицы, а не ячейки таблицы, следовательно, ваш сжатый вывод. Это легко исправить:

  1. Используйте свойство .Rows, чтобы убедиться, что вы зацикливаете строки таблицы.
  2. Используйте более сильную типизацию в объявлениях
Dim tablerow As MSHTML.IHTMLTableRow
Dim tablecell As MSHTML.IHTMLTableCell

For Each tablerow In htmltable.Rows
    For Each tablecell In tablerow.Children
        Debug.Print tablecell.innerText
    Next tablecell
Next tablerow


Лично я бы:

  1. Посмотрите, можно ли очистить эту страницу с помощью запросов XHR, так как это будет быстрее, и удалите IE, который больше не поддерживается.
  2. Выберите таблицу с более конкретным и, надеюсь, более стабильным с течением времени списком выбора css.
  3. Используйте буфер обмена, чтобы скопировать и вставить элемент таблицы OuterHTML в Excel. Это позволит сохранить форматирование таблицы и избежать дополнительной сложности вложенного цикла.

Другие вопросы по теме