返回列表 上一主題 發帖

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

回復 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

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

回復 21# GBKEE

1420月營收




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

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

回復 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

回復 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

回復 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

本帖最後由 GBKEE 於 2014-4-26 15:42 編輯

回復 26# smart3135
大約要耗時40分鐘以上,是有點久,電腦要減肥了
建議減肥方式如下
1將下面文字複製到記事本  存檔為附檔名 ".BAT",傳送到桌面上 ,不定時的清理垃圾檔案
2不定時的清空資源回收筒
3 不定時清空IE的瀏覽記錄
4 定時的清理磁碟
5擴充記憶體

4203天仁(後抓取)是錯誤的股票號碼,這些股票名稱(代號) 連續一起輸入在Sheets(2)的A欄
  1. Option Explicit
  2. Sub 抓季月營收資料()
  3.     Dim E As Integer, URL As String, xPath As String, xFile As String
  4.     Dim i As Integer, ii As Integer, Rng As Range, S1 As String, S2 As String, t As Date
  5.     Dim AR()
  6.     t = Time
  7.     AR = Array(4203) '輸入 4203天仁(後抓取)是錯誤的股票號碼
  8.     URL = "URL;https://djinfo.cathaysec.com.tw/Z/ZC/ZCH/ZCH.DJHTM?A="
  9.     xPath = "D:\財報資料"
  10.     With ThisWorkbook
  11.         .Sheets(2).UsedRange.Offset(, 1).Clear
  12.         '4203天仁(後抓取)是錯誤的股票號碼 這些 股票名稱(代號) 連續一起輸入在Sheets(2)的A欄
  13.         Set Rng = .Sheets(2).Range("A:A").SpecialCells(xlCellTypeConstants)
  14.         If Rng Is Nothing Then
  15.             AR = Array()
  16.         ElseIf Rng.Count = 1 Then
  17.             AR = Array(Rng.Value)
  18.         Else
  19.             AR = Application.Transpose(Application.Transpose(Rng))
  20.         End If        '***************************************************
  21.         Application.ScreenUpdating = False
  22.         Application.StatusBar = " "
  23.         With .Sheets(1)      '活頁簿的第 1 張工作表
  24.             If .QueryTables.Count = 0 Then
  25.                 With .QueryTables.Add(Connection:=URL, Destination:=.Range("$A$1"))
  26.                     .Refresh BackgroundQuery:=False
  27.                 End With
  28.             End If
  29.                 .Rows(1).Delete
  30.                 .Columns(1).Delete
  31.             For E = 1101 To 5000
  32.                 With .QueryTables(1)
  33.                     .Connection = URL & E
  34.                     .PreserveFormatting = True
  35.                     .BackgroundQuery = True
  36.                     .RefreshStyle = xlInsertDeleteCells
  37.                     .SaveData = True
  38.                     .AdjustColumnWidth = True
  39.                     .RefreshPeriod = 0
  40.                     .WebSelectionType = xlSpecifiedTables
  41.                     .WebFormatting = xlWebFormattingNone
  42.                     .WebTables = "3"
  43.                     .WebPreFormattedTextToColumns = True
  44.                     .WebConsecutiveDelimitersAsOne = True
  45.                     .Refresh BackgroundQuery:=False
  46.                     If .ResultRange(1) < 0 Or InStr(.ResultRange(2, 1), "查無") Then GoTo xLnext
  47.                     '匯入資料的 A1 < 0  OR  匯入資料的 A2 "查無"
  48.                     S1 = .ResultRange(1)
  49.                     S2 = Mid(S1, 1, InStr(S1, "(") - 1) '股票名稱
  50.                 End With
  51.                 With ThisWorkbook.Sheets(2).Range("B:B")
  52.                     Set Rng = .Find(S2, lookat:=xlPart) '搜尋:股票名稱
  53.                     If Rng Is Nothing Then
  54.                         i = i + 1
  55.                         .Range("A" & i) = S1  '股票名稱代碼
  56.                     Else
  57.                         Rng.Cells(1, 2) = S1   '重複的股票
  58.                         If UBound(Filter(AR, E)) > -1 And UBound(AR) > -1 Then
  59.                         'Filter(AR, E) > -1   '比對到如4203天仁(後抓取)是錯誤
  60.                             Rng.Cells(1, 2) = Rng.Cells(1, 2) & "***" '後抓取是錯誤
  61.                             GoTo xLnext:
  62.                         End If
  63.                         S2 = Mid(Trim(Rng), InStr(Trim(Rng), "(") + 1)
  64.                         S2 = Mid(S2, 1, Len(S2) - 1)    '舊的股票[代碼]
  65.                         xFile = xPath & "\" & S2 & "\*.*" '殺掉所有檔案
  66.                         If Dir(xFile) <> "" Then
  67.                             ii = ii - 1
  68.                             Kill xFile
  69.                             xFile = xPath & "\" & S2
  70.                             If Dir(xFile, vbDirectory) <> "" Then RmDir xFile '資料夾也刪除了
  71.                         End If
  72.                     End If
  73.                 End With
  74.                 ii = ii + 1
  75.                 xFile = xPath & "\" & E & "\REVENUE.txt"
  76.                 MkDir_Sub xFile
  77.                 Maketxt xFile, .QueryTables(1)
  78. xLnext:
  79.                 S1 = " " & Sheets(1).QueryTables(1).ResultRange(1)
  80.                 If Val(S1) < 0 Then S1 = " 查無"
  81.                 Application.StatusBar = Application.Text(Time - t, ["MM分SS秒"]) & "  " & E & S1
  82.             Next
  83.         End With
  84.     End With
  85.     Application.ScreenUpdating = True
  86.     Application.StatusBar = Application.Text(Time - t, ["MM分SS秒"]) & " Ok "
  87.     MsgBox "匯入 文字檔" & ii & " 費時 " & Application.Text(Time - t, ["MM分SS秒"])
  88. End Sub
  89. Private Sub Maketxt(xF As String, Q As QueryTable)   '將匯入資料存入指定的txt
  90.     Dim fs As Object, E As Range, C As Variant
  91.     Set fs = CreateObject("Scripting.FileSystemObject")
  92.     Set fs = fs.CreateTextFile(xF, True)  '創見一個檔案,如檔案存在可覆蓋掉
  93.     For Each E In Q.ResultRange.Rows
  94.         C = Application.Transpose(Application.Transpose(E.Value))
  95.         C = Join(C, vbTab)
  96.         fs.WriteLine C
  97.     Next
  98.     fs.Close
  99. End Sub
