powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Совмещение двух программ
13 сообщений из 13, страница 1 из 1
Совмещение двух программ
    #39295938
maxim863
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1-ая прога : Ищет в столбце “U” единицу “1” затем извлекает гиперссылку из параллельного столбца и вставляет ее на новый лист (и так все единицы в столбце “U”).
2-ая прога : Копирует определенный текст по ссылке из интернета , затем вставляет его в определенное место в данной книге.
Нуждаюсь в совмещении этих двух программ (эти две проги работают).
Совмещенная прога: Ищет в столбце “U” единицу “1” затем извлекает гиперссылку из параллельного столбца , затем по этой ссылке копирует определенный текст из интернета и вставляет его на новый лист в определенное место (и так все единицы в столбце “U”).
1-ая прога :
Код: 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.
Option Explicit

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
    
    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\Проект ставки\Поиск решения\Усов 4\прога для книга\21.xlsx")
    book1.Worksheets("21").Range("U33:U99") = book1.Worksheets("21").Range("U33:U99").Value
    book1.Save
    book1.Close
    
    With Workbooks.Open("E:\Super M\Проект ставки\Поиск решения\Усов 4\прога для книга\21.xlsx").Worksheets("21").Range("U33:U99") '<--| open wanted workbook and refer to cells "U33:U99" in its worksheet "7"
          
        Set r = .Find(What:="1") '<--| the Find() method is called on the range referred to in the preceding With statement
        If Not r Is Nothing Then
            firstAddress = r.Address
            Do
                iLoop = iLoop + 1 '<-- update loop counter
                .Parent.Parent.Worksheets(sheetNames(iLoop)).Cells(1, 1).Value = r.Offset(, -16).Hyperlinks.Item(1).Address '<--| write into proper worksheet whose name is taken from sheetNames array at index corresponding to current loop
                Set r = .FindNext(r) '<--| the FindNext() method is still called on the same range as in the preceding  .Find() statement
            Loop While Not r Is Nothing And r.Address <> firstAddress And iLoop < 19 '<--| exit loop if either you hit the first link or completed three loops
        End If
    End With
End Sub


2-ая прога :
Код: 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.
Option Explicit

Sub extractTable_3()
    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
    
    ' get page
    Set oHttp = CreateObject("MSXML2.XMLHTTP")
    oHttp.Open "GET", "http://allscores.ru/soccer/new_ftour.php?champ=1110&f_team=1015", 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
            data(x, y) = oRow.Cells(y).innerText
        Next y
    Next x
    
    Set oRow = Nothing
    Set oTable = Nothing
    Set oDom = Nothing
    
    ' put data array on worksheet
    Set oRange = ThisWorkbook.Worksheets(1).Cells(34, 2).Resize(iRows - 1, iCols - 1)
    oRange.NumberFormat = "@"
    oRange.Value = data
    Set oRange = Nothing
    
    '<DEBUG>
'    For x = LBound(data) To UBound(data)
'        Debug.Print x & ":[ ";
'        For y = LBound(data, 2) To UBound(data, 2)
'            Debug.Print y & ":[" & data(x, y) & "] ";
'        Next y
'        Debug.Print "]"
'    Next x
    '</DEBUG>
    
End Sub
...
Рейтинг: 0 / 0
Совмещение двух программ
    #39296893
maxim863
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пробую совместить программы , но никак не получается вставить , полученные данный с сайта , в нужную книгу (активный лист в ней). Run-time error 438 Object doesnt support this property or method
Код: 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.
Option Explicit

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 Variant
    
    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\Проект ставки\Поиск решения\Усов 4\прога для книга\21.xlsx")
    book1.Worksheets("21").Range("U33:U99") = book1.Worksheets("21").Range("U33:U99").Value
    book1.Save
    book1.Close
    
    With Workbooks.Open("E:\Super M\Проект ставки\Поиск решения\Усов 4\прога для книга\21.xlsx").Worksheets("21").Range("U33:U99") '<--| open wanted workbook and refer to cells "U33:U99" in its worksheet "7"
          
        Set r = .Find(What:="1") '<--| the Find() method is called on the range referred to in the preceding With statement
        If Not r Is Nothing Then
            firstAddress = r.Address
            Do
                iLoop = iLoop + 1 '<-- update loop counter
                .Parent.Parent.Worksheets(sheetNames(iLoop)).Activate
                 Ssilka = r.Offset(, -16).Hyperlinks.Item(1).Address
                  extractTable_3 (Ssilka)
                
                Set r = .FindNext(r) '<--| the FindNext() method is still called on the same range as in the preceding  .Find() statement
            Loop While Not r Is Nothing And r.Address <> firstAddress And iLoop < 19 '<--| exit loop if either you hit the first link or completed three loops
        End If
    End With
End Sub

Function extractTable_3(Ssilka As Variant) As Variant
    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 book1 As Workbook
    
    ' 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
            data(x, y) = oRow.Cells(y).innerText
        Next y
    Next x
    
    Set oRow = Nothing
    Set oTable = Nothing
    Set oDom = Nothing
    
    ' put data array on worksheet
    Set book1 = Workbooks.Open("E:\Super M\Проект ставки\Поиск решения\Усов 4\прога для книга\21.xlsx")
    Set oRange = book1.ActiveWorksheet.Cells(34, 2).Resize(iRows - 1, iCols - 1)
    oRange.NumberFormat = "@"
    oRange.Value = data
    Set oRange = Nothing
    
    
    '<DEBUG>
