Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Замена текста (заменить href на гиперссылку) / 12 сообщений из 12, страница 1 из 1
11.10.2017, 10:15
    #39534459
maxim863
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена текста (заменить href на гиперссылку)
Есть программа , которая работает отлично .Результат ее работы вывод в Excel таблицы элементов (href) (Элемент выглядит : about:new_ftour.php?champ=2604&f_team=412&tour=110). Хочу заменить href на гиперссылку (т.е. заменить текст “about:” на http://allscores.ru/soccer/). После строки (oRange.Value=data) я добавил строку (oRange.Replace What:="about:", Replacement:=" http://allscores.ru/soccer/") . Но по загадочным причинам программа выдает ошибку (Run-time error ‘91’) . В строке (Loop While Not r Is Nothing And r.Address <> firstAddress And iLoop < 19).
Код: 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.
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\Условия для андердогов\пробная.xlsm")

    
    iLoop = 0
    
    With book1.Worksheets("Лист1").Range("S34:S99") '<--| open wanted workbook and refer to cells "U33:U99" in its worksheet "7"
          
        Set r = .Find(What:="1", LookIn:=xlValues) '<--| 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
                Ssilka = r.Offset(, -14).Hyperlinks.Item(1).Address
                .Parent.Parent.Worksheets(sheetNames(1)).Activate
                .Parent.Parent.Save
                extractTable Ssilka, book1, iLoop
                
                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
    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
    
  
    
    ' 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")
                
              '.Replace(data(x, y), "about:", "http://allscores.ru/soccer/")
              
            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(34, iLoop * 25).Resize(iRows - 1, iCols - 1)
    oRange.NumberFormat = "@"
    oRange.Value = data
    
    oRange.Replace What:="about:", Replacement:="http://allscores.ru/soccer/"
  

    Set oRange = Nothing
    
    'Selection.Replace What:=".", Replacement:=",", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False, MatchByte:=False
  
    
    '<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
11.10.2017, 11:40
    #39534520
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена текста (заменить href на гиперссылку)
maxim863Not r Is Nothing And r.Address <> firstAddressне вглядываясь в код - тут косяк. Даже если r=Nothing, второе условие все равно будет пытаться проверяться и выдаст ошибку на r.Address
...
Рейтинг: 0 / 0
11.10.2017, 13:25
    #39534643
maxim863
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена текста (заменить href на гиперссылку)
Shocker.Pro, почему тогда до того как я вставил строку (oRange.Replace What:="about:", Replacement:=http://allscores.ru/soccer/) все работало ?
...
Рейтинг: 0 / 0
11.10.2017, 15:02
    #39534756
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена текста (заменить href на гиперссылку)
Мы говорим о конкретной строке, в которой возникает конкретное исключение из-за конкретной ошибки. Вы исправили эту ошибку? После исправления что не работает?
...
Рейтинг: 0 / 0
12.10.2017, 13:23
    #39535342
maxim863
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена текста (заменить href на гиперссылку)
Shocker.Pro, учитывая , что программа ищет единицы вот в таком столбце
0
1
0
0
1
0
1
Я не понимаю в чем ошибка (причем до изменения другой строки (см. вопрос) все работало идеально
...
Рейтинг: 0 / 0
12.10.2017, 13:44
    #39535359
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена текста (заменить href на гиперссылку)
Еще разmaxim863Но по загадочным причинам программа выдает ошибку (Run-time error ‘91’) . В строке (Loop While Not r Is Nothing And r.Address <> firstAddress And iLoop < 19).Причина не загадочная, а вполне конкретная и устранимая. После устранения какая ошибка и в какой строке?
...
Рейтинг: 0 / 0
13.10.2017, 09:10
    #39535799
maxim863
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена текста (заменить href на гиперссылку)
Shocker.Pro, Хорошо , ошибку устранил (т.е. ошибки больше не выскакивает ) , изменив строку
Код: vbnet
1.
Loop While Not r Is Nothing And r.Address <> firstAddress And iLoop < 19

на
Код: vbnet
1.
2.
If r Is Nothing Then Exit Do  
 Loop While r.Address <> firstAddress And iLoop < 19


Но программа все равно работает неправильно: т.е. после того , как она нашла первую единицу и выполнила все действия с ней ,она просто выходит из программы ,вместо того чтобы найти другую единицу и т.д.
...
Рейтинг: 0 / 0
13.10.2017, 12:19
    #39535928
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена текста (заменить href на гиперссылку)
Посмотрите с помощью пошаговой отладки, почему выходит из цикла.
...
Рейтинг: 0 / 0
13.10.2017, 12:26
    #39535935
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена текста (заменить href на гиперссылку)
maxim863 После строки (oRange.Value=data) я добавил строку (oRange.Replace What:="about:", Replacement:=" http://allscores.ru/soccer/") .вот какая может быть проблема, я не помню точно, но вроде как объект, который отвечает за Find/Replace - он один на весь эксель, поэтому выполнение Replace с другими параметрами сбрасывает настройки Find в вышестоящей процедуре. Поэтому сначала всплыла ошибка, которая там была и ранее, а когда ее устранили, стало очевидно, что Find ничего не находит
...
Рейтинг: 0 / 0
13.10.2017, 13:38
    #39535988
maxim863
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена текста (заменить href на гиперссылку)
Shocker.Pro, А вот это похоже на правду . Только теперь как выкрутиться из этой ситуации ?)
...
Рейтинг: 0 / 0
13.10.2017, 14:33
    #39536031
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена текста (заменить href на гиперссылку)
Ну в данном-то случае можно вообще обойтись без Find, а просто перебрать набор ячеек в цикле
...
Рейтинг: 0 / 0
16.10.2017, 09:35
    #39536707
maxim863
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена текста (заменить href на гиперссылку)
Shocker.Pro, Точняк. Теперь все работает . Спасибо за ценные подсказки !
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Замена текста (заменить href на гиперссылку) / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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