Парсинг excel файла vba

Пользовательские функции VBA Excel для парсинга сайтов, html-страниц и файлов, возвращающие их текстовое содержимое. Примеры записи текста в переменную.

Парсинг html-страниц (msxml2.xmlhttp)

Пользовательская функция GetHTML1 (VBA Excel) для извлечения (парсинга) текстового содержимого из html-страницы сайта по ее URL-адресу с помощью объекта «msxml2.xmlhttp»:

Function GetHTML1(ByVal myURL As String) As String

On Error Resume Next

    With CreateObject(«msxml2.xmlhttp»)

        .Open «GET», myURL, False

        .send

        Do: DoEvents: Loop Until .readyState = 4

        GetHTML1 = .responseText

    End With

End Function

Парсинг сайтов (WinHttp.WinHttpRequest.5.1)

Пользовательская функция GetHTML2 (VBA Excel) для извлечения (парсинга) текстового содержимого из html-страницы сайта по ее URL-адресу с помощью объекта «WinHttp.WinHttpRequest.5.1»:

Function GetHTML2(ByVal myURL As String) As String

On Error Resume Next

    With CreateObject(«WinHttp.WinHttpRequest.5.1»)

        .Open «GET», myURL, False

        .send

        Do: DoEvents: Loop Until .readyState = 4

        GetHTML2 = .responseText

    End With

End Function

Парсинг файлов (ADODB.Stream)

Пользовательская функция GetText (VBA Excel) для извлечения (парсинга) текстового содержимого из файла (.txt, .csv, .mhtml), сохраненного на диск компьютера, по его полному имени (адресу) с помощью объекта «ADODB.Stream»:

Function GetText(ByVal myFile As String) As String

On Error Resume Next

    With CreateObject(«ADODB.Stream»)

        .Charset = «utf-8»

        .Open

        .LoadFromFile myFile

        GetText = .ReadText

        .Close

    End With

End Function

Примеры записи текста в переменную

Общая формула записи текста, извлеченного с помощью пользовательских функций VBA Excel, в переменную:

Dim htmlText As String

htmlText = GetHTML1(«Адрес сайта (html-страницы)»)

htmlText = GetHTML2(«Адрес сайта (html-страницы)»)

htmlText = GetText(«Полное имя файла»)

Конкретные примеры:

