Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Оптимизация кода Vba / 6 сообщений из 6, страница 1 из 1
10.11.2017, 10:50
    #39550771
maxim863
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация кода Vba
Есть программа , которая парсит сайт . Работает она хорошо , но слишком долго . Хочу ее упростить /ускорить . Подскажите пожалуйста , может быть есть какие-нибудь специализированные сайты по этому вопросу ? Любым подсказкам буду благодарен .
Суть программы:
1. Сначала по гиперссылке прога заходит на сайт , где находит определенную таблицу элементов
2. Затем достает href каждого элемента , превращает его в гиперссылку , и вставляет в Excel в 1-ую таблицу
3. Потом достает текст каждого элемента и вставляет в Excel во 2-ую таблицу
4. Затем перебирает элементы 1-ой и 2-ой таблицы , чтобы в 3-ей таблице каждый элемент содержал в себе гиперссылку +текст

Код: vbnet
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.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
Sub Softгиперссылки()
Application.DisplayAlerts = False


Call mainмассивы

Application.DisplayAlerts = True
End Sub


Sub mainмассивы()
    Dim r As Range
    Dim firstAddress As String
    Dim iLoop As Long
    Dim book1 As Workbook
    Dim sheetNames(1 To 19) As String
    Dim Ssilka As String
    
   
    sheetNames(1) = "Лист1"
    sheetNames(2) = "Лист2"
    sheetNames(3) = "Лист3"
    sheetNames(4) = "Лист4"
    sheetNames(5) = "Лист5"
    sheetNames(6) = "Лист6"
    sheetNames(7) = "Лист7"
    sheetNames(8) = "Лист8"
    sheetNames(9) = "Лист9"
    sheetNames(10) = "Лист10"
    sheetNames(11) = "Лист11"
    sheetNames(12) = "Лист12"
    sheetNames(13) = "Лист13"
    sheetNames(14) = "Лист14"
    sheetNames(15) = "Лист15"
    sheetNames(16) = "Лист16"
    sheetNames(17) = "Лист17"
    sheetNames(18) = "Лист18"
    sheetNames(19) = "Лист19"
    
    'пропускаем ошибку
    
    Set book1 = Workbooks.Open("E:\Super M\Проект ставки\Поиск решения\Усов 7\Условия для андердогов\6.xlsm")
    
    iLoop = -1
    
    With book1.Worksheets("Лист1").Range("R34:R99")
    
      For Each r In .Rows
             If r.Value = 1 Then
            
                iLoop = iLoop + 1
                Ssilka = r.Offset(, -13).Hyperlinks.Item(1).Address
                .Parent.Parent.Worksheets(sheetNames(1)).Activate
                .Parent.Parent.Save
                extractTable Ssilka, book1, iLoop
                
              End If
      Next r
     
    End With
   book1.Save
   book1.Close
    Exit Sub

  
   End Sub


