返回列表 上一主題 發帖

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

回復 25# GBKEE
感謝版主的回覆,看來我只能一個一個把有問題的找出來了,不過照您25#回覆的程式碼,可以簡化一些,感謝幫忙
另外我發現這個擷取資料的VBA最花時間的地方就是在將EXCEL資料一列一列匯入到txt,之前有向您提及我要自己try看看能不能用一次貼上的方式
但try了很多次仍是無法達成,主要在於對程式碼較不了解,比較不清楚怎麼做變化,因為匯入的資料要從1101~9962,資料蠻龐大的,若跑完整個VBA
大約要耗時40分鐘以上,所以才希望能夠讓程式的動作再簡化一些,這應該是最後一次需要做修正了,如果可以的話再請版主多指點一下囉!萬分感謝!
附上您先前提供的程式碼
  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
複製代碼
另外25#中的AR及X未定義,我直接將兩個都定義成Variant,就可以順利執行程式了

TOP

回復 24# smart3135
1420 key錯成 2149 可簡化不需 If E = 1420 Then GoTo xlNext
  1. Rows(1).Delete
  2.                 Columns(1).Delete
  3.             AR = Array(1420, 1580, 2000)  '你是要一個一個找出的
  4.             For E = 1101 To 3000
  5.                 X = Application.Match(E, AR, 0)
  6.                 If IsNumeric(X) Then GoTo xlNext  '直接到 xlNext行
  7.                                                  ' 'If E = 1420 Then GoTo xlNext   '不需要
  8. ER:
  9.                 With .QueryTables(1)
  10.                
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 23# GBKEE
GBKEE版主您好,將您的程式碼套入之後是可以將1420跳過不抓資料了,不過因為1420也是在迴圈變數E的其中一碼,是不是無法用迴圈方式去避免抓取資料
只能一個一個像這樣[If E = 1420 Then GoTo xlNext]設定讓它跳過呢?因為像這種股票還真不少,要一個一個找出來可能要花些功夫
另外像這段[If InStr(.[A3], "查無") And Msg = True Or E = 2149 Then GoTo xlNext]當中的2149是代表什麼呢?我把Or E = 2149拿掉似乎不影響擷取資料
這個網站的資料出現"查無"是在A2儲存格,所以我把A3改成A2,附上程式碼,謝謝!
  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/ZCH/ZCH.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.                 Rows(1).Delete
  15.                 Columns(1).Delete
  16.             For E = 1101 To 3000
  17. ER:
  18.                 With .QueryTables(1)
  19.                     .Connection = URL & E
  20.                     .PreserveFormatting = True
  21.                     .BackgroundQuery = True
  22.                     .RefreshStyle = xlInsertDeleteCells
  23.                     .SaveData = True
  24.                     .AdjustColumnWidth = True
  25.                     .RefreshPeriod = 0
  26.                     .WebSelectionType = xlSpecifiedTables
  27.                     .WebFormatting = xlWebFormattingNone
  28.                     .WebTables = "3"
  29.                     .WebPreFormattedTextToColumns = True
  30.                     .WebConsecutiveDelimitersAsOne = True
  31.                     .Refresh BackgroundQuery:=False
  32.                 End With
  33.                 If E = 1420 Then GoTo xlNext   '加上試試看
  34.                 If InStr(.[A2], "查無") And Msg = True Then GoTo xlNext
  35.                 If InStr(.[A2], "查無") Then Msg = True: GoTo ER
  36.                 If InStr(.[A3], "個股代碼錯誤") = False Then '這網頁如股票代碼錯誤會傳回負號.
  37.                      xFile = xPath & "\" & E & "\REVENUE.txt"
  38.                     MkDir_Sub xFile       '10#的程式 'C槽下的季損益表資料夾不需先建立
  39.                     Maketxt xFile, .QueryTables(1)
  40.                 End If
  41. xlNext:
  42.              Msg = False
  43.             Next
  44.         End With
  45.     End With
  46. End Sub
複製代碼

TOP

本帖最後由 GBKEE 於 2014-4-25 12:47 編輯

回復 22# smart3135
  1. End With               
  2.                 If E = 1420 Then GoTo xlNext   '加上試試看
  3.             'If InStr(.[A3], "查無") And Msg = True Or E = 1420 Then GoTo xlNext  '或者可這樣寫
  4.             If InStr(.[A3], "查無") Then Msg = True: GoTo ER
  5.                 If InStr(.[A3], "個股代碼錯誤") = False Then '這網頁如股票代碼錯誤會傳回負號.
  6.                     xFile = XPath & "\" & E & "\IS.txt"
  7.                     MkDir_Sub xFile       '10#的程式 'C槽下的季損益表資料夾不需先建立
  8.                     Maketxt xFile, .QueryTables(1)
  9.                 End If
  10. xlNext:
  11.                 Msg = False
  12.             Next
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

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

回復 21# GBKEE

1420月營收




GBKEE版主您好,請見以上連結,目前已無1420這支個股,因為1420潤泰紡織已併入2915潤泰全,但該網站仍將1420直接顯示2915潤泰全的合併月膋收
在VBA在擷取合併月營收時仍會擷取到資料,我試了很久,try了很多條件仍無法避免,不知能否利用VBA寫出類似像您在21#回覆的程式碼避免擷取到這種已無個股代號的資料呢?謝謝!

TOP

回復 19# smart3135
你用的是 https://djinfo.cathaysec.com.tw/z/zc/zcq/zcqa/zcqa.djhtm
可修改如下
  1. End With
  2.                
  3.                 If InStr(.[A3], "查無") And Msg = True Then GoTo xlNext
  4.                 If InStr(.[A3], "查無") Then Msg = True: GoTo ER
  5.                 If InStr(.[A3], "個股代碼錯誤") = False Then '這網頁如股票代碼錯誤會傳回負號.
  6.                     xFile = xPath & "\" & E & "\IS.txt"
  7.                     MkDir_Sub xFile       '10#的程式 'C槽下的季損益表資料夾不需先建立
  8.                     Maketxt xFile, .QueryTables(1)
  9.                 End If
  10. xlNext:
  11.                 Msg = False
  12.             Next
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

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

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

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

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

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

        靜思自在 : 對父母要知恩,感恩、報恩。
返回列表 上一主題