htmlText = GetHTML1(«https://internettovary.ru/nabor-dlya-vyrashchivaniya-veshenki/»)

htmlText = GetHTML2(«https://internettovary.ru/nabor-dlya-vyrashchivaniya-veshenki/»)

htmlText = GetText(«C:UsersEvgeniyDownloadsНовый текстовый документ.txt»)

htmlText = GetText(«C:UsersEvgeniyDownloadsИспользование msxml2.xmlhttp в Excel VBA.mhtml»)

В понятие «парсинг», кроме извлечения текстового содержимого сайтов, html-страниц или файлов, входит поиск и извлечение конкретных данных из всего полученного текстового содержимого.

Пример извлечения email-адресов из текста, присвоенного переменной, смотрите в последнем параграфе статьи: Регулярные выражения (объекты, свойства, методы).

Парсинг содержимого тегов

Извлечение содержимого тегов с помощью метода getElementsByTagName объекта HTMLFile:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

Sub Primer1()

Dim myHtml As String, myFile As Object, myTag As Object, myTxt As String

    ‘Извлекаем содержимое html-страницы в переменную myHtml с помощью функции GetHTML1

    myHtml = GetHTML1(«https://internettovary.ru/sadovaya-nozhovka-sinitsa/»)

    ‘Создаем объект HTMLFile

    Set myFile = CreateObject(«HTMLFile»)

    ‘Записываем в myFile текст из myHtml

    myFile.body.innerHTML = myHtml

    ‘Присваиваем переменной myTag коллекцию одноименных тегов, имя которого

    ‘указанно в качестве аргумента метода getElementsByTagName

    Set myTag = myFile.getElementsByTagName(«p»)

    ‘Выбираем, содержимое какого тега по порядку, начинающегося с 0, нужно извлечь

    myTxt = myTag(5).innerText

    MsgBox myTxt

    ‘Большой текст может не уместиться в MsgBox, тогда для просмотра используйте окно Immediate

    ‘Debug.Print myTxt

End Sub

С помощью этого кода извлекается текст, расположенный между открывающим и закрывающим тегами. В примере — это текст 6-го абзаца (p) между 5-й (нумерация с 0) парой отрывающего <p> и закрывающего </p> тегов.

Примеры тегов, используемых в html: "p", "title", "h1", "h2", "table", "div", "script".

Пример извлечения содержимого тега "title":

Sub Primer2()

Dim myHtml As String, myFile As Object, myTag As Object, myTxt As String

    myHtml = GetHTML1(«https://internettovary.ru/sadovaya-nozhovka-sinitsa/»)

    Set myFile = CreateObject(«HTMLFile»)

    myFile.body.innerHTML = myHtml

    Set myTag = myFile.getElementsByTagName(«title»)

    myTxt = myTag(0).innerText

    MsgBox myTxt

End Sub

Парсинг содержимого Id

Извлечение текстового содержимого html-элементов, имеющих уникальный идентификатор — Id, с помощью метода getElementById объекта HTMLFile:

Sub Primer3()

Dim myHtml As String, myFile As Object, myTag As Object, myTxt As String

    myHtml = GetHTML1(«https://internettovary.ru/sadovaya-nozhovka-sinitsa/»)

    Set myFile = CreateObject(«HTMLFile»)

    myFile.body.innerHTML = myHtml

    ‘Присваиваем переменной myTag html-элемент по указанному в скобках Id

    Set myTag = myFile.getElementById(«attachment_465»)

    ‘Присваиваем переменной myTxt текстовое содержимое html-элемента с Id

    myTxt = myTag.innerText

    MsgBox myTxt

    ‘Большой текст может не уместиться в MsgBox, тогда для просмотра используйте окно Immediate

    ‘Debug.Print myTxt

End Sub

Для реализации представленных здесь примеров могут понадобиться дополнительные библиотеки. В настоящее время у меня подключены следующие (к данной теме могут относиться последние шесть):

  • Visual Basic For Applications
  • Microsoft Excel 16.0 Object Library
  • OLE Automation
  • Microsoft Office 16.0 Object Library
  • Microsoft Forms 2.0 Object Library
  • Ref Edit Control
  • Microsoft Scripting Runtime
  • Microsoft Word 16.0 Object Library
  • Microsoft Windows Common Controls 6.0 (SP6)
  • Microsoft ActiveX Data Objects 6.1 Library
  • Microsoft ActiveX Data Objects Recordset 6.0 Library
  • Microsoft HTML Object Library
  • Microsoft Internet Controls
  • Microsoft Shell Controls And Automation
  • Microsoft XML, v6.0

С этим набором библиотек все примеры работают. Тестирование проводилось в VBA Excel 2016.


Если использовать тип Long, то файл ограничится размером в 2Гб, думаю тогда можно сделать тип Single. Встречал в интернете, что некоторым нужно было обрабатывать большие файлы, размером в 10Гб.

Размер буфера я пробовал менять от 100Кб до 10Мб, особой разницы я не заметил, зато при 10Мб требуется мегабайт 20 оперативки дополнительно. Величина в 512Кб вполне подходит и по скорости и по объему оперативки.

scripting.fso не использовал, т.к. посчитал что данный способ простой и вполне понятный, мне кажется это на скорость не повлияет, т.к. операций чтения файла происходит немного, и при этом эта библиотека все равно не имеет операторов, чтобы читать файл задом наперед построчно.

Обработку ошибок при открытии файла не писал, т.к. сроки поджимали, важно было сделать сам алгоритм

Модуль и вправду большой получился. Оформлять в виде класса идея хорошая, может и сделаю, пока не до этого.
Всем спасибо. Может кому пригодится.

Для начала, создайте в вашем файле Excel (куда вы будете добавлять макрос запуска парсера) отдельный VBA-модуль, и поместите туда следующий код:

Код для запуска надстройки, и нужного парсера сайта

#If VBA7 Then        '  Office 2010-2013
    Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" _
            (ByVal pCaller As LongPtr, ByVal szURL As String, ByVal szFileName As String, _
             ByVal dwReserved As LongPtr, ByVal lpfnCB As LongPtr) As LongPtr
#Else        '  Office 2003-2007
    Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" _
                                               (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, _
                                                ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
#End If
 
Sub RunSpecificParser(ByVal ParserName$)
    On Error Resume Next
    If Not AddinStarted Then Exit Sub    ' если программа «Парсер» не запущена, то выход из макроса

    res$ = Application.Run("StartParser", ParserName$)
    If Len(res$) Then    ' если парсер не запустился - в переменной res$ будет текст ошибки
        MsgBox res$, vbCritical, "Ошибка запуска парсера"
        Exit Sub
    Else
       ' MsgBox "Парсер был запущен, и завершил свою работу", vbInformation
    End If
End Sub
 
Function AddinStarted() As Boolean
    On Error Resume Next
    ' проверяем, запущена ли надстройка Parser
    Test$ = Application.Run("ParserAddinTest")
    If Err.Number = 0 Then AddinStarted = True: Exit Function
 
    If Err.Number = 1004 Then        ' макрос не выполнен - надстройка не запущена
        ' читаем в реестре путь к файлу надстройки, пытаемся найти и запустить надстройку
        AddinPath$ = GetSetting("Parser", "Setup", "AddinPath", "")
        If FileExists(AddinPath$) Then
            Set WB = Workbooks.Open(AddinPath$)        ' пробуем открыть (запустить) надстройку
            t = Timer: Err.Raise 777
            While (Err > 0) And (Abs(Timer - t) < 6)
                Err.Clear: DoEvents: Test$ = Application.Run("ParserAddinTest")        ' снова проверяем
            Wend
            If Err.Number = 0 Then AddinStarted = True: Exit Function
        End If
    End If
 
    ' надстройка не запустилась, не найдена, или какая-то другая проблема
    ttl$ = "Для работы этого файла необходима надстройка «Парсер сайтов»"
    msg$ = "Необходимая для работы этого файла надстройка «Parser» не найдена на вашем компьютере." & vbNewLine & vbNewLine & _
           "Скачать и запустить надстройку?"
    If MsgBox(msg, vbQuestion + vbOKCancel, ttl$) = vbCancel Then Exit Function
 
    URL$ = "http://excelvba.ru/updates/download.php?addin=Parser"
    AddinPath$ = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "Parser.xla"
 
    Kill AddinPath$
    If URLDownloadToFile(0, URL$, AddinPath$, 0, 0) = 0 Then        ' надстройка успешно загружена
        If FileExists(AddinPath$) Then
            Workbooks.Open AddinPath$        ' пробуем открыть (запустить) надстройку
            Err.Clear: Test$ = Application.Run("ParserAddinTest")        ' снова проверяем
            If Err.Number = 0 Then AddinStarted = True: Exit Function
        End If
    End If
 
    msg$ = "Не удалось скачать и запустить надстройку с сайта ExcelVBA.ru" & vbNewLine & _
           "(возможно, приложению Excel закрыт доступ в интернет)" & vbNewLine & vbNewLine & _
           "После нажатия кнопки ОК в этом сообщении, будет открыта страница программы," & vbNewLine & _
           "где вы сможете скачать надстройку «Parser» (после чего запустить её, и продолжить работу с этим файлом)"
 
    MsgBox msg$, vbExclamation, "При загрузке или запуске надстройки возникли проблемы"
    CreateObject("wscript.Shell").Run "http://excelvba.ru/programmes/Parser"
End Function
 
Private Function FileExists(ByVal filename$) As Boolean
    On Error Resume Next: FileExists = CreateObject("Scripting.FileSystemObject").FileExists(filename$)
End Function

После этого, в модуль ЭтаКнига (если вы хотите, чтобы парсер запускался вместе с открытием вашего файла Excel) добавьте следующий код:

Private Sub Workbook_Open()
    ' автоматически срабатывает при открытии книги
    RunSpecificParser "НазваниеЗапускаемогоПарсера"
End Sub

Во вложении — файл с этим кодом, а также с возможностью для пользователя отменить автоматический запуск парсера в течение 5 секунд после открытия файла. Такой файл можно закинуть в планировщик задач Windows

Есть excel-файлы, несколько сотен.
Из них нужно как-то извлечь некоторые строки, по заданному принципу (текст в них отличается).
И залить эти строки в один новый экселевский файл.
Можно сделать руками, но лень. И еще есть вариант, что данная задача будет периодически повторяться.
Подскажите, пожалуйста, какими инструментами лучше это программно сделать? Автоматически по очереди пооткрывать все файлы в директории, пропарсить, взять нужные строки, залить в новый файл.
Может, был у кого похожий опыт.
Я начал смотреть в сторону python и www.python-excel.org

Может лучше сделать это visual basic’ом? Или вообще в самом экселе есть такая возможность?
Спасибо!

P.S. Все сделал так: сперва нашел плагин для эксель, бесплатно и быстро сливающий много эксель файлов в один. Вот он.
Затем искал конкретные макросы, удаляющие строки по различным критериям, типа — пустая ячейка, текст в ячейке, цифры в ячейке.
В общем, даже не пришлось сильно разбираться с VBA, все сделал готовыми средствами.

 

Acid Burn

Пользователь

Сообщений: 585
Регистрация: 23.12.2012

Привет, Планета!

Опять нужна Ваша помощь.
Есть куча Excel-файлов с кучей формул.
Надо макросом найти и скопировать все формулы в отдельную книгу в виде таблицы:
«Имя книги-листа-ячейки» — «Значение» — «Формула без знака ‘='».

Т.е. получить нужный результат можно, задав на поиск в каждой книге символ «=».

Скрин

.
Но его нельзя сохранить или вывести на лист.
Понимаю, что нужно как-то зациклить поиск с выборкой результатов в массив и потом вывести массив на лист.
Вроде всё просто, но при температуре почти 40º не могу сообразить — мозг просто плавится.

SOS!!!

 

galina mur

Пользователь

Сообщений: 245
Регистрация: 25.12.2012

#2

28.06.2013 00:37:07

макет формирования

Код
Sub formula28()
Dim j1, j1k, j2, j2k, s1
   j1 = 0
   j1k = 20

   Do While j1 < j1k
      j1 = j1 + 1
      j2 = 0
      j2k = 20

      Do While j2 < j2k
         j2 = j2 + 1
         s1 = Cells(j1, j2).Formula
         ''FormulaR1C1

         If Mid(s1 & " ", 1, 1) = "=" Then
            Debug.Print j1, j2, Mid(s1, 2)
         End If
      Loop
   Loop
End Sub
 

ikki

Пользователь

Сообщений: 9709
Регистрация: 22.12.2012

#3

28.06.2013 07:16:59

Код
Sub t()
  Dim x As Range, c As Range, i&
  Set x = Sheets(1).UsedRange.SpecialCells(xlCellTypeFormulas, 23)
  If Not x Is Nothing Then
    For Each c In x.Cells
      i = i + 1
      Sheets(2).Cells(i, 1).Value = Mid(c.Formula, 2)
    Next
  End If
End Sub

Изменено: ikki29.06.2013 05:02:47

фрилансер Excel, VBA — контакты в профиле
«Совершенствоваться не обязательно. Выживание — дело добровольное.» Э.Деминг

 

Acid Burn

Пользователь

Сообщений: 585
Регистрация: 23.12.2012

#4

28.06.2013 21:22:21

galina mur, ikki, LightZ, огромное Вам спасибо!
Попытался сделать универсальный макрос для поиска текста/формул в указанных xls*-файлах.
Выдаёт результат в виде Файл — Лист — Ячейка — Формула — Значение.
В информационных строках прописывает запрос, путь, число найденных результатов и время выполнения.

Осталось 2 вопроса:

Прикрепленные файлы

  • Выборка.xlsb (23.59 КБ)

Изменено: Acid Burn06.07.2013 12:59:40

 

LightZ

Пользователь

Сообщений: 1748
Регистрация: 22.12.2012

Еще желательно добавить цикл по всем листам
И для быстроты занести в массив, а потом выгрузить результат на лист

Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?

 

LightZ

Пользователь

Сообщений: 1748
Регистрация: 22.12.2012

1. Почитайте справку про методы FileDialog’a
2. Используйте булевую переменную
Ps. Почему Вы изменяете своё сообщение, а не пишете новое?
Ведь если тема будет подыматься вверх — шансов, что Вам помогут больше.

Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?

 

Acid Burn

Пользователь

Сообщений: 585
Регистрация: 23.12.2012

#7

06.07.2013 20:19:47

LightZ, через FileDialog у меня не получилось, про булевую переменную вообще не понял.
Можно пример кода?

Цитата
Почему Вы изменяете своё сообщение, а не пишете новое?

Просто не люблю засорять темы — потом самому же сложно перечитывать.

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

Если изменяете так, что в последующих сообщениях искажается смысл или теряется привязка, то мусора становится больше. Обращайте на это вимание.
Нужно учитывать, что посетители не перечитывают сообщения каждый раз при входе в тему и могут быть не в курсе новостей, которыми Вы напичкаете старые сообщения. Править/дополнять можно и нужно, но с умом.

 

LightZ

Пользователь

Сообщений: 1748
Регистрация: 22.12.2012

Acid Burn,
1. С помощью FileDialog(msoFileDialogFilePicker) — зажимаете шифт и выделяете нужные Вам файлы или сразу все через Ctrl+A.
2. Пример кода можно.
Покажите какой результат у Вас сейчас и какой должен быть.
Также приложите часть кода, где выполняется нужный этап.

Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?

 

Acid Burn

Пользователь

Сообщений: 585
Регистрация: 23.12.2012

#10

06.07.2013 23:24:33

Так-то «результат» был выложен в посте #4.
Вот код:

Код 1

Код 2

Изменено: Acid Burn06.07.2013 23:26:51

 

LightZ

Пользователь

Сообщений: 1748
Регистрация: 22.12.2012

#11

07.07.2013 10:47:39

А нужный результат Вы так и не приложили…
Т.е. Вам нужно, чтобы названия листов и книг не дублировалось и просто были пустые ячейки?
Если да — тогда необходимо вынести запись имён листа и книги за цикл Do.

Код
 
lLR = iShFound.Cells(Rows.Count, 4).End(xlUp).Row + 1
iShFound.Cells(lLR, 2) = iWB.Name                ' Имя файла (при переходе от файла к файлу)
iShFound.Cells(lLR, 3) = iSh.Name                         ' Имя листа (при переходе от листа к листу)
Do
   With iShFound
      iLastRow = .Cells(.Rows.Count, 4).End(xlUp).Row + 1
      .Cells(iLastRow, 4) = iRng.Address            ' Адрес ячейки
      .Cells(iLastRow, 5) = Mid(iRng.Formula, 2)    ' Формула
      .Cells(iLastRow, 6) = iRng                    ' Значение
   End With

Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?

 

Acid Burn

Пользователь

Сообщений: 585
Регистрация: 23.12.2012

LightZ, Вы меня абсолютно правильно поняли.
Но выносить запись имён листа и книги за цикл Do я уже пробовал — работает не правильно.
С FileDialog тоже тромб… Похоже придётся рисовать форму и использовать Shell… (?)

 

LightZ

Пользователь

Сообщений: 1748
Регистрация: 22.12.2012

1. Подумайте логически — как может работать неправильно?))
просто сделайте 2 переменные последней строки
2. Что не получается? Почему не подходит filedialog ?

Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?

 

Acid Burn

Пользователь

Сообщений: 585
Регистрация: 23.12.2012

1. Забыл изменить имя переменной.
Теперь всё работает! Простите за невнимательность!
2. При работе с папкой, содержащей несколько файлов Excel, хотелось бы получить:
а) возможность выбрать несколько файлов
б) возможность выбрать только 1 файл
в) автоматическую блокировку открытия файла-источника макроса (при его случайном выборе)
Сейчас работает только вариант «а)».

 