'    For x = LBound(data) To UBound(data)
'        Debug.Print x & ":[ ";
'        For y = LBound(data, 2) To UBound(data, 2)
'            Debug.Print y & ":[" & data(x, y) & "] ";
'        Next y
'        Debug.Print "]"
'    Next x
    '</DEBUG>

End Function
...
Рейтинг: 0 / 0
Совмещение двух программ
    #39296927
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Судя по всему, вы не только не знаете, как работают эти программы, но и не хотите разбираться.
Здесь готовы оказать помощь тем, кто готов что-то сам делать, вникать, учиться и т.п., а не гадать, в какой строке у вас возникла ошибка и какие могут быть причины, не видя исходных файлов.

Ваша же задача сводится к "сделайте за меня мою работу".

Если не хотите разбираться самостоятельно, вам лучше обратиться к фрилансерам. Ну или, по крайней мере, обозначить, что вы ищете исполнителя и указать свой email в профиле, если кого-то это заинтересует, он с вами свяжется.
...
Рейтинг: 0 / 0
Совмещение двух программ
    #39296962
maxim863
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro, Как работает 1-ая прога я понимаю на 98 % , вторую на 75% . Требуется всего лишь минимально подсказать как их совместить . Вся работа уже почти сделана .
Ошибка выскакивает в :
Код: vbnet
1.
 Set oRange = book1.ActiveWorksheet.Cells(34, 2).Resize(iRows - 1, iCols - 1)
...
Рейтинг: 0 / 0
Совмещение двух программ
    #39296983
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если понимаете - расскажите, зачем вы закрываете книгу, а в следующей строке ее опять открываете?

Что касается ошибки - может быть дело в том, что вы открываете уже открытую книгу?
...
Рейтинг: 0 / 0
Совмещение двух программ
    #39297003
maxim863
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro, Насчет открытия/закрытия книги -это специально сделано (чтобы формулы в столбце преобразовать в значения ) ,здесь проблем нет (это работает)
А вот насчет открытия уже открытой книги -скорее всего (но в том-то и проблема , я не знаю как сделать по другому ) . В этом и заключается основная загвоздка.
...
Рейтинг: 0 / 0
Совмещение двух программ
    #39297006
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxim863Ошибка выскакивает в :
Код: vbnet
1.
 Set oRange = book1.ActiveWorksheet.Cells(34, 2).Resize(iRows - 1, iCols - 1)

Скажите, откуда такой бред вообще появился? Что за объект такой - ActiveWorksheet? Если о нем знаете Вы, то Excel про него даже не слышал. Есть ActiveSheet. Т.е. если записать так:
Код: vbnet
1.
Set oRange = book1.ActiveSheet.Cells(34, 2).Resize(iRows - 1, iCols - 1)


то как минимум эта строка будет работать при условии, что iRows и iCols больше 1(т.е. как минимум 2)
...
Рейтинг: 0 / 0
Совмещение двух программ
    #39297008
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxim863насчет открытия уже открытой книги -скорее всего
Как проверить открыта ли книга?
...
Рейтинг: 0 / 0
Совмещение двух программ
    #39297031
maxim863
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
The_Prist, Поменял на Activesheet , но программа сработала неправильно (текст вставился в нужную книгу , но не на новую страницу, а на Worksheets("21") . Затем выскочила ошибка 424 Object required на строке
Код: vbnet
1.
Set r = .FindNext(r) 


Я подумал ,что вам лучше сразу увидеть две работающие проги по отдельности , чем разбираться в моем бредовом их соединении .
...
Рейтинг: 0 / 0
Совмещение двух программ
    #39297084
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxim863,

я думаю, что Вам надо начать с изучения азов. Разбираться за Вас в каких-то портянках кода желания мало. Хоть вместе они будут, хоть по отдельности. Вы пробуете вставить данные в активный лист книги book1. Куда показываете - туда и вставляет. Т.е. на тот лист, который был открыт на момент сохранения книги book1. Что это за лист - Вам виднее. При этом совершенно не нашел ни одной строки с созданием нового листа. И как же тогда на него данные должны попасть, если Вы его не создаете? По коду никак не понять на какой лист надо вставлять, если не на активный.
...
Рейтинг: 0 / 0
Совмещение двух программ
    #39297103
maxim863
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
The_Prist, По идее, эта строка активирует новый лист
Код: vbnet
1.
2.
iLoop = iLoop + 1 '<-- update loop counter
                .Parent.Parent.Worksheets(sheetNames(iLoop)).Activate 
...
Рейтинг: 0 / 0
Совмещение двух программ
    #39297185
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxim863,

по идее она активирует какой-то существующий лист, но никак не новый. Новый - это который только что создан. Создания листа нигде нет в коде. И судя по тому, что я вижу - активируется как раз лист Worksheets("21"), т.к. именно в нем происходит поиск, а не в каком-то новом листе. Поэтому чего Вы хотите получить вообще непонятно.
...
Рейтинг: 0 / 0
Совмещение двух программ
    #39297869
maxim863
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Разобрался . Проблема была в том , что я открывал книгу три раза , а надо было один раз открыть , а затем в качестве параметра передать в функцию . Теперь прога фурычит . Спасибо всем , кто пытался помочь !
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Совмещение двух программ
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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