Analyze Data Tables from the Web Using Microsoft Excel
Use data from online tables inside of Microsoft Excel
PeopleImages / Getty Images
One little-known feature of Excel is its ability to import web pages. If you can access data on a website, it’s easy to convert it to an Excel spreadsheet if the page is properly set up. This import capability helps you analyze web data using Excel’s familiar formulas and interfaces.
Instructions in this article apply to Excel for Microsoft 365, Excel 2019, Excel 2016, Excel 2013, Excel 2010, and Excel for Mac.
Import Data from a Web Page
Excel is a spreadsheet application optimized for evaluating information in a two-dimensional grid. If you’re going to import data from a web page into Excel, the best format is as a table. Excel imports every table on a web page, just specific tables, or even all the text on the page.
When the imported web data is not structured, it requires restructuring before you can work with it.
Import the Data (Excel for PC)
After you’ve identified the website that contains the information you require, you can import the data directly into Excel using the From Web tool with only a few clicks, customizing import options along the way.
Here’s how to import a data table from the web on a PC:
-
Open Excel.
-
Select the Data tab and choose From Web in the Get & Transform Data group. The From Web dialog box will open.
-
Select Basic, type or paste the URL in the box, and select OK. If prompted, choose to Connect to the website.
-
In the Navigator box, select the tables to import. Excel isolates content blocks (text, tables, and graphics) if it knows how to parse them. To import more than one data asset, place a check mark next to Select multiple items.
-
After you select a table, a preview appears on the right side of the box. If it’s the table you want, select Load. The table appears in a new worksheet.
-
The right side of the screen displays the Queries & Connections pane. If you’ve imported multiple tables, select a table from the Queries & Connections pane to view it.
Edit Data Before Importing It
If the dataset you want is very large or not formatted to your expectations, modify it in the Query Editor before loading the data from the website into Excel.
In the Navigator box, select Transform Data instead of Load. Excel loads the table into the Query Editor instead of the spreadsheet. This tool opens the table in a specialized box that allows you to:
- Manage the query
- Choose or remove columns and rows in the table
- Sort data
- Split columns
- Group and replace values
- Combine the table with other data sources
- Adjust the parameters of the table
The Query Editor offers advanced functionality that’s more akin to a database environment (like Microsoft Access) than the familiar spreadsheet tools of Excel.
Work with Imported Data
After your web data loads into Excel, you’ll have access to the Query Tools ribbon. This new set of commands supports data-source editing (through the Query Editor), refreshing from the original data source, merging and appending with other queries in the workbook, and sharing the scraped data with other Excel users.
Import the Data (Excel for Mac)
You cannot import data from a website into Excel for Mac. You’ll need to save the website to your computer using your web browser’s Save As function. After you’ve saved the website, import the page’s HTML data into an Excel spreadsheet with the following method:
-
Open Excel.
-
Select Data > From HTML.
-
Navigate to the location of your saved HTML web page, select it, and select Open.
-
Excel automatically imports the entire web page into a new workbook. From here, clean up the chart to only include the needed data.
While the From HTML method for Mac isn’t as clean or controlled as the From Web option for PC, it still allows data from a web page to be imported into an Excel spreadsheet.
Thanks for letting us know!
Get the Latest Tech News Delivered Every Day
Subscribe
Power Query is an extremely useful feature that allows us to:
- connect to different data sources, like text files, Excel files, databases, websites, etc…
- transform the data based on report prerequisites.
- save the data into an Excel table, data model, or simply connect to the data for later loading.
The best part is that if the source data changes, you can update the destination results with a single click; something that is ideal for data that changes frequently.
This is analogous to recording and executing a macro. But unlike a macro, the creation and execution of the back-end code happen automatically.
If you can click buttons, you can create automated Power Query solutions.
Example #1
Import Spot Prices for Petroleum
from a Website to Excel
The first step is to connect to the data source. For this example, we will connect to the U.S. Energy Information Administration.
https://www.eia.gov/petroleum
The information we need is in a table that is part of the overall webpage.
In the “old days”, we would transfer the information from the website into Excel by highlighting the webpage table and copy/paste the data into Excel.
If you’ve ever done this, you know what a hit-or-miss proposition this can be. It’s the 50/50/90 Rule: if you have a 50/50 chance of winning, you’ll lose 90% of the time.
Even if you were to successfully transfer the information into Excel, the information is not linked to the webpage. When the webpage changes, you will need to recopy/paste (and potentially fix) the updated information.
- Begin by copying the URL from the webpage (assuming you are previewing the page in a browser). If not, you can type it into the next step’s URL prompt.
- Select Data (tab) -> Get & Transform (group) -> From Web.
- In the From Web dialog box, paste the URL into the URL field and click OK.
The Navigator window displays the components of the webpage in the left panel.
If you want to ensure you are on the correct webpage, click the tab labeled Web View to get a preview of the page in a traditional HTML format.
It is unlikely that the listed components on the left will be presented with obvious names as to which item goes to which webpage component. You may need to click from one item to the next, previewing each item in the right-side preview panel, in order to determine which belongs to the desired table.
If the data does not require any further transformations, you can click Load/Load To… to send the data directly to Excel. This will allow you to select the destination of the results data, such as a table on a new or existing worksheet, the Data Model, or create a “Connection Only” to the source data.
- In the Navigator dialog box, select the arrow next to Load and click Load To…
- In the Import Data dialog box, select “Existing worksheet” and point to a cell on your desired destination worksheet (like cell A1 on “Sheet1”).
The result is a table that is connected to a query. The Queries & Connections panel (right) lists all existing queries in this file.
If you hover over a query, an information window will appear giving you the following information:
- a preview of the data
- the number of imported columns
- the last refresh date/time
- how the data was loaded or connected to the Excel file
- the location of the source data
Although the data looks correct, we have some structural issues with the results that will cause problems with further analysis.
The empty cells in the Product column will cause problems when sorting, filtering, charting, or pivoting the data.
We need to make some adjustments to the data.
- Double-click (or right-click and choose Edit) the listed query to activate the Power Query Editor.
We want to fill down the listed products into the lower, empty cells of the Product column.
- In the Power Query Editor, select the Product column and click Transform (tab) -> Any Column (group) -> Fill -> Down.
Nothing happened.
The reason the product names failed to repeat down through the empty cells is that Power Query did not interpret the cells as empty. There may be some artifact from the webpage that exists in the cell that we can’t see.
We will replace all the “fake empty” cells with null values. This should allow the Fill Down operation to work as expected.
- Select the Changed Type step in the Query Settings panel (right).
- Select the Product column and click Transform (tab) -> Any Column (group) -> Replace Values.
- Tell Power Query that you wish to insert this new step into the existing query by clicking Insert.
- In the Replace Values dialog box, leave the “Value To Find” field empty and type “null” (no quotes) in the “Replace With” field. Click OK when finished.
If you select the previously created “Filled Down” step at the bottom of the Query Settings panel you will see the updated results of the query.
- Update the query name to “Spot Prices”.
- Click the top part of the Close & Load button at the far-left of the Home
If we were to graph the data, and the data were to change, we can refresh our graph by clicking Data (tab) -> Queries & Connections (group) -> Refresh All or right-click on the data and select Refresh.
Query Options
There are some controllable options available by selecting Data (tab) -> Queries & Connections (group) -> Refresh All -> Connection Properties…
Some of the more popular options include:
- Refresh the data every N number of minutes
- Refresh the data when opening the file
- Opting for participation during a Refresh All operation
Example #2
Import Weather Forecast
for the Next 10 Days
Imagine you work at the front desk of a popular hotel in New York City. As a customer service, you wish to supply your guests with a printout of the weather forecast for the next 10 days.
This is something that needs to be printed every day where each successive day looks at its next 10 days.
- We start by searching for a website that can supply a 10-day forecast for Seattle.
- We take the first offer in the search results that takes us to weather.com.
- Now that we have the web link to the 10-day forecast for New York City, we will copy and paste it into a web query in Excel (Data (tab) -> Get & Transform (group) -> From Web).
- Select the table from the left side of the Navigator window.
We can see from the preview that there are some columns towards the right that we are not interested in and the column headers have shifted.
- In the Navigator window, select Transform Data to load the forecast into Power Query.
- Begin editing the data by right-clicking on the header for the “Day” column and select Remove.
- Select the last 3 columns (“Wind”, “Humidity”, and “Column7”) and remove them as well.
- Rename the remaining 3 columns.
- Description -> Day
- High / Low -> Description
- Precip -> High/Low
- Rename the query “SeattleWeather”.
- On the Home tab, select the lower-part of the Close & Load button and click Close & Load To… and select Existing Worksheet from the Import Data dialog box. Click OK when complete.
We now have the weather forecast for the next 10 days.
Each day, we only need right-click the table to refresh the information.
Impressing the Boss
We really like the idea seen on the original weather.com website that displays a raincloud emoji for days that are expecting rain.
To bring a bit of fun to our report, we will have Excel display an umbrella emoji for any day that is forecasting rain or showers.
NOTE: This creative bit of Excel trickery is brought to us by our good friends Frédéric Le Guen and Oz du Soleil. Links to their blog and video detail various uses of this trick can be found at the end of this post.
The first step is to add the umbrella emoji. We will access the built-in Windows emoji library.
- On the keyboard, press the Windows key and the period to display the emoji library.
- Type the word “rain” to filter the emoji library to rain-related emojis.
- Select the umbrella with raindrops.
- Highlight the umbrella emoji in the Formula Bar and press Copy (CTRL-C) then Enter.
- Double-click the “SeattleWeather” query to launch the Power Query Editor.
The next step is to create a new column that adds the umbrella emoji for any row that contains the words “rain” or “shower” in the Description column.
- Select Add Column (tab) -> General (group) -> Conditional Column.
- The name of the new column is “Be Equipped” and the logic is “if the column named ‘Description’ contains the word ‘rain’ then display the umbrella emoji”. (Paste the umbrella emoji into the Output)
- Click the Add Clause button to create a second condition.
- The second description’s logic is “else if the column named ‘Description’ contains the word ‘shower’ then display the umbrella emoji”. (Paste the umbrella emoji into the Output)
- Click OK to add the new conditional column.
- Drag the header for “Be Equipped” so the new column lies between the “Description” and “High/Low” columns.
- Close & Load the updated query back into Excel.
Tomorrow, you only need right-click the table to load the updated 10-day weather forecast.
Interesting Links
Frédéric Le Guen’s blog post on adding emojis to your reports
Oz’s video – Emojis, Excel, Power Query & Dynamic Arrays
Practice Workbook
Feel free to Download the Workbook HERE.
Published on: December 15, 2019
Last modified: March 10, 2023
Leila Gharani
I’m a 5x Microsoft MVP with over 15 years of experience implementing and professionals on Management Information Systems of different sizes and nature.
My background is Masters in Economics, Economist, Consultant, Oracle HFM Accounting Systems Expert, SAP BW Project Manager. My passion is teaching, experimenting and sharing. I am also addicted to learning and enjoy taking online courses on a variety of topics.
Embedding Excel dashboards in a web page is a great way to securely share reports. All you need to do is save your file on OneDrive or SharePoint and get the embed code. There are different approaches required depending on whether you have OneDrive Personal, or OneDrive for Business or SharePoint. The latter two offer more security and bigger file sizes.
Watch the Video
Embedding Excel Dashboards in a Web Page — Written Instructions
First, I recommend that you define a name for the cells containing the dashboard in your workbook as this will enable you to specify just that cell range to be displayed in the web page.
OneDrive for Business or SharePoint Process
Locate your file on OneDrive for Business or SharePoint and click the Share icon:
Next, click on the default setting (1) to customise the link. My default is ‘anyone with the link can view’ but yours might be different:
IMPORTANT: If you’re embedding the workbook in a web page, then you’ll want to set the permissions to ‘Anyone with the link’ (2).
It’s possible that your SharePoint admin has blocked the option to allow anyone with the link to view the workbook. If so, you will need to consult your administrator.
TIP: If you want to prevent the workbook from being downloaded, check the ‘block download’ button in Other Settings (3).
Once you’ve chosen the settings, click Apply and then copy the link:
It should look something like this:
https://yourdomain.sharepoint.com/:x:/g/personal/your_account_name/Ebb8wJNS4c9Ek7v2AE_BasEBSva-RhFqnL9pKJONWkFXYZ?e=auWtrP
Embed Code
To use this link in a web page you need to wrap it in iframe HTML tags like so:
<iframe src="https://yourDomain.sharepoint.com/:x:/g/personal/your_account_name/Ebb8wJNS4c9Ek7v2AE_BasEBSva-RhFqnL9pKJONWkFXYZ?e=auWtrP&action=embedview&wdbipreview=true "></iframe>
Iframe Size Parameters
We can add further parameters to the iframe that control how the dashboard is displayed in the web page.
For example, with the following additions you can specify the iframe size in pixels to suit your dashboard so there are no scroll bars:
<iframe width="500" height="200" frameborder="0" scrolling="no" src="https://yourDomain.sharepoint.com/:x:/g/personal/your_account_name/Ebb8wJNS4c9Ek7v2AE_BasEBSva-RhFqnL9pKJONWkFXYZ?e=auWtrP&action=embedview&wdbipreview=true "></iframe>
Dashboard Presentation Parameters
You can also control how the dashboard appears with the following parameters which get appended to the end of the URL with an ampersand:
URL Parameter | Effect | Default |
wdHideSheetTabs=True | Hides the sheet tabs that are displayed at the bottom of all sheets in a workbook. | False |
wdAllowInteractivity=True | Lets you interact with the data if your workbook has a table or PivotTable that can be sorted and filtered. | True |
Item=itemName | Displays a specific item. If your workbook includes a chart, table, PivotTable, or named range, and you want to display only one of the items in your web page, use the Item parameter to specify that item. | Not set |
ActiveCell=CellName | Specifies the active (selected) cell in the embedded workbook when the web page opens. You can specify the active cell by cell reference (such as A1) or by name.
You can also use this parameter to define the active sheet by selecting a cell in that sheet. If you don’t specify the active cell, the last saved view will be shown. |
The last saved view will be shown. |
wdHideGridlines=True | Hides worksheet gridlines for a cleaner look. | False |
wdHideHeaders=True | Hides the column and row headers. | False |
wdDownloadButton=True | Includes the Download button so viewers can download their own copy of the workbook. |
In my code (below) I’ve included the following:
- Allowed interactivity so the Slicers work
- Hidden the sheet tabs and headers
- Specified the item name as the defined name: dashboard
- Set the active cell to one at the bottom of the defined name area so it’s not displaying in the top left by default
- I already have gridlines turned off in the Excel file page set up, so no need for this
- I don’t want people to be able to download the file, so I’ve omitted this as well as set it in the sharing permissions
My final code looks like this:
<iframe width="500" height="200" frameborder="0" scrolling="no" src="https://yourDomain.sharepoint.com/:x:/g/personal/your_account_name/Ebb8wJNS4c9Ek7v2AE_BasEBSva-RhFqnL9pKJONWkFXYZ?e=auWtrP&action=embedview&wdbipreview=True&wdAllowInteractivity=True&wdHideSheetTabs=True
&Item=dashboard&wdHideHeaders=True&ActiveCell=A35"></iframe>
Excel Web App for OneDrive for Business or SharePoint
When you load the web page, you’ll see that the bottom of the embedded dashboard has a black bar called the viewer bar. The viewer bar contains some icons that will differ depending on whether your file is saved on OneDrive for Business/SharePoint or OneDrive Personal, as well as what sharing options you allowed:
In OneDrive for Business or SharePoint, with the settings I applied in this example, the viewer bar contains the following icons:
- The Excel icon on the far left opens Office.com.
- The next icon to the right enables the user to refresh the connection to the source file and get updates, although this didn’t work for me! You can also refresh the web page to get updates.
- The last icon on the right enables you to give Microsoft feedback about the embedded spreadsheet, although when I click it for OneDrive for Business/SharePoint embedded files, nothing happens!
IMPORTANT: if you use incognito mode or Safari, you will not be able to see embedded workbooks saved on OneDrive for Business or SharePoint without logging in, so it’s best to avoid those options.
OneDrive Personal Process
The process for files saved on OneDrive Personal accounts is slightly different. Start by right-clicking the file in OneDrive, then select Embed:
The embed pane will open on the right. Click the ‘customize how this embedded workbook will appear to others’ link at the bottom:
In the customize screen you can select what you want to show. In this example file I have:
- defined a name called Slicer_chart that I want to display
- I’ve deselected ‘include a download link (however, you’ll see that this is useless with the iframe code, but more on that later)
- And I’ve allowed people to sort and filter
- Set the starting cell to one that’s hidden behind the Slicer.
Note: at step 5 you can choose from an iframe embed code format, or JavaScript by clicking the links above the code snippet.
Once you’re happy with your settings, copy the code to your web page and adjust the height and width parameters as required.
Note: even though you may have selected no scrolling, you’ll find that the web app completely ignores this despite how big you make the dimensions, likewise for the area to display!
Excel Web App for OneDrive Personal
The icons in the Viewer Bar (the black bar at the bottom) are slightly different with OneDrive Personal files vs OneDrive for Business and SharePoint. They also differ depending on whether you used the Embed code or JavaScript.
OneDrive Personal Embed Code
We’ll look at the embed code experience and functionality first. You can see in the image below there are scroll bars even though I chose no scrolling. Also, the area visible when scrolling far exceeds cells in the specified defined name, so it appears there are some issues with the web app rendering the workbook correctly.
The viewer bar at the bottom also has some additional icons that differ to the OneDrive for business or SharePoint experience:
- Launches Excel Online but doesn’t open the workbook unless you are the owner, and you are logged in to your OneDrive account.
- Refreshes the connection to the workbook.
- Is a link to give Microsoft feedback about the web app.
- Enables you to get the URL to the workbook which will open it in Excel Online. You can also get the embed code here.
- Opens the file in Excel Online where you can download a copy of the file and then edit it as you wish.
OneDrive Personal JavaScript
The JavaScript code offers more protection with the viewer bar not including any way for the user to open the file in Excel Online (unless you’re the file owner) or download it:
- Launches Excel Online but doesn’t open the workbook unless you are the owner, and you are logged in to your OneDrive account.
- Link to give Microsoft feedback about the web app.
- Is supposed to give you the URL to the workbook which will open it in Excel Online and the embed code, but the link does nothing when clicked!
Notice that there’s no Refresh button, but if you refresh the browser page it gets the updated version of the file from OneDrive.
With OneDrive for Business or SharePoint you can embed a file up to 10MB in size with up to 1000 concurrent viewers.
Heavy traffic on the embedded workbook might result in some viewers being throttled. And the availability of an embedded workbook can be impacted by the number of embedded workbooks in the data center or tenant.
With OneDrive Personal the limit is 5MB. I couldn’t find any documentation on the number of concurrent viewers, but I suspect it won’t be more than 1000, and could be less.
OneDrive Personal embedded workbooks using the Embed code are not secure, however OneDrive Personal embedded workbooks using the JavaScript are secure.
Below is a summary table of the differences:
How to quickly display data from a Microsoft Excel spreadsheet to a webpage online
At the company where I’m working we have a marketing calendar in MS Excel showing schedule for different marketing events and activities. The file is maintained by marketing and regularly updated with new speaking engagement opportunities or changes of venues to current events. And every time we updated it, we put a copy on a network or shared drive so that other people can access it. Later, we made it a little easier to access by putting a link to the Excel file on a web page.
The ways above might have worked in the past, but today when the workforce becomes more mobile and global, people want to see the spreadsheet content online with their smart phones [that don’t have Excel installed] or with their home computers [that may have Excel but with a lower version] whenever and wherever they want.
Display Excel data on a separate web page
To solve the problem, Excel has a simple but great functionality that is possibly overlooked by most users: save the spreadsheet as an HTML file (or HTM file in Excel language). The File > Save As functionality also outputs the excel tabs and charts! More information can be found on the Microsoft website.
All you need to do is to click File > Save As > Web Page (.htm). Excel will output an HTML file and a folder to hold the associated files/data. Push everything on the live server, then link to it from a web page, and your’re done.
Note: You have the options to Save As the whole workbook, or just one spreadsheet or just the printable area. Depending on what option you’ll use the file size will get bigger or smaller. For my stuff, I usually choose to Publish one sheet, and publish only the Printable area. Also, any additional format that you put on the Excel file will likely result in bigger file size such as merged cells, unnecessary bullets/format etc. For my stuff, I removed all the extra formatting when possible.
Click here to see an example of a spreadsheet saved as a web page. Don’t forget to check out the tab at the bottom.
Display Excel data on your current web page with iframe
As you can tell from the above demo, you can now see the Excel data online; however, the excel web page is a separate or stand-alone web page and doesn’t look like the rest of your site. What if you want to display the Excel data on a web page with your current website template — with the branding, logo, site navigation and everything?
Another simple solution, not perfect, but workable is to use iframe. If you don’t know what it is, get more information on W3school website. Iframe is just an HTML tag that let you hold and display information from a URL inside itself. Below is the same example above, but displayed directly on the web page.
Basically, you’ll need to add the following HTML code to your web page.
<iframe src=”http://www.yoursite.com/yourexcelfile.htm” height=”400px” width=”650px” frameborder=”0″></iframe>
Note: If your height and/or width is big enough, the corresponding scroll bar will become hidden.
Export Excel data as clean HTML, XML, JSON etc. (UPDATED 2017)
With the above Save As method the biggest shortcoming is that you have to use the code (or the file) that Excel created. Sometimes this works great, other times it doesn’t. A new challenge here is what if you don’t want to use the above method, but only want to extract or convert Excel data table into clean HTML, XML, JSON or other structured data format.
There’re softwares and tutorials out there that show you how to convert Excel data into other types. I, however, have a simple way of using Excel that let you do just this, and with my method you’re not limited to converting to only XML or JSON, but you can convert to almost anything you like. Stay tuned, it’s under way! Please add a comment so I know you’re interested.
Цель книги – предоставить инструменты Excel для автоматизации повторяющихся задач извлечения данных из Интернета. Автор предлагает несколько десятков программ VBA и описывает приемы работы в Power Query.
Eduardo Sanchez. Excel and The World Wide Web. Straight to the Point. – Holy Macro! Books, 2021. – 58 p.
Скачать заметку в формате Word или pdf, примеры в формате zip (внутри файл Excel с поддержкой макросов)
Примеры кода: https://www.mrexcel.com/download-center/excel-and-the-world-wide-web-8051/
Глава 1. Приступая к работе
Что такое HTML?
HTML (Hyper Text Markup Language) – язык гипертекстовой разметки. Он используется для создания веб-сайтов. Гипертекст – это контент, который ведет себя нелинейным образом. Представьте себе веб-сайт, на каждой странице которого есть несколько ссылок на другие страницы, как того же самого сайта, так и других сайтов. Пользователь перемещается, переходя с одной страницы на другую; это гипертекстовое поведение. Обычная печатная книга – это контрпример, ее предполагается читать последовательно.
Информация в HTML помечена тегами; ниже мы поговорим об этом подробнее. Существуют и другие языки, используемые для создания веб-сайтов, такие как CSS и JavaScript, но мы не будем подробно рассматривать их здесь.
CSS (Cascading Style Sheet) – каскадная таблица стилей, язык описания внешнего вида документа. Он работает вместе с HTML, который отвечать за содержимое страницы. Каскадирование означает, что можно использовать несколько CSS-файлов для создания окончательного визуального стиля. Этот язык управляет такими элементами, как размер шрифта, фоновые изображения и цветовая палитра.
JavaScript – язык программирования для реализации динамического поведения на веб-сайтах. С его помощью разработчики могут манипулировать содержимым страницы, создавать диаграммы и взаимодействовать с API (Application Programming Interface, интерфейс прикладного программирования). Обратите внимание, что JavaScript и Java – это два разных языка. Говорят, что в будущем JavaScript может заменить VBA в качестве языка программирования Office.
Одна из замечательных особенностей современных браузеров заключается в том, что они предоставляют исходный код страниц. Если вы используете Google Chrome, просто щелкните правой кнопкой мыши любой элемент страницы и выберите пункт Просмотреть код; в правой части окна появится панель, аналогичная показанной ниже:
Рис. 1. Фрагмент кода HTML веб-страницы; чтобы увеличить изображение кликните на нем правой кнопкой мыши и выберите Открыть картинку в новой вкладке
Обратите внимание:
- Ключевые слова header, div, aside, nav, h4, li и другие являются тегами.
- Когда маленькие черные треугольники указывают вправо, это означает, что их можно щелкнуть, чтобы развернуть и отобразить дополнительную информацию.
- Ключевые слова id, class и href являются атрибутами.
- <li – это открывающий тег, а </li> – закрывающий.
- Элемент может принадлежать к нескольким различным классам.
Если вы чувствуете себя подавленным всем этим, не паникуйте; не обязательно быть программистом HTML, чтобы работать с такого рода автоматизацией. Позже мы увидим, как читать код HTML и извлекать информацию с помощью VBA.
Хотя веб-дизайнеры используют профессиональные редакторы, можно создавать HTML-файлы в стандартных приложениях Windows, например, в Блокноте. Это особенно быть полезно, когда вы хотите протестировать код VBA, который будет взаимодействовать с веб-страницей, но по какой-то причине реальный сайт недоступен.
Чтобы создать локальный HTML-файл, выполните следующие действия:
- Откройте Блокнот и введите исходный код, как ниже.
- Сохраните его с расширением htm.
- Откройте этот файл с помощью браузера. Для этого, например, можно в Проводнике просто кликнуть на файле (если вы всё сделали верно, файл будет иметь иконку вашего браузера по умолчанию).
- Чтобы позже отредактировать исходный код, переименуйте расширение в txt.
<!DOCTYPE html> <html> <body style=«background-color:powderblue;»> <h1>My Heading</h1> <p><i>This is italic.</i></p> <p style=«color:red;»>Red paragraph.</p> <button>Click me</button> <bdo dir=«rtl»><br><br>12345<br><br></bdo> </body> </html> |
Например, в Chrome файл выглядит так (я кликнул Просмотреть код):
Рис. 2. Файл, созданный в Блокноте и открытый в браузере
Выполнение запросов
Веб-запрос позволяет извлечь информацию, хранящуюся в HTML-файле. Обычно он используется для подключения к какому-либо веб-сайту, но также можно запросить локальный файл.
Если вы планируете извлекать данные из одного и того же источника снова и снова, сохраните запрос и просто обновляйте его. Веб-запросы Excel идентифицируют таблицы на выбранной странице в Интернете и позволяют импортировать таблицы в книгу.
Статический запрос
Стандартный запрос Excel является статическим, то есть он не принимает параметры. Чтобы выполнить статический веб-запрос, выполните следующие действия:
- Пройдите по меню Данные –> Получить и преобразовать данные –> из Интернета. (Хотя книга датируется 2021-м г., автор описывает импорт из Интернета в версии Excel 2013. На одном из ПК у меня установлена эта «древняя» версия, но, наверное, движок импорта настолько отстал от развития www, что мне не удалось с его помощью импортировать ни одной из страниц. Примеры в этом разделе выполнены в Excel)
- Откроется диалоговое окно, введите адрес страницы, которую хотите импортировать. Я ввел ссылку на страницу Википедии Список государств и зависимых территорий по населению.
- Нажмите Ok.
Рис. 3. Окно стандартного запроса Excel
- При первом обращении к сайту появится окно запроса уровня доступа. Оставьте настройку по умолчанию – Анонимно. Нажмите Подключение.
- Откроется окно навигатора Power Query. Кликайте по очереди на таблицы в левой части. Остановите свой выбор на подходящей (Table 0). Нажмите Преобразовать данные.
Рис. 4. Выбор таблицы для подключения
Удалите все столбцы, кроме Страна и Население. Преобразуйте тип данных в столбце Население в Целое число. Загрузите данные в умную таблицу на лист Excel. У вас получится что-то вроде:
Рис. 5. Начало умной таблицы с населением стран, импортированной из Интернета
Подробнее об импорте из Интернет с использование Power Query см. здесь.
Динамический веб-запрос
Допустим, вам нужно получить информацию с нескольких страниц одного веб-сайта, и в адресах страниц можно выявить шаблон. Можно передать переменную в веб-запрос с помощью функции Power Query. (Автор продолжает рассказ на основе версии Excel 2013. В ней запросы хранятся в отдельных текстовых файлах с расширением IQY. Поэтому метод основан на редактировании таких файлов.)
На первом шаге я создал обычный статический запрос к странице рейтинга АТР:
Рис. 6. Сайт АТР
Рис. 7. Умная таблица, полученная статическим запросом Power Query
Обратите внимание: вверху на рис. 6 адрес страницы https://www.atptour.com/en/rankings/singles. Страница рейтинга парных игроков отличается лишь последним фрагментом: https://www.atptour.com/en/rankings/doubles. В нашем учебном примере мы создадим функцию в Power Query, которая будет считывать с листа Excel, какой рейтинг запросить из Интернета.
Шаг 2. На новом листе Excel создайте умную таблицу:
Рис. 8. Таблица параметров на листе Excel
Следующие названия должны быть такими же, как на рисунке: заголовок первого столбца Parameter, заголовок второго столбца Value, имя таблицы Parameters. Это позволит использовать заготовленный текст функции. В ячейке А1 я применил инструмент Проверка данных, чтобы создать список выбора рейтинга:
Рис. 9. Список для выбора рейтинга
Формула в В5 считывает значение в А1 и возвращает полный путь к странице сайта: =»https://www.atptour.com/en/rankings/»&A1
Шаг. 3. Создадим пользовательскую функцию fnGetParameter в Power Query:
= (ParameterName as text) => let ParamSource = Excel.CurrentWorkbook(){[Name=«Parameters»]}[Content], ParamRow = Table.SelectRows(ParamSource, each ([Parameter]=ParameterName)), Value= if Table.IsEmpty(ParamRow)=true then null else Record.Field(ParamRow{0},«Value») in Value |
Функция подключается к таблице Parameters в книге Excel, и извлекает путь к сайту. Скопируйте текст функции в буфер. В Excel пройдите по меню Данные –> Получить данные –> Из других источников –> Пустой запрос. В редакторе Power Query перейдите на вкладку Главная –> Расширенный редактор. Выделите все строки кода и нажмите Ctrl+V, чтобы вставить содержимое из буфера обмена. Нажмите Готово. Измените имя функции на fnGetParameter. Пройдите по меню Главная –> Закрыть и загрузить. Для функций используется единственный тип загрузки – Только создать подключение.
Вызов функции fnGetParameter
Теперь в ранее созданном статическом запросе АТР заменим фиксированный URL на динамический, возвращаемый функцией fnGetParameter. В файле Excel пройдите по меню Данные –> Запросы и подключения. В области Запросы и подключения кликните правой кнопкой мыши на запросе АТР –> Изменить. В редакторе Power Query кликните Расширенный редактор:
Рис. 10. Исходный код статического запроса с именем ATP
Вставьте строку кода сразу после let (не забудьте про запятую в конце строки):
sitepath = fnGetParameter(«Site Path»), |
Рис. 11. Функция fnGetParameter возвращает значение из таблицы листа Excel
Функция вернет путь к сайту из ячейки В5 таблицы Parameters. Вы создали новую переменную sitepath для хранения значения из строки File Path таблицы Excel. Нажмите Готово. Во второй строке кода в Расширенном редакторе выделите путь к сайту включая кавычки, и замените его на имя переменной – sitepath (как показано на рис. 11). Если вы всё делали верно, как только вы наберете букву s, редактор выдаст контекстную подсказку, в которой в том числе будет и имя переменной sitepath. Откроется окно:
Рис. 12. Подтверждение конфиденциальности данных
Нажмите Продолжить. Откроется еще одно окно:
Рис. 13. Не проверять уровень конфиденциальности для этого файла
Поставьте галочку, как показано выше.
Вы можете проверить, как работает переменная sitepath. В редакторе Power Query перейдите в область ПРИМЕНЕННЫЕ ШАГИ, и кликните на первый шаг. Отразится имя страницы сайта:
Рис. 14. Переменная sitepath правильно определяет название страницы сайта
В редакторе Power Query пройдите по меню Главная –> Закрыть и загрузить. Осталось проверить, как работает динамический запрос. В Excel перейдите на лист с таблицей Parameters, и в ячейке А1 выберите doubles. Перейдите на лист умной таблицы с рейтингом АТР, правой кнопкой щелкните на любой ее ячейке, и выберите Обновить. Таблица отразит данные рейтинга парных игроков:
Рис. 15. Рейтинг парных игроков, извлеченный с сайта АТР динамическим запросом Power Query
Запрос с помощью VBA
Можно написать код VBA, который автоматизирует этот процесс. Обратите внимание, что строковые переменные могут быть жестко закодированы или извлечены из рабочего листа. Результирующая таблица создается, начиная с ячейки A5 активного листа.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
Sub Query_one() Dim part1$, part2$ ‘part1 = «www.atptour.com/en/rankings/» ‘part2 = «singles» part1 = [b2] ‘ from cell B2 part2 = [b3] ‘ from cell B3 Application.CutCopyMode = False With ActiveSheet.QueryTables.Add(Connection:= _ «URL;https://» & part1 & part2, Destination:=Range(«$A$5»)) .Name = «wash» .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .BackgroundQuery = True .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .WebSelectionType = xlAllTables .WebFormatting = xlWebFormattingNone .WebPreFormattedTextToColumns = True .WebSingleBlockTextImport = False .WebDisableDateRecognition = False .WebDisableRedirections = False .Refresh BackgroundQuery:=False End With End Sub |
Рис. 16. Данные, полученные запросом на основе кода VBA
Глава 2. Взаимодействие с сайтами без использования браузера
Когда мы говорим о получении данных из Интернета, некоторые люди думают об автоматизации браузера, например, Internet Explorer. На самом деле, в зависимости от конкретных потребностей пользователя, это довольно неэффективно. В этой главе будут представлены методы получения или публикации данных через Интернет. Говоря о данных, давайте сделаем шаг назад и обсудим JSON.
Что такое JSON?
JSON (JavaScript Object Notation) – формат для хранения и обмена информацией, доступной для чтения человеком, как и XML. Поскольку он очень популярен в наши дни, мы будем использовать примеры JSON, чтобы продемонстрировать некоторые из методов в этой главе. JSON в основном работает с двумя сущностями, а именно объектами и массивами:
{ «name»: «This is my site», «url»: «https://bananas.com» } |
Имя и URL-адрес называются ключами с соответствующими значениями. Следующий синтаксис определяет массив:
[«Nicole»,»Elaine»,»Samantha»,»Tom»]
Эти два основных элемента могут быть объединены, как показано ниже; значение ключа Files представляет собой массив.
{ «id»: 18, «personal»: { «name»: «Jean Ferguson», «Files»: [«ftpA», «ftpB»] } } |
Это почти все, что вам нужно знать, чтобы начать работать с файлами JSON.
Получение данных из Интернета с помощью кода VBA
Объекты запроса VBA XMLHTTP/ServerXMLHTTP предоставляют необходимые ресурсы для выполнения задач связи с веб-страницами и службами. Чтобы использовать их в своем коде, выполните следующие действия:
- Перейдите в редактор VBA
- Нажмите кнопку Tools в строке меню и выберите References.
- Отметьте строку Microsoft XML v6.0:
Рис. 17. Диалоговое окно VBA References
Когда Интернет начал расти в размерах, возникла необходимость в выделенных компьютерах для предоставления различных услуг (серверы), в то время как пользователи получают доступ к услугам (клиенты). Общие серверы – это веб-службы, электронная почта и FTP. Когда браузер открывает веб-страницу, он действует как клиент, а сайт, предлагающий информацию, размещен на сервере. Это называется архитектурой клиент-сервер.
В следующем примере мы получим данные JSON с веб-сайта, специально созданного для целей тестирования. Вот как выглядит этот сайт:
Рис. 18. Тестовый сайт для извлечения данных JSON
К сожалению, в Excel нет встроенной поддержки JSON. Следующий код просто поместит текст JSON в строковую переменную:
Public Sub Direct() Dim http As Object, resp$ Set http = CreateObject(«MSXML2.XMLHTTP») http.Open «GET», «http://jsonplaceholder.typicode.com/» _ & «posts/1/comments», False http.send ‘ get the response resp = http.responseText MsgBox Left(resp, 350), 64, «The first 350 characters» End Sub |
Рис. 19. Данные JSON просто записаны в строковую переменную
Содержимое удалось извлечь, но работа с информацией, хранящейся в переменной, потребует неуклюжих манипуляций со строками.
Хорошей новостью является то, что в Интернете есть несколько бесплатных конвертеров JSON, которые обеспечат структурированный способ обработки данных. Один из них называется VBA-JSON. Чтобы воспользоваться им:
- Перейдите на главную страницу https://github.com/VBA-tools/VBA-JSON и нажмите кнопку Code, а затем Download ZIP.
- Извлеките папку VBA-JSON-master на свой ПК.
- Откройте книгу Excel, в которой вы хотите использовать код, и перейдите в редактор VBA.
- Щелкните правой кнопкой мыши любой модуль на левой панели и выберите опцию Import File…
- В появившемся диалоговом окне найдите и выберите файл JsonConverter.bas из разархивированного пакета.
- Нажмите кнопку Открыть, и в ваш проект VBA будет добавлен новый модуль. Исходный код не защищен, поэтому вы можете изучить его.
- Добавьте ссылку на библиотеку Microsoft Scripting Runtime. Нажмите Ok. Вы можете получать ошибки, если эта ссылка будет иметь низкий приоритет в списке. Чтобы избежать этого, вернитесь в окно Tools –> References и нажмите стрелку вверх, чтобы увеличить его приоритет, как показано ниже:
Рис. 20. Повышение приоритета ссылки на библиотеку Microsoft Scripting Runtime
Теперь можно запустить следующий код, чтобы перенести данные JSON на рабочий лист:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Public Sub Use_Library() Dim http As Object, json As Object, i%, item, _ head, dest As Range Set http = CreateObject(«MSXML2.XMLHTTP») ‘ create array with keys head = Array(«id», «name», «postId», «email», «body») Set dest = [a1].Resize(1, UBound(head) + 1) dest.Value = head ‘ first row http.Open «GET», «http://jsonplaceholder.typicode.com/» _ & «posts/1/comments», False http.send Set json = ParseJson(http.responseText) i = 2 For Each item In json Sheets(2).Cells(i, 1) = item(head(0)) Sheets(2).Cells(i, 2) = item(head(1)) Sheets(2).Cells(i, 3) = item(head(2)) Sheets(2).Cells(i, 4) = item(head(3)) Sheets(2).Cells(i, 5) = item(head(4)) i = i + 1 ‘ next row Next End Sub |
Рис. 21. Эта таблица Excel была создана на основе данных в формате JSON
Получение данных из элементов веб-страницы
Ранее я показал HTML-код с веб-страницы (см. рис. 1), которая содержала класс с именем «nav-link». Следующий код найдет все элементы, принадлежащие этому классу, и извлечет строку, представляющую атрибут href. Этот атрибут указывает адрес назначения для ссылки. Затем все адреса поместятся на рабочий лист Excel. Но начните с подключения библиотеки Microsoft HTML Object Library.
Обратите внимание, что, набрав Н в строке объявления переменных, редактор VBA предложит доступные варианты для продолжения набора. Эта функция известна как Intellisense. Она позволяет выбирать свойства и методы для переменных, а также служит для автоматического завершения набора кода (аналогичная функция есть и в Excel, облегчая набор формул).
Рис. 22. Intellisense в действии
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Public Sub Get_Class() Dim http As Object, html As New H, _ topics As Object, topic As HTMLHtmlElement, i% Set http = CreateObject(«MSXML2.XMLHTTP») http.Open «GET», «https://www.mrexcel.com/», False http.send html.body.innerHTML = http.responseText ‘ create a collection Set topics = html.getElementsByClassName(«nav-link») MsgBox topics.Length, 64, «Number of items found» i = 2 For Each topic In topics ‘ write to worksheet Cells(i, 1) = topic.getAttribute(«href») i = i + 1 Next End Sub |
Рис. 23. Просмотр части очищенных данных
Размещение данных в Интернете
Как правило, мы используем код для получения данных с сайта, но бывают случаи, когда нам нужно отправить данные, например, чтобы сообщить приложению, сколько акций вы хотите купить. Приведенный ниже код отправляет данные JSON из ячейки D1 в точку тестирования.
Sub Post_example() Dim HTTP As Object, json$, URL$ ‘ get the JSON string from worksheet json = Range(«d1») ‘ use server object Set HTTP = CreateObject(«MSXML2.ServerXMLHTTP») URL = «https://jsonplaceholder.typicode.com/posts» HTTP.Open «POST», URL, False HTTP.setRequestHeader «Content-type», «application/json» HTTP.send (json) MsgBox HTTP.responseText, 64, «This is the result:» Set HTTP = Nothing End Sub |
На рисунке показан текст ответа:
Рис. 24. В окне сообщения отображаются опубликованные данные
Некоторые важные моменты:
- Строка в ячейке D1 – JSON-представление диапазона A1:C3. Он начинается и заканчивается квадратными скобками; следовательно, это массив.
- В тексте ответа были созданы индексы «0», «1» и ключ идентификатора со значением 101.
- Серверный XML-объект, используемый в этом примере, может запрашивать или отправлять данные.
Аутентифицированные запросы
Предыдущие разделы показали, что вполне возможно получить веб-данные с общедоступных сайтов. Однако некоторые приложения потребуют, чтобы вы вошли в службу. Например, финансовые приложения. Очевидно, что без учетных данных пользователя приложение не будет знать, к какой учетной записи принадлежит запрос.
В приведенном ниже примере кода используется учетная запись на веб-сайте Alpaca. Этот вид учетной записи предоставляет возможность выполнять файловые операции в целях тестирования, но у них также есть живая часть, где вы можете рисковать реальными деньгами… Веб-API дает пользователю взаимодействовать с интернет-сервером, извлекая информацию из его базы данных или отправляя определенные данные с помощью почтовых запросов. Адреса назначения часто называются конечными точками, и ответы обычно приходят в форматах JSON или XML.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Sub authenticating() Dim req As MSXML2.ServerXMLHTTP60, key_id, _ secretk$, secreth$, URL$, json As Object, item, s$ ‘ create object Set req = New MSXML2.ServerXMLHTTP60 key_id = CStr([b18]) ‘ id from cell B18 secretk = CStr([b19]) ‘ secret key from cell B19 ‘ get Microsoft information URL = «https://paper-api.alpaca.markets/v1/assets/MSFT» req.Open «GET», URL, False req.setRequestHeader «APCA-API-KEY-ID», key_id req.setRequestHeader «APCA-API-SECRET-KEY», secretk req.send ‘ start building string s = «Raw data:» & vbLf & req.responseText s = s & vbLf & «**************» & vbLf & _ «Available data:» & vbLf ‘ use the library Set json = ParseJson(req.responseText) For Each item In json ‘ loop the collection s = s & item & vbLf Next MsgBox s, 64 End Sub |
Рис. 25. Два ключа на листе и полученные данные
Чтобы получить нужные данные, вам необходимо сообщить идентификатор, а также секретный ключ, который может храниться в ячейках рабочего листа, как показано на рисунке выше. Данные извлекаются в формате JSON; окно сообщения показывает их. (Поскольку автор скрыл ключ и пароль на листе Excel, протестировать код не удалось.)
Глава 3. Internet Explorer и VBA
В настоящее время браузером по умолчанию для Microsoft является Edge, и мы обсудим его позже. Однако Internet Explorer – единственный браузер, у которого есть встроенная поддержка VBA. Поскольку он все еще существует, стоит потратить несколько страниц на его обсуждение.
Первое, что нужно сделать, это добавить ссылку в VBA на библиотеку Microsoft Internet Controls. Если вы используете Windows 10, для запуска IE попробуйте один из вариантов:
- Нажмите Пуск –> Все приложения и посмотрите в разделе Стандартные – Windows
- На панели задач кликните кнопку Поиск в Windows и введите Internet Explorer
- Нажмите клавиши Windows + R и введите iexplore.exe
Некоторые сайты, такие как YouTube, больше не будут открываться в Internet Explorer, поэтому рекомендуется вручную открыть сайт, который вы планируете автоматизировать с помощью IE.
Перенос веб-таблицы на рабочий лист
Рассмотрим веб-сайт, показанный ниже; задача состоит в том, чтобы перенести таблицу на лист Excel вместе с флагами стран.
Рис. 26. Эта таблица будет скопирована в Excel
Глядя на HTML-код ниже, вы заметите теги tr, td и th. Тег <tr> определяет строку в таблице HTML. Элемент <tr> содержит один или несколько элементов <th> или <td>. Таблица HTML имеет два типа ячеек: ячейки заголовка, созданные с помощью элемента <th>, и ячейки данных, созданные с помощью элемента <td>. Также обратите внимание, что существуют элементы, определенные тегом img и содержащие атрибут src; они используются для хранения флагов стран.
Рис. 27. HTML-код веб-страницы с рис. 26
Вот ключевые шаги приведенного ниже кода:
- Назовите активный лист Excel sheet1, или измените его имя в коде.
- Перейдите на веб-страницу.
- Создайте коллекцию всех объектов с тегом img.
- Создайте коллекцию всех таблиц страниц; нас будет интересовать вторая таблица этой группы. Поскольку коллекция начинается с индекса #0, мы ссылаемся на индекс #1.
- Выполните цикл по строкам таблицы, перенося информацию о каждой стране в отдельные строки рабочего листа. Существует внутренний цикл, который повторяет столбцы таблицы.
При взаимодействии с веб-страницей мы, как правило, ищем определенные элементов в структуре HTML. Вот три самых популярных метода:
- GetElementbyID – находит один элемент, который имеет уникальный идентификатор. К сожалению, не все элементы страницы будут иметь такой идентификатор.
- GetElementsbyClassName – создает коллекцию элементов, принадлежащих определенному классу.
- GetElementsbyTagName – создает коллекцию элементов с определенным тегом.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
Sub Web_Table() Dim tob As Object, ws As Worksheet, im As shape, rowc%, _ colv%, objie As InternetExplorer, bod As HTMLBody, ic, s$ s = «https://rates.currencywholesale.com/rates/» Set ws = ThisWorkbook.ActiveSheet Set objie = New InternetExplorer objie.Visible = True objie.navigate s & «rates.html» ‘ wait for page loading Application.Wait (Now + TimeValue(«0:00:05»)) Set bod = objie.Document.body Set ic = bod.getElementsByTagName(«img») ‘ get all tables Set tob = bod.getElementsByTagName(«table») On Error Resume Next ‘ if a flag is missing For rowc = 0 To tob(1).Rows.Length — 1 Set im = ws.Shapes.AddPicture(s & _ ic(rowc + 1).getAttribute(«src»), msoFalse, msoTrue, _ 50, 50, 50, 50) For colv = 0 To tob(1).Rows(rowc).Cells.Length — 1 ws.Cells(rowc + 1, colv + 1) = _ tob(1).Rows(rowc).Cells(colv).innerText With im .LockAspectRatio = 0 .Top = ws.Cells(rowc + 2, 1).Top .Left = ws.Cells(rowc + 2, 1).Left .Width = ws.Cells(rowc + 2, 1).Width .Height = ws.Cells(rowc + 2, 1).Height End With Next Next On Error GoTo 0 End Sub |
У меня макрос работал около 15 минут.
Рис. 28. Таблица в Excel, полученная макросом
Работа с событиями
Некоторые веб-сайты запрограммированы так, чтобы реагировать на события, генерируемые пользователем; это позволяет создавать более интерактивную и динамичную страницу. В следующем примере используется локальный HTML-файл, чтобы показать основы такого поведения.
В Блокноте создайте файл Code2.txt со следующим кодом:
<!DOCTYPE html> <html> <body style=«background-color:powderblue;»> <h1>My Heading</h1> <p><i>This is italic.</i></p> <p style=«color:red;»>Red paragraph.</p> <button>Click me</button> <input name=«q» onchange=«alert(‘Alert message’);»/input> <bdo dir=«rtl»><br><br>12345<br><br></bdo> </body> </html> |
В Проводнике переименуйте расширение – *.hmt. Чтобы убедиться в работоспособности, дважды кликните на файле, и он откроется в браузере по умолчанию. Обратите внимание, что определено событие on-change, то есть оно будет срабатывать при изменении значения поля ввода. В Excel выполните следующий код. Но перед этим отредактируйте путь к файлу Code2.hmt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Sub IE_event() Dim iea As InternetExplorer, doc, search, _ event_onChange As Object Set iea = CreateObject(«InternetExplorer.Application») iea.Visible = True iea.navigate «C:UserspublicCode2.htm» Do Until Not iea.Busy DoEvents Loop Application.Wait Now + TimeValue(«0:00:03») Set doc = iea.document Set search = doc.getElementsByName(«q»)(0) search.Value = «Pogacar» ‘Exit Sub ‘exiting here does not display the message Set event_onChange = iea.document.createEvent(«HTMLEvents») event_onChange.initEvent «change», True, False search.dispatchEvent event_onChange ‘iea.Quit close IE window Set iea = Nothing End Sub |
Макрос открывает локальный файл с помощью Internet Explorer, определяет переменную поиска в качестве поля ввода и записывает в него. После этого код отправляет событие on-change, вызывая появление предупреждающего сообщения:
Рис. 29. Это сообщение страницы было вызвано кодом VBA
При открытии IE с помощью VBA может возникнуть ошибка, связанная с параметрами безопасности. Если вы не используете IE в качестве браузера, измените два параметра. Перейдите в меню Свойства браузера –> Безопасность и снимите флажок Включить защищенный режим. Далее на вкладке Дополнительно установите флажок Разрешить запуск активного содержимого файлов на моем компьютере. Если вы все еще используете IE для просмотра веб-страниц или загрузки файлов для локального использования, безопаснее восстановить эти параметры до значений по умолчанию после завершения задач VBA.
Рис. 30. Изменение параметров безопасности Internet Explorer
Глава 4. Введение в Selenium
Selenium – это инструмент с открытым исходным кодом, используемый для автоматизации тестирования веб-приложений. Он может быстро выполнять десятки функциональных тестов и тестов на совместимость, взаимодействуя с бета-скриптами браузеров. При разработке сложного коммерческого программного обеспечения этап тестирования необходим для минимизации ошибок при развертывании продукта на нескольких платформах.
Флорент Бреер (Florent Breheret) разработал Selenium Basic, который представляет собой фреймворк, позволяющий напрямую использовать Selenium в Excel; так что это две разные вещи:
- Selenium – платформа автоматизации браузера и экосистема, первоначально созданная Джейсоном Хаггинсом.
- Selenium Basic (SB) – платформа автоматизации браузера на основе Selenium для VB.Net, VBA и VBScript.
Автор далее называет SB просто Selenium.
Selenium предоставляет интерфейс, который позволяет вашей электронной таблице автоматизировать различные браузеры (кроме Internet Explorer). Например, более стабильный Chrome.
Установка Selenium
Шаг. 1. Загрузите и установите исполняемый файл со страницы GitHub
Рис. 31. Загрузите и установите исполняемый файл Selenium
Шаг. 2. В редакторе VBА добавьте ссылку на библиотеку Selenium Type Library:
Рис. 32. Добавление ссылки на Selenium Type Library
Шаг. 3. Обновите драйвер Chrome, установленный на первом шаге. Дело в том, что пакет установки Selenium включает не самую свежую версию этого драйвера. Для этого перейдите на сайт https://chromedriver.chromium.org/downloads и скачайте драйвер, совместимый с вашей текущей версией Chrome.
Рис. 33. Загрузите последнюю версию драйвера Chrome
Чтобы узнать, какая у вас версия, в Chrome пройдите по меню:
Рис. 34. О браузере Chrome
В открывшемся окне, вы увидите номер версии:
Рис. 35. Версия Chrome 90
Шаг. 4. Замените старую версию драйвера Chrome новой. Сделайте это в папке:
Рис. 36. Папка с компонентами Selenium
Chrome имеет быстрый цикл разработки, и через некоторое время используемый вами драйвер станет несовместимым с новой версией браузера. Когда это произойдет, вы получите ошибки, подобные тем, которые показаны ниже. Чтобы всё снова заработало, опять обновите драйвер.
Рис. 37. Сообщения об ошибках, связанных с версией драйвера
Internet Explorer и Selenium
В большинстве случаев мы будем использовать Selenium для автоматизации современных браузеров, таких как Chrome или Edge. Тем не менее, вы можете взаимодействовать со старым браузером IE; пример ниже показывает, как это сделать.
Public bot As New IEDriver Sub Test() With bot .get «https://www.mrexcel.com/» .Window.Maximize ‘.Quit End With End Sub |
Просто обратитесь к установленному драйверу Internet Explorer, и все будет работать нормально.
Глава 5. Google Chrome и VBA
Установив Selenium займемся автоматизацией браузера Chrome из кода VBA. Selenium имеет свое собственное дерево свойств и методов, но он будет работать аналогично Internet Explorer.
Запуск JavaScript на странице
Для первого примера создадим еще один локальный HTML-файл с исходным кодом, который очень похож на реальную веб-страницу. Он содержит несколько элементов, а также встроенный код JavaScript, завернутый в теги <script>. В Блокноте введите текст:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
<!DOCTYPE html> <html> <head> <meta charset=«utf-8» /> <title></title> </head> <body> <input id=«B1» type=«button» value=«click to change textbox value» onclick=«TAlert()» /> <form class=«OF_form»> <ul class=«OF_t2»> <li class=«OF_3T OF_active»>FIRST</li> <li class=«OF_3T»>SECOND</li> <li class=«OF_3T»>STOP</li> </ul> <ul class=«OF_toggle»> <li class=«OF_ttab_ OF_buy OF_active»>THIRD</li> <li class=«OF_ttab OF_sell»>FOURTH</li> </ul> <div class=«MOr»> <div class=«OF_section»> <div class=«OF_section-h»>Amount</div> <div class=«OF_input-box_Xk»> <input type=«number» step=«0.1» min=«0» name=«amount» placeholder=«0.00» value=«» autocomplete=«off» oninput=«OIHandler()»> <span>USD</span> </div> </div> </div> <div class=«OF_OT»> <div> <b>Total</b> <span>(corrected)</span> <b>≈</b> </div> <div class=«OF_total» >0.00000</div> </div> </form> <script language=«javascript»> function OIHandler() { print_call_stack(); alert(‘input detected…’);} function print_call_stack() { console.trace(); } function TAlert() { setIB(document); } function setIB() { try { var inputBox = document.querySelector(‘div.OF_input-box_Xk input’); inputBox.value = 50; if (document.createEvent) { var ev2 = document.createEvent(«HTMLEvents»); ev2.initEvent(«input», true, true); ev2.eventName = «input»; inputBox.dispatchEvent(ev2); } return ({ success: true }); } catch (ex) { return ({ exception: ex, myMsg: ‘#error in setIB!’ }); } } </script> </body> </html> |
Измените расширение файла на Code3.htm. В Проводнике дважды кликните на файле. Он откроется в Chrome:
Рис. 38. Локальная страница с окном сообщения, вызванным событием ввода
Кликните на кнопку в левом верхнем углу. Появится окно для подтверждения действия. Нажмите Ok. Значение в поле Amount изменится. Щелчок по стрелкам вверх и вниз, появляющимся при наведении курсора мыши на поле Amount, изменяет его значение. Любые действия ввода приводят к появлению окна сообщения Подтвердите действие.
Рис. 39. Изменение значения ввода
Следующий VBA выполняет функцию настройки, содержащуюся в файле Code3.htm. Это приводит к запуску нового окна Chrome и открытию файла Code3.htm, а затем к его закрытию. Укажите вашу папку, где вы разместили файл Code3.htm. Если вы хотите, чтобы загруженная веб-страница оставалась открытой после завершения выполнения кода, объявите переменную веб-драйвера вне подпрограммы. Т.е., разместите первую строку кода в отдельном модуле. Если переменная объявлена внутри подпрограммы, память освобождается, когда код заканчивается и страница автоматически закрывается.
Public d As WebDriver Public Sub Exec() Dim url$ url = Environ(«USERPROFILE») & _ «DocumentsENSExcel & VBAWeb STPpage_w_JS.htm» Set d = New ChromeDriver With d .Start «Chrome» .get url .Wait 1000 .ExecuteScript («setIB()») End With End Sub |
Iframes и перенос таблиц без цикла
Iframes – это встроенные элементы HTML, которые можно использовать для включения содержимого с других страниц в текущую страницу. Допустим, вам нужно программно ввести фрейм, чтобы получить доступ к его элементам. Например, цель состоит в том, чтобы перенести приведенную ниже веб-таблицу на рабочий лист Excel. Понаблюдайте за HTML-кодом, чтобы увидеть, что таблица находится внутри фрейма, который, в свою очередь, вложен в родительский фрейм. Следовательно, код должен ввести два фрейма, чтобы получить нужную таблицу.
Помните, как в главе 3 наш макрос мучительно перебирали строки и столбцы, чтобы получить таблицу с флагами? У Selenium есть классный метод, который скопирует таблицу за один проход!
Рис. 40. Сайт с нужной таблицей
Рис. 41. Исходный html-код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Public d As WebDriver Public Sub Table_no_loop() Dim col As Object, i%, col2 As Object, s$, col3 As Object Const url As String = «http://intrinsicedge.blogspot.com/» Set d = New ChromeDriver With d .Start «Chrome» .get url .Wait 800 Set col = d.FindElementsByTag(«iframe») For i = 1 To col.Count s = col.item(i).Attribute(«src») If s Like «*docs.google*» Then Exit For Next .Wait 1000 .SwitchToFrame col.item(3) Set col2 = .FindElementsByTag(«iframe») .SwitchToFrame col2.item(1) Set col3 = .FindElementsByTag(«table») .Wait 500 End With col3.item(1).AsTable.ToExcel _ ThisWorkbook.Worksheets(«table»).[a1] End Sub |
Код открывает Chrome, загружает страницу и создает коллекцию всех присутствующих Iframes. Затем он находит нужный, используя атрибут scr. После этого входит в первый фрейм, находит дочерний фрейм и переключается на него. Наконец, таблица идентифицируется и копируется с помощью одного оператора:
Рис. 42. Представление данных в Excel
Как и Internet Explorer, Selenium предлагает несколько методов поиска объектов страницы: FindElementbyID, FindElementsbyClass и многие другие. Используйте функцию Intellisense, чтобы просмотреть полный список:
Рис. 43. Использование Intellisense для визуализации доступных опций
Использование XPath для поиска элементов
XPath, XML Path Language – язык запросов к элементам XML-документа. Он реализован в Selenium и может использоваться для навигации по HTML-структуре веб-страницы, поиска любого элемента с помощью определенного синтаксиса. Существует две основные категории XPath:
- Абсолютный: это полный путь для элемента, начиная с корневого элемента. Недостатком этой категории является то, что она может быть довольно длинной и более подвержена сбою при изменении структуры HTML DOM (Document Object Model). Вы можете распознать абсолютный путь по начальной единственной прямой косой черте.
- Относительный: эта ссылка начинается где-то в середине структуры DOM. Относительный XPath начинается с двойной прямой косой черты и обычно является предпочтительным вариантом.
DOM – это API для документов HTML и XML. Он обеспечивает структурное представление документа, позволяя изменять его содержимое и визуальное представление с помощью языка сценариев, такого как JavaScript. Для наших целей думайте о DOM как о виртуальном представлении структуры веб-страницы в виде дерева со всеми ее объектами, стилями, содержимым и событиями. Вот шаги, чтобы получить XPath для элемента страницы:
- Щелкните правой кнопкой мыши интересующий объект страницы (1) и выберите Просмотреть код (2)
- Когда исходный код появится в правом окне, строка, относящаяся к интересующему объекту будет подсвечена. Щелкните на ней правой кнопкой мыши (3)
- Пройдите по меню Copy (4) –> Copy XPath (5)
- Информация о XPath скопирована в буфер обмена. Для нашего примера она выглядит так: //*[@id=»Blog1″]/div/div/div/div/div[1]/h3/a
Рис. 44. Получение XPath для элемента страницы
Предложенный ниже код делает следующее:
- Открывает финансовый сайт и заполняет учетные данные для входа на него, беря их из ячеек рабочего листа В85 и В86.
- Получает дескриптор для кнопки всплывающего окна и нажимает на нее, чтобы закрыть всплывающее окно.
- Переходит на личную страницу автора на этом сайте; результат представлен на рис. 45.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Public driver As New ChromeDriver Sub Filling_Fields() Dim pt As WebElement, ac As WebElement driver.get «https://www.investing.com/portfolio/» Application.Wait Now + TimeValue(«0:00:04») Set pt = driver.FindElementByXPath _ («//*[@id=»«loginFormUser_email»«]»).SendKeys _ (CStr(Sheets(«test»).[b85])) Set pt = driver.FindElementByXPath _ («//*[@id=»«loginForm_password»«]»).SendKeys _ (CStr(Sheets(«test»).[b86])) Set pt = driver.FindElementByXPath(«//*[@id=»«signup»«]/a») DoEvents ‘ get popup button Set ac = driver.FindElementById(«onetrust-accept-btn-handler») ac.Click DoEvents pt.Click Application.Wait Now + TimeValue(«0:00:03») Set pt = driver.FindElementByXPath _ («//*[@id=»«navMenu»«]/ul/li[9]/a») pt.Click: DoEvents Application.Wait Now + TimeValue(«0:00:02») End Sub |
Рис. 45. Вход в систему с помощью кода
Глава 6. Microsoft Edge и VBA
Microsoft разработала одиннадцать версий Internet Explorer с 1995 по 2013 год. Затем они объявили, что Internet Explorer 11 станет последним в этой линейке, и начали фокусироваться на Edge. Хорошей новостью для пользователей IE является то, что он является частью Windows 10; поэтому, если у вас есть какое-то приложение, которое использует определенные функции IE 11, нет причин для немедленного беспокойства. Следующая большая новость появилась в 2019 году, когда стало известно, что эта начальная версия Edge, часто называемая Edge HTML, была заменена новой версией Edge на основе Chromium. Т.е. они используют ту же реализацию с открытым исходным кодом, которая является основой для Google Chrome, Opera и других менее известных браузеров. Вы можете визуально распознать семейство Microsoft, как показано ниже:
Рис. 46. Браузеры Microsoft на протяжении последних лет
Поскольку я не использую Edge, то для начала скачал версию 90 со страницы Microsoft. Далее необходимо обновить драйвер Selenium. Проверьте версию Edge и тип операционной системы, и загрузите драйвер с этой страницы. Найдите папку с элементами Selenium – C:UsersСергейAppDataLocalSeleniumBasic. Удалите файл edgedriver.exe. Поместите в эту папку загруженный драйвер и переименуйте его в edgedriver.exe. Мы готовы к первому примеру этой главы.
Поиск элементов с помощью селекторов CSS
Еще один способ найти элемент веб-страницы – это селектор CSS. CSS – это язык, используемый для применения стилей к странице.
Рис. 47. Ссылка на два конкретных элемента веб-страницы
Допустим, вы хотите заполнить поле поиска на этом веб-сайте, и нажать кнопку поиска, чтобы получить результаты. Обратите внимание, что поле имеет входной тег, в то время как кнопка имеет тег кнопки. Поскольку поле ввода имеет уникальный идентификатор, на него можно ссылаться напрямую. Кнопка, с другой стороны, не имеет идентификатора, поэтому она идентифицируется по пути DOM, начиная с элемента формы. Когда код завершает выполнение, на вкладке Edge отображаются результаты поиска по выбранному объекту.
Чтобы узнать, что такое CSS-селектор для конкретного элемента, выполните те же действия, описанные в главе Chrome, чтобы получить XPath, но вместо этого выберите опцию Copy selector. Для кнопки это: #search-block-form > div > div > div.input-group > span > button.
Public driver As New EdgeDriver Private Sub Use_Edge() Dim e As WebElement driver.get «https://www.seleniumeasy.com» driver.Wait 3000 Set e = driver.FindElementByCss(«#edit-search-block-form—2») If e.IsDisplayed Then e.SendKeys («css») ‘ write search string Set e = driver.FindElementByCss _ («#search-block-form > div > div >» & _ » div.input-group > span > button») driver.Wait 1000 e.Click End If ‘driver.Quit End Sub |
У меня этот код не заработал((
Загрузка файла
Обычная задача при работе в Интернете – загрузить файл. Для этого существуют эффективные методы, такие как клиенты FTP (протокол передачи файлов) или P2P (одноранговые) системы. Однако вы можете столкнуться с веб-сайтом, где единственным способом загрузки является щелчок по значку. В следующем примере показано, как автоматизировать этот процесс.
Рис. 48. Определение адресов файлов
На рисунке показана часть исходного кода HTML страницы. Каждый файл Excel имеет свой адрес, содержащийся в атрибуте href, поэтому все, что нам нужно сделать, это использовать эту информацию для загрузки.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
Public ed As New EdgeDriver Public Sub Dload() Dim col, i%, s$, p$, v ed.get «https://www.wisdomaxis.com/technology/» & _ «software/data/for-reports/» ed.Wait 2000 Set col = ed.FindElementsByTag(«a») For i = 1 To col.Count s = col.item(i).Attribute(«href») If s Like «*Refresh*» Then Exit For ‘ desired file Next ed.SetProfile «Download», persistant:=True ed.SetPreference «browser.download.folderList», 2 ed.SetPreference «browser.helperApps.neverAsk.saveToDisk», _ «application/vnd.ms-excel, application/msword,» & _ » application/msexcel,» & _ » application/xls, application/csv, text/csv,» & _ » application/pdf, text/html, text/plain» ed.SetPreference «browser.download.manager.showWhenStarting», 0 ed.SetPreference «browser.download.manager.focusWhenStarting», 0 ed.SetPreference «browser.download.useDownloadDir», True ed.SetPreference «browser.helperApps.alwaysAsk.force», False ed.SetPreference «browser.download.manager.alertOnEXEOpen», False ed.SetPreference «browser.download.manager.closeWhenDone», True ed.SetPreference «browser.download.manager.showAlertOnComplete», 1 ed.SetPreference «browser.download.manager.useWindow», False ed.SetPreference «pdfjs.disabled», True ed.get s ‘ download file p = Split(Environ$(41), «=»)(1) & «downloads» ‘ build path v = Split(s, «/«) Workbooks.Open p & Replace(v(UBound(v)), «%20«, « «) ‘ed.Window.Maximize Workbooks(Workbooks.Count).Activate End Sub |
Этот код:
- Создает коллекцию элементов с тегом <a>
- Организует цикл, чтобы найти нужный файл
- Устанавливает несколько настроек загрузки
- Загружает и открывает книгу
Если вы хотите открыть Microsoft Edge без установки Selenium, следующий небольшой код позволит вам это сделать. Обратите внимание, что нет необходимости знать путь установки Edge.
Sub ShellEdge() VBA.Shell Environ$(“comspec”) & » /c start microsoft-edge:» & _ «http://www.mrexcel.com» End Sub |
Создание PDF-файла с нуля
Допустим, вы хотите каталогизировать несколько веб-страниц в формате PDF для последующего анализа. В следующем примере показано, как создать файл.
- Код использует массив для хранения поисковых запросов, которые будут переданы в Google. В качестве альтернативы можно получать информацию из диапазона ячеек Excel.
- Код использует атрибут заголовка поля ввода; эта строка будет отличаться в зависимости от вашего языка. На рисунке ниже показано, как это выглядит для португальской версии автора.
- Макрос использует цикл создавая новую вкладку Google для каждого элемента. После выполнения поиска будет сделан снимок экрана и добавлен в PDF-файл. В конце файл сохраняется на диск.
Рис. 49. Код HTML для поля поиска Google, русская версия
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
Public Sub CreatePDF() Dim ed As EdgeDriver, arr(), i%, pdf As Object Set ed = New EdgeDriver Set pdf = CreateObject(«Selenium.PdfFile») pdf.SetPageSize 210, 300, «mm» pdf.SetMargins 5, 5, 5, 15, «mm» arr = Array(«burj khalifa», «petronas towers») With ed .Start «edge» .get «https://google.com/» For i = LBound(arr) To UBound(arr) If Not IsEmpty(arr(i)) Then If i > 0 Then .ExecuteScript «window.open(arguments[0])», _ «https://google.com/» .SwitchToNextWindow End If .FindElementByCss(«[title=Pesquisar]»).SendKeys _ arr(i) & » images» .SendKeys .keys.Enter pdf.AddImage .TakeScreenshot, True End If Next End With pdf.SaveAs «c:tempseleniumarch.pdf» ‘Stop End Sub |
Рис. 50. Этот PDF-файл был создан макросом из Excel
Оболочка Selenium
Как вы, возможно, уже заметили, не имеет значения, какой браузер мы используем с Selenium, поскольку его дерево свойств и методов одно и то же. Последний фрагмент кода VBA иллюстрирует это; все три браузера открываются с одинаковыми операторами. Выбранный сайт – это еще один сайт, на котором Internet Explorer больше не может работать хорошо…
Public ed As New EdgeDriver Public cr As New ChromeDriver Public ie As New IEDriver Sub Choice() Dim url$ url = «http://www.startrek.com» Select Case InputBox(«1 — Edge / 2 — Chrome / 3 — IE», _ «Select a browser:») Case 1: ed.get url Case 2: cr.get url Case 3: ie.get url ‘ does not load completely End Select End Sub |
Глава 7. Power Query и Интернет
Мы живем в эпоху бизнес-аналитики, и Power Query является частью пакета инструментов BI от Microsoft. Он позволит извлекать данные из различных источников, включая Интернет, изменять их и переносить готовый продукт на рабочий лист Excel. Для Excel 2010 и 2013 Power Query был надстройкой; начиная с Excel 2016 и далее, это встроенный ресурс. Примеры в этой главе будут основаны на Excel 365.
Простое подключение к веб-таблице
В первом примере мы увидим простую процедуру создания соединения с данными, хранящимися на веб-странице.
Шаг 1. В Excel пройдите по меню Данные –> Из Интернета:
Рис. 51. Запуск Power Query
Шаг 2. Вставьте адрес веб-страницы в диалоговое окно и нажмите Ok. Автор использовал страницу Вики с результатами соревнований
Рис. 52. Запрос в странице https://en.wikipedia.org/wiki/Athletics_at_the_2013_Mediterranean_Games_%E2%80%93_Results
Если вы первый раз обращаетесь к Википедии, появится запрос об уровне доступа:
Рис. 53. Уровень доступа
Оставьте установку по умолчанию – Анонимно. Нажмите Подключение. При последующих обращениях к Википедии это окно не будет появляться.
Шаг 3. В окне Навигатора отобразятся все доступные таблицы. Я выбрал таблицу 5000 metres. В правой части окна отобразилось содержимое таблицы. Видно, что это результаты женского финала в беге на 5000 м. Нажмите Преобразовать данные:
Рис. 54. Окно Навигатора
Откроется окно Редактор Power Query:
Рис. 55. Окно редактора Power Query
Шаг 4. Важно понимать, что, хотя у вас есть лента, строка формул, строки и столбцы с данными и язык программирования (называемый M), Power Query – это не Excel. Это два разных приложения, но они очень тесно взаимосвязаны друг с другом.
Как вы видите на рис. 55, данные уже есть, но они требуют обработки. Удалите столбцы Ранг и Примечания. Для этого выделите столбец, который вы хотите удалить, и на вкладке Главная нажмите кнопку Удалить столбцы. Или кликните на столбец правой кнопкой мыши, и выберите Удалить. Можно также удалить столбцы, которые не выбраны. Для выделения нескольких столбцов выделяйте их при нажатой клавише Ctrl. Чтобы выделить диапазон столбцов, кликните на первом, нажмите Shift, и кликните на последнем.
Шаг 5. Добавьте столбец, чтобы отразить место спортсмена. Для этого на вкладке Добавить столбец выберите Столбец индекса > От 1. После вставки перетащите его по строке заголовка влево. Таблица готова для экспорта в Excel.
Рис. 56. Таблица обработана в Power Query
Шаг 6. Выберите Файл > Закрыть и загрузить в…, чтобы определить, куда следует поместить данные:
Рис. 57. Опции загрузки запроса в книгу Excel
Нажмите Ok. Запрос будет помещен в умную таблицу на текущий лист, начиная с ячейки А1:
Рис. 58. Лист Excel с данными из запроса
Запрос построен и может быть обновлен в любое время; описанные выше шаги повторять не нужно.
Обходной путь подключения к веб-таблице
Power Query – развивающийся продукт, но пока он не может автоматически обнаруживать все таблицы на веб-странице. Иногда мы вообще не получаем таблиц при открытии диалогового окна Навигатор. Однако есть обходной путь, предложенный Microsoft MVP Gil Raviv. Мы можем вручную находить и импортировать данные.
В следующем примере мы пройдем по HTML-структуре страницы, пока не найдем нужную таблицу. На самом деле, Power Query находит эту таблицу в автоматическом режиме, но мы сделаем вид, что не находит, чтобы потренироваться.
Шаг 1. Начините, как в предыдущем примере: Данные –> Из Интернета. Укажите страницу подключения: https://climatedata.eu/climate.php?loc=szxx0038&lang=en
Рис. 59. Сайт для запроса таблицы
Оставьте уровень доступа Анонимно, выберите для подключения Document. Нажмите Преобразовать данные, чтобы загрузить Редактор Power Query. Идея состоит в том, чтобы кликать правильные узлы в столбце Children для перемещения по дереву HTML к нужным данным. Вот как выглядит HTML-код. Здесь также указаны некоторые из шагов, упомянутых ниже. Целевая таблица подсвечивается слева.
Рис. 60. HTML-код страницы
Выполняя следующие шаги, сравнивайте их с приведенным выше HTML-кодом, чтобы лучше понять процедуру:
- Щелкните ссылку на таблицу Table в единственной доступной строке.
- Щелкните Table во второй строке (элемент BODY).
- Щелкните Table в первой строке (элемент DIV).
- Щелкните Table во второй строке (элемент DIV).
- Щелкните Table в третьей строке (элемент DIV).
- Щелкните Table в третьей строке (элемент DIV).
- Щелкните Table в первой строке (элемент TABLE), Это уже наша таблица!
- Щелкните Table на единственной доступной строке, которая является элементом TBODY.
- На данный момент у нас уже есть шесть строк таблицы; теперь разверните столбец Children, щелкнув две маленькие стрелки, обращенные друг к другу в заголовке таблицы. В диалоговом окне снимите флажки с других столбцов, так как нам не нужно их разворачивать (рис. 63). Снимите флажок Использовать исходное имя столбца, как префикс.
Рис. 61. Шаги с первого по пятый
Рис. 62. Шаги с шестого по девятый
Рис. 63. Настройки окна Развернуть
Power Query показывает 42 одинаковые строки:
Рис. 64. Очередной шаг обработки
Разверните столбец Children1. Для раскрытия укажите только поле Text:
Рис. 65. Настройки второго окна Развернуть
Наши данные отобразятся, правда все в одном столбце:
Рис. 66. Столбец Text после команды Развернуть
Удалить все столбцы, кроме столбца Text.1. На вкладке Добавить столбец выберите Столбец индекса –> От 0:
Рис. 67. Добавлен столбец индекса
На вкладке Преобразование выберите Стандартный –> Остаток от деления. Когда появится диалоговое окно, введите число 7, которое является числом строк в исходной таблице:
Рис. 68. Преобразование индекса в остаток от деления на 7
На вкладке Добавить столбец выберите Столбец индекса –> От 0. Добавится второй столбец индекса. Снова перейдите на вкладку Преобразование, но теперь выберите Стандартный –> Целочисленное значение. Снова введите число 7:
Рис. 69. Второй индекс показывает целое от деления на 7
Выберите столбец Индекс и на вкладке Преобразование щелкните Столбец сведения. Когда появится диалоговое окно, выберите следующие параметры:
Рис. 70. Параметры сведения
Нажмите кнопку Оk. Далее удалите столбец Индекс.1. Пройдите по меню Главная –> Использовать первую строку в качестве заголовков. Присвойте первому столбцу имя Параметр. Ваш запрос принял нужный формат, и его можно загрузить!
Рис. 71. Обработанный запрос
Выберите Файл > Закрыть и загрузить в…, укажите Таблица на Имеющийся лист, как на рис. 57.
Рис. 72. Умная таблица на листе Excel, созданная запросом
Заключение
Excel и Интернет – две быстро развивающиеся динамические сущности, а эта небольшая книга способна показать вам интересные возможности, и придать импульс, чтобы вы начали заниматься этой увлекательной темой подробнее. Последний совет: вполне вероятно, что в какой-то момент вы застрянете при разработке своих проектов. Если это произойдет, подумайте о том, чтобы обратиться за помощью на веб-форумы, таких как MrExcel Message Board или Stack Overflow (есть на русском). Там вы найдете знающих людей, которые всегда готовы помочь. Удачи!