LightZ

Пользователь

Сообщений: 1748
Регистрация: 22.12.2012

#15

09.07.2013 23:08:26

Такое чувство, что Вы читаете мои сообщения через строку или же вообще не читаете.

Цитата
LightZ пишет:
Acid Burn ,
1. С помощью FileDialog(msoFileDialogFilePicker) — зажимаете шифт и выделяете нужные Вам файлы или сразу все через Ctrl+A.

это а) и б)
насчет в) ничего не понял

Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?

 

Acid Burn

Пользователь

Сообщений: 585
Регистрация: 23.12.2012

LightZ, вот моя

тестовая папка

:
Выборка.xlsb — файл с макросом поиска; Тест — папка с 2-мя файлами (01, 02).
Попробуйте выбрать только поиск по файлу 01 — это будет пункт б), и он не работает.
Затем попробуйте поместить в папку Тест файл Выборка.xlsb — это будет пункт в).

 

LightZ

Пользователь

Сообщений: 1748
Регистрация: 22.12.2012

#17

10.07.2013 21:17:16

Посмотрел. А зачем вообще использовать Dir?
Ведь можно сделать всё намного проще и обойтись только FileDialog’ом
См. пример:

Код
Sub io()
    Dim i&
    With Application.FileDialog(msoFileDialogFilePicker)
        .Show: If .SelectedItems.Count = 0 Then Exit Sub
        For i = 1 To .SelectedItems.Count
            MsgBox .SelectedItems(i)
        Next
    End With
