返回列表 上一主題 發帖

[發問] 可否用迴圈或變數匯入大量資料?

回復 8# GBKEE
再補充一下,當抓取資料的網站查無該資料時就會出錯,因為我的連結是抓損益季表(合併財報),而當個股無合併財報可抓取資料時就會出錯
但查詢損益表(季表)是有資料的,不知VBA程式碼能不能做到當主要網頁資料[損益季表(合併財報)]抓不到時就去抓次要網頁資料[損益表(季表)]


損益季表(合併財報0


損益表(季表)

TOP

本帖最後由 smart3135 於 2014-4-24 13:43 編輯
回復  smart3135
試試看
GBKEE 發表於 2014-4-24 09:07


呼!花了點時間慢慢研究一個個程式碼的意思及語法,再將GBKEE版大提供的程式碼稍做修改,終於完成了!現在只要執行VBA就能將我要的ISQ.TXT檔放在
迴圈變數E所產生的資料夾下,也就是C:\季損益表\1101\、C:\季損益表\1102\,唯一要注意的是C槽下的季損益表資料夾一定要自己先建立,否則執行程式時會出錯
現在就只剩下上一篇提出的問題:當抓取網頁資料時若無資料要如何跳過或去抓取有資料的網頁以避免出錯,再請GBKEE大大指點囉!感恩!
  1. Option Explicit
  2. Sub 抓季損益表資料()
  3.     Dim E As Integer, URL As String, xPath As String, ISQ As String
  4.     URL = "URL;https://djinfo.cathaysec.com.tw/Z/ZC/ZCQ/ZCQ.DJHTM?A="
  5.     For E = 1101 To 2330
  6.         xPath = "C:\" & "季損益表" & "\" & E & "\"
  7.         '存檔路徑是C:\E\XYZ.TXT, 建議改為 C:\季損益表\1101.txt
  8.         With ThisWorkbook
  9.            ' If .Sheets.Count = 1 Then .Sheets.Add  '配合讀取txt檔到工作表時必須有2張工作表
  10.             With .Sheets(1)   '活頁簿的第 1 張工作表
  11.                 If .QueryTables.Count = 0 Then
  12.                     With .QueryTables.Add(Connection:=URL, Destination:=.Range("$A$1"))
  13.                         .Refresh BackgroundQuery:=False
  14.                     End With
  15.                 End If
  16.                     With .QueryTables(1)
  17.                         .Connection = URL & E
  18.                         .PreserveFormatting = True
  19.                         .BackgroundQuery = True
  20.                         .RefreshStyle = xlInsertDeleteCells
  21.                         .SaveData = True
  22.                         .AdjustColumnWidth = True
  23.                         .RefreshPeriod = 0
  24.                         .WebSelectionType = xlSpecifiedTables
  25.                         .WebFormatting = xlWebFormattingNone
  26.                         .WebTables = "3"
  27.                         .WebPreFormattedTextToColumns = True
  28.                         .WebConsecutiveDelimitersAsOne = True
  29.                         .Refresh BackgroundQuery:=False
  30.                     End With
  31.                     If .[A1] <> -E Then  '這網頁如股票代碼錯誤會傳回負號.
  32.                         If Dir(xPath, vbDirectory) = "" Then MkDir xPath '目錄不存在則新徵增此目錄
  33.                         Maketxt xPath & "ISQ.TXT", .QueryTables(1)
  34.                         'Redalltxt xPath & "\" & E & ".TXT"  '讀取txt檔到工作表
  35.                     End If
  36.                
  37.             End With
  38.         End With
  39.     Next
  40. End Sub
  41. Sub Maketxt(xF As String, Q As QueryTable)   '將匯入資料存入指定的txt
  42.     Dim fs As Object, E As Range, C As Variant
  43.     Set fs = CreateObject("Scripting.FileSystemObject")
  44.     Set fs = fs.CreateTextFile(xF, True)  '創見一個檔案,如檔案存在可覆蓋掉
  45.     For Each E In Q.ResultRange.Rows
  46.         C = Application.Transpose(Application.Transpose(E.Value))
  47.         C = Join(C, vbTab)
  48.         fs.WriteLine C
  49.     Next
  50.     fs.Close
  51. End Sub
  52. Sub Redalltxt(xF As String)   '
  53.     Dim fs As Object, E, D As New DataObject
  54.     'DataObject 物件 在進行轉換動作時,做為格式化文字資料的暫存區域。其也可以暫存和儲存在 DataObject 的文字片段相關的格式。
  55.     '宣告 Dim D As New DataObject '須在工具-> 設定引用項目加入 新增引用 Microsoft Forms 2.0 Object Library ,專案 加入一表單即可
  56.     Set fs = CreateObject("Scripting.FileSystemObject")
  57.     Set fs = fs.OpenTextFile(xF, 1)
  58.      E = fs.readall
  59.     fs.Close
  60.     With D
  61.         .SetText E
  62.         .PutInClipboard
  63.         With Sheets(2)
  64.             .UsedRange.Clear
  65.             .Activate
  66.             .Range("A1").Select
  67.             .PasteSpecial Format:="Unicode 文字"
  68.             .Cells.Font.Size = 12
  69.             .Cells.Font.Bold = False
  70.             .Cells.EntireColumn.AutoFit
  71.         End With
  72.     End With
  73. End Sub
  74. Sub Set_FormDLL()   '新增引用 Microsoft Forms 2.0 Object Library
  75.     On Error Resume Next
  76.     FormDLL = "FM20.DLL"
  77.     ThisWorkbook.VBProject.References.AddFromFile "C:\windows\system32\" & FormDLL
  78. '2003版的目錄為 C:\windows\system32\ ,你需修改此目錄
  79. End Sub
複製代碼

TOP

本帖最後由 GBKEE 於 2014-4-24 17:04 編輯

回復 12# smart3135
  1. Option Explicit
  2. Sub 抓季損益表資料()
  3.     Dim E As Integer, URL As String, xPath As String, xFile As String
  4.     Dim Msg As Boolean
  5.     URL = "URL;https://djinfo.cathaysec.com.tw/Z/ZC/ZCQ/ZCQ.DJHTM?A="
  6.     xPath = "C:\季損益表"
  7.     With ThisWorkbook
  8.         With .Sheets(1)      '活頁簿的第 1 張工作表
  9.             If .QueryTables.Count = 0 Then
  10.                 With .QueryTables.Add(Connection:=URL, Destination:=.Range("$A$1"))
  11.                     .Refresh BackgroundQuery:=False
  12.                 End With
  13.             End If
  14.             For E = 1339 To 2330
  15. ER:
  16.                 With .QueryTables(1)
  17.                     If Msg = False Then
  18.                       .Connection = URL & E
  19.                     ElseIf Msg Then
  20.                                   'https://djinfo.cathaysec.com.tw/z/zc/zcq/zcq0_1339_ACC.djhtm   損益表(累計季表)
  21.                        .Connection = "URL;https://djinfo.cathaysec.com.tw/z/zc/zcq/zcq0_" & E & "_ACC.djhtm"
  22.                     End If
  23.                     .PreserveFormatting = True
  24.                     .BackgroundQuery = True
  25.                     .RefreshStyle = xlInsertDeleteCells
  26.                     .SaveData = True
  27.                     .AdjustColumnWidth = True
  28.                     .RefreshPeriod = 0
  29.                     .WebSelectionType = xlSpecifiedTables
  30.                     .WebFormatting = xlWebFormattingNone
  31.                     .WebTables = "3"
  32.                     .WebPreFormattedTextToColumns = True
  33.                     .WebConsecutiveDelimitersAsOne = True
  34.                     .Refresh BackgroundQuery:=False
  35.                 End With
  36.                 If InStr(.[A3], "查無") Then Msg = True: GoTo ER
  37.                 If InStr(.[A3], "個股代碼錯誤") = 0 Then '這網頁如股票代碼錯誤會傳回負號.
  38.                      xFile = xPath & "\" & E & "\ISQ.txt"
  39.                     MkDir_Sub xFile       '10#的程式 'C槽下的季損益表資料夾不需先建立
  40.                     Maketxt xFile, .QueryTables(1)
  41.                 End If
  42.                 Msg = False
  43.             Next
  44.         End With
  45.     End With
  46. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 13# GBKEE
抱歉,GBKEE大大,圖片中的語法一開始就執行錯誤,不知道是否語法有誤,這段語法真的看不懂,再請您教導一下,感謝!

TOP

回復 14# smart3135
註解有在看嗎? 要複製第10#的 MkDir_Sub 程式到模組上.
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 15# GBKEE
Sorry,剛剛註解是有看了,不過不太懂意思,原來是要把先前#10的程式碼放到模組中,之後就解決了
VBA執行大量迴圈後似乎會佔用記憶體的空間,導致迴圈的執行到後面會越來越慢,不知道我的觀念對不對
目前正在搜索有關釋放記憶體的文章,再次大力感謝GBKEE大大不厭其煩的指導^^:handshake

TOP

本帖最後由 smart3135 於 2014-4-25 05:25 編輯

回復 8# GBKEE
GBKEE版主您好,昨天您提到將EXCEL匯入的資料存入指定的txt,我用逐行執行,發現它是用迴圈的方式,將EXCEL匯入的資料一列一列的存入指定的txt中
直到遇到空白資料即停止迴圈不再存入,想請問若要將EXCEL匯入的資料存入到txt中,是只能用這種一列一列存入的方式嗎?
這種方式應該就像是點選EXCEL的第一列,然後按滑鼠右鍵複製(或Ctrl+C),再貼到txt中的第一列,第二列資料就換到EXCEL第二列重覆一樣的動作
直到沒有資料能貼上為止,不知道我這樣解讀對不對,主要是想請問,有沒有方法能讓EXCEL資料,像點選EXCEL左上角的全選(Cells.select),然後直接全部複製,
再全部直接貼到txt中,這樣應該就不用走迴圈,一次貼上即可,因為不清楚VBA有沒有語法能做到這樣,所以要再請您幫忙解惑一下囉!感謝!
  1. Sub Maketxt(xF As String, Q As QueryTable)   '將匯入資料存入指定的txt
  2.     Dim fs As Object, E As Range, C As Variant
  3.     Set fs = CreateObject("Scripting.FileSystemObject")
  4.     Set fs = fs.CreateTextFile(xF, True)  '創見一個檔案,如檔案存在可覆蓋掉
  5.     For Each E In Q.ResultRange.Rows
  6.         C = Application.Transpose(Application.Transpose(E.Value))
  7.         C = Join(C, vbTab)
  8.         fs.WriteLine C
  9.     Next
  10.     fs.Close
  11. End Sub
複製代碼

TOP

本帖最後由 GBKEE 於 2014-4-25 07:28 編輯

回復 17# smart3135
10# 的程式碼看不懂,已加註說明了.
會出現記憶體不足的視窗,在XP,記憶體1GB,2003版,執行5分鐘內可完成,擴充你的記憶體試試看
全部直接貼到txt中,這樣應該就不用走迴圈,慢慢再研究.
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

本帖最後由 smart3135 於 2014-4-25 06:22 編輯

回復 18# GBKEE
不好意思,又發現一個問題要來請教您了,先前有向您請教當損益季表(合併財報)的資料抓不到時,就去抓損益表(季表),其中的關鍵字是在A3儲存格
鍵入查無,則第一個連結抓不到時就會去抓第二個連結的資料,但我在試著抓損益年表時,當個股不存在時,不是出現個股代碼錯誤,而是在A3出現查無損益年表(合併報表)
這時會去抓第二個連結,結果一樣會在A3出現查無損益年表,這時就無法跳出迴圈,變成一直在迴圈裡打轉了,兩個無法抓取資料的連結都在A3出現相同的關鍵字
以致程式碼無法區別,就持續走無盡迴圈,不知道這個問題有沒有辦法解決?資料一次貼上的方式我會再慢慢try,感謝您耐心的回答,謝謝!
  1. Option Explicit
  2. Sub 抓年損益表資料()
  3.     Dim E As Integer, URL As String, xPath As String, xFile As String
  4.     Dim Msg As Boolean
  5.     URL = "URL;https://djinfo.cathaysec.com.tw/z/zc/zcq/zcqa/zcqa.djhtm?A="
  6.     xPath = "G:\財報資料"
  7.     With ThisWorkbook
  8.         With .Sheets(1)      '活頁簿的第 1 張工作表
  9.             If .QueryTables.Count = 0 Then
  10.                 With .QueryTables.Add(Connection:=URL, Destination:=.Range("$A$1"))
  11.                     .Refresh BackgroundQuery:=False
  12.                 End With
  13.             End If
  14.             For E = 1341 To 2000
  15. ER:
  16.                 With .QueryTables(1)
  17.                     If Msg = False Then
  18.                       .Connection = URL & E
  19.                     ElseIf Msg Then
  20.                     'https://djinfo.cathaysec.com.tw/z/zc/zcq/zcqa/zcqa0_1339_ACC.djhtm   損益表(年表)
  21.                        .Connection = "URL;https://djinfo.cathaysec.com.tw/z/zc/zcq/zcqa/zcqa0_" & E & "_ACC.djhtm"
  22.                     End If
  23.                     .PreserveFormatting = True
  24.                     .BackgroundQuery = True
  25.                     .RefreshStyle = xlInsertDeleteCells
  26.                     .SaveData = True
  27.                     .AdjustColumnWidth = True
  28.                     .RefreshPeriod = 0
  29.                     .WebSelectionType = xlSpecifiedTables
  30.                     .WebFormatting = xlWebFormattingNone
  31.                     .WebTables = "3"
  32.                     .WebPreFormattedTextToColumns = True
  33.                     .WebConsecutiveDelimitersAsOne = True
  34.                     .Refresh BackgroundQuery:=False
  35.                 End With
  36.                 If InStr(.[A3], "查無") Then Msg = True: GoTo ER
  37.                 If InStr(.[A3], "個股代碼錯誤") = False Then '這網頁如股票代碼錯誤會傳回負號.
  38.                      xFile = xPath & "\" & E & "\IS.txt"
  39.                     MkDir_Sub xFile       '10#的程式 'C槽下的季損益表資料夾不需先建立
  40.                     Maketxt xFile, .QueryTables(1)
  41.                 End If
  42.                 Msg = False
  43.             Next
  44.         End With
  45.     End With
  46. End Sub
複製代碼

TOP

回復 18# GBKEE
抱歉,剛剛試著試著,好像成功了,造成您的困擾,真不好意思!

TOP

        靜思自在 : 一個人不怕錯,就怕不改過,改過並不難。
返回列表 上一主題