Как я могу искать и заменять значения в массиве VBA? - PullRequest
0 голосов
/ 05 мая 2020

Я только что задал здесь вопрос вчера (еще раз спасибо!), Но, надеюсь, ничего страшного, если я задам другой. В конце моего текущего макроса VBA у меня есть массив с URL-адресами / ссылками. Я пытаюсь найти и заменить часть, общую для всех URL-адресов, и получаю сообщение об ошибке в моем текущем коде для этого. Вот мой текущий макрос без добавленной части, он неплохо выполняет свою работу и создает массив и очищает URL-адреса в нем.

 Sub GetData()

    Dim IE As InternetExplorer
    Dim itemEle As Object
    Dim upvote As Integer, awards As Integer, animated As Integer
    Dim postdate As String, upvotepercent As String, oc As String, filetype As String, linkurl As String, myhtmldata As String, visiComments As String, totalComments As String, removedComments As String
    Dim y As Integer

    Set IE = New InternetExplorer
    IE.Visible = False

    IE.navigate (ActiveCell.Value)
    Do While IE.Busy = True Or IE.readyState <> 4: DoEvents: Loop

    Dim nodeList As Object, i As Long, urls(), results(), results2()

    Set nodeList = IE.document.querySelectorAll(".comments")
    ReDim urls(0 To nodeList.Length - 1)
    ReDim results(1 To nodeList.Length, 1 To 5)
    'Store all urls in an array to later loop
    For i = 0 To nodeList.Length - 1
        urls(i) = nodeList.Item(i).href
    Next

    For i = LBound(urls) To UBound(urls)
        IE.Navigate2 urls(i)    'opens in a new tab
        While IE.Busy Or IE.readyState <> 4: DoEvents: Wend
        results(i + 1, 1) = IE.document.querySelector("a.title").innerText 'title
        results(i + 1, 2) = IE.document.querySelector(".number").innerText 'upvotes
        upvotepercent = IE.document.querySelector(".word").NextSibling.NodeValue  '%
        results(i + 1, 3) = CDbl(Mid(upvotepercent, 3, 2)) / 100
        results(i + 1, 4) = IE.document.querySelector("div.date > time").innerText
    Next

Вот где моя проблема. Все URL-адреса / значения в этом массиве содержат "old.reddit.com", и я пытаюсь заменить его на "deleteddit.com". Я добавил к нему этот код, и он не выполняет свою работу, хотя, насколько я понимаю, я правильно использую функцию Replace - я получаю сообщение об ошибке «индекс вне допустимого диапазона» в строке url(rw, col) = Replace.

Часть, которая выдает ошибку, является первой. (вторая часть должна очищать два значения из каждого из новых URL-адресов, используя тот же метод, что и для исходных URL-адресов, но сейчас проблема заключается в первом - или я так думаю, иногда отладчик не очень понятен).

tofind = "old.reddit.com"
toreplace = "removeddit.com"
For rw = LBound(urls) To UBound(urls)
    For col = LBound(urls, 1) To UBound(urls, 1)
        urls(rw, col) = Replace(urls(rw, col), tofind, toreplace)
    Next
Next


For i = LBound(urls) To UBound(urls)
    IE.Navigate2 urls(i)    'opens in a new tab
    While IE.Busy Or IE.readyState <> 4: DoEvents: Wend
    Application.Wait (Now + TimeValue("0:00:03"))
    visiComments = IE.document.querySelector(".removed-text").innerText 'title
    results(i + 1, 5) = visiComments
Next
ActiveSheet.Cells(1, 1).Resize(UBound(results, 1), UBound(results, 2)) = results
IE.Quit
End Sub

Я чувствую, что пробую слишком продвинутые вещи, учитывая, что я только что начал работать с VBA, поэтому любые указатели будут очень признательны! Спасибо! :)

1 Ответ

0 голосов
/ 05 мая 2020

Вы создали одномерный массив с отсчетом от нуля. Вот пример изменения всех элементов этого массива:

Sub dural()
    Dim url(0 To 2) As String

    Dim U As Long, L As Long, i As Long, a
    url(0) = "xLarry"
    url(1) = "nothing"
    url(2) = "111Larry"

    L = LBound(url)
    U = UBound(url)
    For i = L To U
        url(i) = Replace(url(i), "Larry", "Moe")
    Next i

    msg = ""
    For Each a In url
        msg = msg & vbCrLf & a
    Next a
    MsgBox msg
End Sub

enter image description here

...