End Sub

Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?

 

Acid Burn

Пользователь

Сообщений: 585
Регистрация: 23.12.2012

Кстати, да. Спасибо Вам, LightZ! Я что-то и не подумал.
В новой версии:
1. Перестроил и сократил код
2. Ускорил очистку листа, заменил True/False на 0/1 (надеюсь, не перестарался)
3. Ввёл выдачу формул на русском
4. Добавил обработчик ошибок
5. Прикрутил более точный таймер
Прогнал в реальных условиях: 246940 результатов за 05:03:626 мин. (~813 опер./сек.). Медленно…

LightZ, в посте #5 Вы предлагали предварительно занести данные в массив.
Как это сделать?

Изменено: Acid Burn11.07.2013 09:44:58

 

LightZ

Пользователь

Сообщений: 1748
Регистрация: 22.12.2012

#19

11.07.2013 10:52:09

Цитата
Acid Burn пишет: 2. Ускорил очистку листа, заменил True/False на 0/1 (надеюсь, не перестарался)

Что?   :|

По поводу массивов, вот пример:

Код
Dim aValues(), aFormuls()
aFormuls = Лист1.UsedRange.FormulaLocal
aValues = Лист1.UsedRange.Value

Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?

 

Acid Burn

Пользователь

Сообщений: 585
Регистрация: 23.12.2012

