VBA程序输出不同数量的stringvariables来声明和重用

在这里,我们有一个由蒂姆·威廉姆斯提供给科多的程序,它在Immediate window打印出我们真正想要的东西。 我从原来的副本做了一些微小的修改,我旁边有评论词MODIFICATION

 Sub MAGAZINE() Dim IE As InternetExplorer ' MODIFICATION Dim els, el, colDocLinks As New Collection Dim lnk Dim Ticker As String ' MODIFICATION Set IE = New InternetExplorer 'MODIFICATION IE.Visible = True Ticker = Worksheets("Sheet1").Range("A1").Value 'MODIFICATION loadpage IE, "https://www.sec.gov/cgi-bin/browse-edgar?" & _ "action=getcompany&CIK=" & Ticker & "&type=10-Q" & _ 'MODIFICATION by putting the Ticker String Variable and then Concatenate accordingly "&dateb=&owner=exclude&count=20" Set els = IE.Document.getelementsbytagname("a") For Each el In els If Trim(el.innertext) = "Documents" Then colDocLinks.Add el.href End If Next el For Each lnk In colDocLinks loadpage IE, CStr(lnk) For Each el In IE.Document.getelementsbytagname("a") If el.href Like "*[0-9].xml" Then 'MODIFICATION Debug.Print el.innertext, el.href End If Next el Next lnk End Sub Sub loadpage(IE As Object, url As String) IE.Navigate url Do While IE.Busy Or IE.ReadyState <> READYSTATE_COMPLETE DoEvents Loop End Sub 

您可以注意到,在第四个修改/添加中,一个人可以简单地在单元格A1上键入股票代码并将代码解除

 Ticker = Worksheets("Sheet1").Range("A1").Value 'MODIFICATION 

现在的事情是,如果我们放置不同的股票代码,我们会在立即窗口中获得不同数量的行。

例如,通过在单元格A1中input代码CRR,我们可以得到11个结果

CRR

现在,如果我们input单元格A1的tickter MSFT,我们可以得到14个结果

MSFT

现在问题的关键在于这些string值需要插入到RIFLE macro ,尽pipe我可以从stringvariables的每个循环迭代中获取值,但是在我的脑海里却引发了一个猴子扳手,那就是MAGAZINE macro是合乎逻辑的,没有在直接窗口上打印的确切行数。 你可以看到,实际上在前面的两个图片…


所以当MAGAZINE macro有6行的结果时,怎么可能呢? 这些被分配到6个stringvariables,并没有30个stringvariables总是宣告破坏在内存中,当结果是14行; 这些被分配到14个stringvariables。

这在运行时如何调整,所以步枪总是装载正确数量的回合?

因为我不会停在那里; 那么我有计划将这些stringvariables插入由user2140261提供的RIFLE macro ,如下所示…

 Sub RIFLE() Dim strXMLSite As String Dim objXMLHTTP As MSXML2.XMLHTTP Dim objXMLDoc As MSXML2.DOMDocument Dim objXMLNodexbrl As MSXML2.IXMLDOMNode Dim objXMLNodeDIIRSP As MSXML2.IXMLDOMNode Set objXMLHTTP = New MSXML2.XMLHTTP Set objXMLDoc = New MSXML2.DOMDocument strXMLSite = "http://www.sec.gov/Archives/edgar/data/10795/000119312513456802/bdx-20130930.xml" objXMLHTTP.Open "POST", strXMLSite, False objXMLHTTP.send objXMLDoc.LoadXML (objXMLHTTP.responseText) Set objXMLNodexbrl = objXMLDoc.SelectSingleNode("xbrl") Set objXMLNodeDIIRSP = objXMLNodexbrl.SelectSingleNode("us-gaap:DebtInstrumentInterestRateStatedPercentage") Worksheets("Sheet1").Range("A1").Value = objXMLNodeDIIRSP.Text End Sub 

如果你能把这个从MAGAZINEmacros中出来的string值插入到RIFLEmacros中的stringvariables中,那么这个string值将会助长整个问题。

这里的RIFLEmacros有它的原始formsstrXMLSite String Variabe。

更新我目前正试图加载到一个数组,然后卸载它…

这里有一个build议:

 Sub MAGAZINE() Dim IE As InternetExplorer ' MODIFICATION Dim els, el, colDocLinks As New Collection Dim lnk, res Dim Ticker As String ' MODIFICATION Dim colXMLPaths As New Collection '<<<EDIT Set IE = New InternetExplorer 'MODIFICATION IE.Visible = True Ticker = Worksheets("Sheet1").Range("A1").Value 'MODIFICATION LoadPage IE, "https://www.sec.gov/cgi-bin/browse-edgar?" & _ "action=getcompany&CIK=" & Ticker & "&type=10-Q" & _ "&dateb=&owner=exclude&count=20" Set els = IE.Document.getelementsbytagname("a") For Each el In els If Trim(el.innertext) = "Documents" Then colDocLinks.Add el.href End If Next el For Each lnk In colDocLinks LoadPage IE, CStr(lnk) For Each el In IE.Document.getelementsbytagname("a") If el.href Like "*[0-9].xml" Then Debug.Print el.innertext, el.href colXMLPaths.Add el.href '<<<EDIT End If Next el Next lnk 'EDIT: ADDED For Each lnk In colXMLPaths res = RIFLE(CStr(lnk)) With Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) .NumberFormat = "@" .Value = Ticker .Offset(0, 1).Value = lnk .Offset(0, 2).Value = res End With Next lnk End Sub Function RIFLE(sURL As String) Dim strXMLSite As String Dim objXMLHTTP As New MSXML2.XMLHTTP Dim objXMLDoc As New MSXML2.DOMDocument Dim objXMLNodexbrl As MSXML2.IXMLDOMNode Dim objXMLNodeDIIRSP As MSXML2.IXMLDOMNode RIFLE = "???" objXMLHTTP.Open "GET", sURL, False '<<EDIT: GET not POST objXMLHTTP.send objXMLDoc.LoadXML (objXMLHTTP.responseText) Set objXMLNodexbrl = objXMLDoc.SelectSingleNode("xbrl") Set objXMLNodeDIIRSP = objXMLNodexbrl.SelectSingleNode _ ("us-gaap:DebtInstrumentInterestRateStatedPercentage") If Not objXMLNodeDIIRSP Is Nothing Then RIFLE = objXMLNodeDIIRSP.Text End If End Function Sub LoadPage(IE As Object, url As String) IE.Navigate url Do While IE.Busy Or IE.ReadyState <> READYSTATE_COMPLETE DoEvents Loop End Sub