複製代碼

EX.JPG (136.56 KB)

EX.JPG

感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 27# GBKEE
GBKEE版主您好,今早下班後就開始在Try您在27#回覆的程式碼,結果的確會將一些重覆的個股txt刪除,但不知有沒有辦法將一起建立的資料夾也刪除呢?
舉例來說,1202和2913兩個都是農林,所以程式執行完會將1202的txt刪除,但1202的資料夾仍是存在的,不知沒有沒辦法連資料夾一起刪除呢?
另外還有一個問題,就是這個程式碼保留的資料都是sheet(2)的第二欄個股代號資料,若我沒解讀錯誤的話,程式應該是將個股代碼相同,先抓取的txt刪除,保留後抓取的txt
但就會遇到1233天仁(先抓取)是正確的,4203天仁(後抓取)是錯誤的問題,結果就是正確的1233天仁txt被刪除,這部分我想應該不太好解決
所以,如果可以的話,我還是傾向在您24#回覆的程式碼,用一個一個挑出的方式,這些不需要的代號我都有了,只要輸入AR=Array()中就可以了,只是我要輸入的代號
大概有200個左右,如果全部輸入,如AR=Array(1202,1433,1502,1610.....................)這樣要把200個代碼全部輸入會跳到第二行,然後就會出錯,不知道有沒有辦法
解決這個問題呢?先感謝您的指導!

TOP

回復 27# GBKEE
版主,不好意思,再請教一個問題,現在我要設定迴圈為for E = 1101  9962,但我已經知道某些數字區間是不需要去擷取的,如果想跳過該使用怎樣的語法呢?先謝謝您!
大概的構想如下:
  1. Dim E As Integer
  2.                          For E = 1101 To 2000
  3.                          IF E = 3800到4100 then goto xlNext '想設定某個區間,請教語法該怎麼設
  4.                          IF E = 6850到8000 then goto xlNext '想設定某個區間,請教語法該怎麼設
  5.                          IF E = 8550到9000 then goto xlNext '想設定某個區間,請教語法該怎麼設
  6.                          IF E = 9000到9800 then goto xlNext '想設定某個區間,請教語法該怎麼設,共四個區間

  7. xlNext:         
  8.                          next
  9. End sub
複製代碼

TOP

本帖最後由 GBKEE 於 2014-4-26 15:52 編輯

回復 29# smart3135
1233天仁(先抓取)是正確的,4203天仁(後抓取)是錯誤的問題
這一些錯誤股票名稱(代號) 天仁(4203) 連續一起輸入在Sheets(2)的A欄,後程式可解決.

28# 的所有問題.27#程式碼已更新了,可再看一次,減肥有試一下嗎?

試試看
  1. Sub Ex()
  2.     Dim E As Integer
  3.     For E = 500 To 5000
  4.         Select Case E
  5.             Case 500 To 1000
  6.                 GoTo xNext
  7.             Case 1500 To 2000
  8.                 GoTo xNext
  9.             Case 2500 To 3000
  10.                 GoTo xNext
  11.         End Select
  12.         MsgBox E
  13. xNext:
  14.     Next
  15. End Sub
  16. Sub Ex1()
  17.     Dim E As Integer
  18.     For E = 500 To 5000
  19.         If E >= 500 And E <= 1000 Or E >= 1500 And E <= 2000 Or E >= 2500 And E <= 3000 Then
  20.                 GoTo xNext
  21.         End If
  22.         MsgBox E
  23. xNext:
  24.     Next
  25. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

        靜思自在 : 看別人不順眼,是自己修養不夠。
返回列表 上一主題