>> Что?
В смысле я заменил очистку 1048576 строк на очистку UsedRange.
В логических операторах ввёл 0/1 вместо True/False, т.к. цифровые значения в VBA обрабатываются быстрее.
Просто объединил в один пункт. :)
>> aValues(), aFormuls()
Тут не понял.
Можно поподробнее?

 

LightZ

Пользователь

Сообщений: 1748
Регистрация: 22.12.2012

А что именно не понятно?

Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?

 

Acid Burn

Пользователь

Сообщений: 585
Регистрация: 23.12.2012

Не могу понять, как использовать — ни зачитать, ни выгрузить в Excel.
С массивами у меня туго.

 

LightZ

Пользователь

Сообщений: 1748
Регистрация: 22.12.2012

#23

11.07.2013 23:20:43

Всё просто, вот пример:

Код
Option Base 1
Sub tt()
    Dim aValues(), aFormuls()
    Dim i&, j&
    Rem заносим в массив значения и формулы
    With Лист1.UsedRange
        aValues = .Value
        aFormuls = .FormulaLocal
    End With
    Rem проходим циклом по строкам и столбцам массивов
    For i = 1 To UBound(aFormuls)
        For j = 1 To UBound(aFormuls, 2)
            If aFormuls(i, j) <> Empty Then
                Debug.Print aValues(i, j), " - значение"
                Debug.Print aFormuls(i, j), " - формула"
                Debug.Print Cells(i, j).Address, " - адрес"
            End If
        Next
    Next