Function extractTable(Ssilka As String, book1 As Workbook, iLoop As Long)
    Dim oDom As Object, oTable As Object, oRow As Object
    Dim iRows As Integer, iCols As Integer
    Dim x As Integer, y As Integer
    Dim data()
    Dim oHttp As Object
    Dim oRegEx As Object
    Dim sResponse As String
    Dim oRange As Range
    Dim Perem1 As String
    Dim Perem2 As String
    
    
  
    'для гиперссылки
    
    ' get page
    Set oHttp = CreateObject("MSXML2.XMLHTTP")
    oHttp.Open "GET", Ssilka, False
    oHttp.Send
    
    ' cleanup response
    sResponse = StrConv(oHttp.responseBody, vbUnicode)
    Set oHttp = Nothing
    
    sResponse = Mid$(sResponse, InStr(1, sResponse, "<!DOCTYPE "))
    
    Set oRegEx = CreateObject("vbscript.regexp")
    With oRegEx
        .MultiLine = True
        .Global = True
        .IgnoreCase = False
        .Pattern = "<(script|SCRIPT)[\w\W]+?</\1>"
        sResponse = .Replace(sResponse, "")
    End With
    Set oRegEx = Nothing
    
    ' create Document from response
    Set oDom = CreateObject("htmlFile")
    oDom.Write sResponse
    DoEvents
    
    ' table with results, indexes starts with zero
    Set oTable = oDom.getelementsbytagname("table")(3)
    
    DoEvents
    
    iRows = oTable.Rows.Length
    iCols = oTable.Rows(1).Cells.Length
    
    ' first row and first column contain no intresting data
    ReDim data(1 To iRows - 1, 1 To iCols - 1)
    
    ' fill in data array
    For x = 1 To iRows - 1
        Set oRow = oTable.Rows(x)
        
        For y = 1 To iCols - 1
             If oRow.Cells(y).Children.Length > 0 Then
                data(x, y) = oRow.Cells(y).getelementsbytagname("a")(0).getattribute("href")
                  
            End If

        Next y
    Next x
    
    Set oRow = Nothing
    Set oTable = Nothing
    Set oDom = Nothing
    
    ' put data array on worksheet
    
    Set oRange = book1.ActiveSheet.Cells(110, 26 + (iLoop * 21)).Resize(iRows - 1, iCols - 1)
    oRange.NumberFormat = "@"
    oRange.Value = data
    oRange.Replace What:="about:", Replacement:="http://allscores.ru/soccer/"
    Set oRange = Nothing
    
          '!!!! для текста
    
    ' get page
    Set oHttp = CreateObject("MSXML2.XMLHTTP")
    oHttp.Open "GET", Ssilka, False
    oHttp.Send
    
    ' cleanup response
    sResponse = StrConv(oHttp.responseBody, vbUnicode)
    Set oHttp = Nothing
    
    sResponse = Mid$(sResponse, InStr(1, sResponse, "<!DOCTYPE "))
    
    Set oRegEx = CreateObject("vbscript.regexp")
    With oRegEx
        .MultiLine = True
        .Global = True
        .IgnoreCase = False
        .Pattern = "<(script|SCRIPT)[\w\W]+?</\1>"
        sResponse = .Replace(sResponse, "")
    End With
    Set oRegEx = Nothing
    
    ' create Document from response
    Set oDom = CreateObject("htmlFile")
    oDom.Write sResponse
    DoEvents
    
    ' table with results, indexes starts with zero
    Set oTable = oDom.getelementsbytagname("table")(3)
    
    DoEvents
    
    iRows = oTable.Rows.Length
    iCols = oTable.Rows(1).Cells.Length
    
    ' first row and first column contain no intresting data
    ReDim data(1 To iRows - 1, 1 To iCols - 1)
    
    ' fill in data array
    For x = 1 To iRows - 1
        Set oRow = oTable.Rows(x)
        
        For y = 1 To iCols - 1
             If oRow.Cells(y).Children.Length > 0 Then
                data(x, y) = oRow.Cells(y).innerText
                  
            End If

        Next y
    Next x
    
    Set oRow = Nothing
    Set oTable = Nothing
    Set oDom = Nothing
    
    ' put data array on worksheet
    
    Set oRange = book1.ActiveSheet.Cells(185, 26 + (iLoop * 21)).Resize(iRows - 1, iCols - 1)
    oRange.NumberFormat = "@"
    oRange.Value = data
    
    Set oRange = Nothing
    
        '!!!!! цикл для текст+гиперссылка
 
  
    For A = 0 To 4
       For B = 0 To 65
       
         Perem1 = book1.ActiveSheet.Cells(110 + B, (26 + (iLoop * 21)) + A).Value
         Perem2 = book1.ActiveSheet.Cells(185 + B, (26 + (iLoop * 21)) + A).Value
        
          book1.ActiveSheet.Hyperlinks.Add Anchor:=Cells(34 + B, (26 + (iLoop * 21)) + A), Address:=Perem1, TextToDisplay:=Perem2
       Next
    Next
    
    

End Function


...
Рейтинг: 0 / 0
10.11.2017, 10:56
    #39550782
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация кода Vba
maxim863Суть программы:
1. Сначала по гиперссылке прога заходит на сайт , где находит определенную таблицу элементов
2. Затем достает href каждого элемента , превращает его в гиперссылку , и вставляет в Excel в 1-ую таблицу
3. Потом достает текст каждого элемента и вставляет в Excel во 2-ую таблицу
4. Затем перебирает элементы 1-ой и 2-ой таблицы , чтобы в 3-ей таблице каждый элемент содержал в себе гиперссылку +текст
Разумнее было это указать в коде, комментариями. Ещё разумнее - указать И в коде.

Ну да ладно...
1) Какой из этих этапов тормозит?
2) Действительно ли нужны первые две таблицы? почему бы не накопить все данные в памяти и прямо там обработать?
...
Рейтинг: 0 / 0
10.11.2017, 12:35
    #39550902
big-duke
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация кода Vba
Все промежуточные расчеты/поиски/заполнения вынести в рекордсет.
Финальный перенос данных в Excel через CopyFromRecordset.
...
Рейтинг: 0 / 0
10.11.2017, 13:44
    #39550966
maxim863
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация кода Vba
Akina, Первые две таблицы не нужны . Насчет , накопить все данные в памяти и прямо там обработать , так и хотел сделать. Просто не совсем понимаю ,как .
...
Рейтинг: 0 / 0
10.11.2017, 13:53
    #39550978
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация кода Vba
big-duke же вменяемо написал. Гоните данные в отвязанный рекордсет, а потом все накопленные данные единым махом вываливайте на лист.

Ну или совсем просто - объявите динамический массив, и вставляйте прямо в него. А потом просто копируйте его в нужный диапазон листа.
...
Рейтинг: 0 / 0
14.11.2017, 13:37
    #39552843
maxim863
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация кода Vba
Akina,
Можете написать минимальный пример , как закинуть данные в recordset (из того , что я нашел :"Для табличного объекта Recordset в базе данных Microsoft Jet в качестве источника допускается указание только имени таблицы") . А как это грамотно записать -не могу найти .
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Оптимизация кода Vba / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]