2016-03-31 158 views
0

我對VBA非常陌生,因此不勝感激。我正在嘗試從此網站提取數據https://www.census.gov/construction/bps/txt/tb3u201601.txt。網址中的201601表示2016年1月。我想創建一個循環遍歷所有月份的程序,直到2003年,並將所有數據放入Excel電子表格中。到目前爲止,我已經寫了一些東西來隔離日期(下面),但我無法弄清楚如何讓它循環遍歷我需要的日期。再次感謝。VBA Excel從URL中更改日期提取數據

Sub Macro2() 
' 
' Macro2 Macro 
' 

' 
Dim str1 As String 
Dim str2 As String 
Dim str3 As String 
Dim str As String 

str1 = "URL;https://www.census.gov/construction/bps/txt/tb3u" 
str2 = "201601" 
str3 = ".txt" 
str = str1 & str2 & str3 

With ActiveSheet.QueryTables.Add(Connection:= _ 
    str, Destination _ 
    :=Range("$A$2")) 
    .Name = "tb3u201601_4" 
    .FieldNames = True 
    .RowNumbers = False 
    .FillAdjacentFormulas = False 
    .PreserveFormatting = True 
    .RefreshOnFileOpen = False 
    .BackgroundQuery = True 
    .RefreshStyle = xlInsertDeleteCells 
    .SavePassword = False 
    .SaveData = True 
    .AdjustColumnWidth = True 
    .RefreshPeriod = 0 
    .WebSelectionType = xlAllTables 
    .WebFormatting = xlWebFormattingNone 
    .WebPreFormattedTextToColumns = True 
    .WebConsecutiveDelimitersAsOne = True 
    .WebSingleBlockTextImport = False 
    .WebDisableDateRecognition = False 
    .WebDisableRedirections = False 
    .Refresh BackgroundQuery:=False 
End With 

末次

回答

0

在父

Sub Macro1() 
    Dim startDate As Date 
    Dim thisDate As Date 
    Dim endDate As Date 
    Dim string2 as String 

    startDate = DateSerial(2003, 1, 1) 
    endDate = DateSerial(2016, 4, 1) 
    Dim i As Integer 

    Do 
     thisDate = DateAdd("m", i, startDate) 
     string2 = Format(thisDate,"yyyyMM") 
     Call Macro2 (string2) 
     i = i + 1 

    Loop While (thisDate <= endDate) 

End Sub 

變化Macro2添加一個循環來接受字符串參數

Sub Macro2(str2 as string) 
.... 

,並刪除此行中Macro2

str2 = "201601" 
+0

Th幫助丹尼爾幫助。但是,當我將這些添加到我的代碼中時,什麼都沒有發生。只是澄清一下,macro1被標記爲str2的結果在哪裏? – CPslo

+0

已編輯我的答案,使其更清晰。宏1的結果是傳遞給宏2的字符串2。 – Danielle

-1

你需要幾個嵌套的循環,一個用於月份,一個用於年。您可以將每個零件標註爲Int,然後在每個零件上調用cStr()將它們轉換回字符串並將它們組合在一起。

Dim iYear, iMonth as Int 

For iYear = 2003 to 2015 
    For iMonth = 1 to 12 
     str2 = cStr(iYear) & cStr(iMonth) 
     'The rest of your code here... 
    Next iMonth 
Next iYear 

您可能還需要找到一些方法來動態更改每個表的起始位置。如果表格的行數相同,則可以用Range(Cells(iRow, 1).Address)之類的內容替換Range($A$2)參考,並在每次執行循環時將其添加到iRow。 (iRow = iRow + [the number of rows in the table]

+0

我覺得你的代碼將產生20031,20032,20033,20034 ...等等,這是CPslo不希望的str2。 – Danielle