End Sub

В данном примере адрес можно получить только если в A1 есть значение.
Ps.

Советую почитать

Изменено: LightZ11.07.2013 23:24:33

Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?

 

Acid Burn

Пользователь

Сообщений: 585
Регистрация: 23.12.2012

LightZ, почитать и понять — разные вещи.
На всё нужно время…
За пример спасибо, правда адаптировать его не смог, только больше запутался.
В принципе, 5 минут на 246940 результатов — не так уж и плохо.
Предлагаю закрыть тему.

 

Acid Burn

Пользователь

Сообщений: 585
Регистрация: 23.12.2012

#25

31.08.2013 16:48:46

Один замечательный человек помог кардинально улучшить мой макрос.
Теперь для любого количества файлов Excel можно получить:
1. Всю информацию в соответствии с запросом на одном листе
2. Перечень уникальных функций и операторов
3. Перечень уникальных формул (последовательностей функций)
4. Проанализировать, какие функции/формулы/операторы используются чаще всего

Надеюсь, кому-то пригодится.

Прикрепленные файлы

  • Макрос.xlsb (41.79 КБ)

Понравилась статья? Поделить с друзьями:
  • Парсинг excel на java
  • Парсинг excel в html
  • Парсинг excel python pandas
  • Парсер цен с сайта в excel бесплатно
  • Парсер сайтов для excel