- 帖子
- 96
- 主題
- 18
- 精華
- 0
- 積分
- 125
- 點名
- 0
- 作業系統
- Windows 7
- 軟體版本
- Office 2007
- 閱讀權限
- 20
- 性別
- 男
- 註冊時間
- 2014-3-23
- 最後登錄
- 2022-8-2
|
本帖最後由 smart3135 於 2014-5-23 11:13 編輯
回復 67# GBKEE
版主您好,經過今天早上不斷使用2003版測試,終於做出我想要的輸出文字檔結果,不過還是有些問題會發生,先附上程式碼與附檔
集保戶-新.zip (128.04 KB)
這裡是完整的程式碼- Option Explicit
- Dim IE As Object, A As Integer
- Sub IE_Application()
- Dim I As Integer
- Set IE = CreateObject("InternetExplorer.Application")
- With IE
- .Navigate "http://www.tdcc.com.tw/smWeb/QryStock.jsp"
- ' .Visible = True '不顯示ie
- Do While .Busy Or .readyState <> 4: DoEvents: Loop
- '讀取集保戶股權分散表查詢的資料日期總個數
- A = .document.getelementsByTagName("select")("SCA_DATE").Length - 1
- End With
- End Sub
- Sub 集保()
- Dim Rng As Range, E As Range, x As Variant, T As Date, xPath As String, xFile As String
- Dim Ea As Variant, ii As Integer, F As String, H As String, J As Integer
- T = Time
- Application.DisplayStatusBar = True
- '請將上櫃的股票代號,在 Sheets(3).Range("A1")往下Key上,迴圈依這裡的股票代號匯入
- Set Rng = ThisWorkbook.Sheets(3).Range("A:A")
- If Application.Count(Rng) = 0 Then MsgBox "沒有股票代號": Exit Sub
- Set Rng = Rng.SpecialCells(xlCellTypeConstants)
- xPath = "E:\財報資料"
- IE_Application '
- Application.StatusBar = " "
- For Each E In Rng
- With Sheets(1)
- .Activate
- .Cells.Clear '下載資料置於此工作表,變換股票時:清空
- End With
- With IE
- .document.getElementById("StockNo").Value = E
- .document.getelementsByTagName("INPUT")("sub").Click '按下查詢
- '這裡的查詢是<INPUT TYPE="submit" VALUE="查詢" name="sub">
- Do While .Busy Or .readyState <> 4: Loop
- Ep .document.getelementsByTagName("TABLE")(5).outerHTML
- End With
-
- For x = 0 To A
- With IE
- .document.getelementsByTagName("select")("SCA_DATE")(x).Selected = True
- '這裡的資料日期 需用 Select 它是有[年度月份日期]的
- .document.getElementById("StockNo").Value = E
- .document.getelementsByTagName("INPUT")("sub").Click '按下查詢
- '這裡的查詢是<INPUT TYPE="submit" VALUE="查詢" name="sub">
- Do While .Busy Or .readyState <> 4: Loop
- Ep .document.getelementsByTagName("TABLE")(6).outerHTML
- End With
- With IE
- .document.getelementsByTagName("select")("SCA_DATE")(x).Selected = True
- '這裡的資料日期 需用 Select 它是有[年度月份日期]的
- .document.getElementById("StockNo").Value = E
- .document.getelementsByTagName("INPUT")("sub").Click '按下查詢
- '這裡的查詢是<INPUT TYPE="submit" VALUE="查詢" name="sub">
- Do While .Busy Or .readyState <> 4: Loop
- Ep .document.getelementsByTagName("TABLE")(7).outerHTML
- End With
- Next x
- With Sheets(1)
- F = .Range("a3")
- J = Len(F)
- If J >= 19 Then
- H = Mid(F, 1, 3)
- Else
- H = Mid(F, 1, 2)
- End If
- .Range("a1") = E & "-" & H & " " & "集保戶股權分散表"
- .Rows("2:4").Delete
- End With
- xFile = xPath & "\" & E & "\SHD.txt"
- MkDir_Sub xFile
- Maketxt xFile, Sheets(1).UsedRange, E.Value
- '***想請問您Code As String的Code是怎麼帶出個股編號的 ****
- 'xFile(第一個引數), Sheets(1).Range("A1").CurrentRegion(第二個引數),E.Value(第三個引數)
- ii = ii + 1
- Application.StatusBar = Application.Text(Time - T, ["MM分SS秒"]) & " 共匯入上市月成交 " & ii & " 文字檔"
- Next E
- IE.Quit
- Application.StatusBar = Application.Text(Time - T, ["MM分SS秒"]) & " 共匯入上市月成交 " & ii & " 文字檔, 讀取完畢 !! "
- MsgBox "匯入 文字檔" & ii & " 費時 " & Application.Text(Time - T, ["MM分SS秒"])
- ' ThisWorkbook.Save
- End Sub
- Sub Ep(S As String)
- Dim D As New DataObject, E As Shape, FormDLL As String, Rng As Range
- 'DataObject 物件 在進行轉換動作時,做為格式化文字資料的暫存區域。其也可以暫存和儲存在 DataObject 的文字片段相關的格式。
- '宣告 Dim D As New DataObject '須在工具-> 設定引用項目加入 新增引用 Microsoft Forms 2.0 Object Library ,專案 加入一表單即可
- On Error GoTo ER
- With D
- .SetText S
- .PutInClipboard
- With Sheets(1)
- .Range("a" & .Rows.Count).End(xlUp).Select
- Set Rng = Selection
- If Rng = 15 Then
- Rng.Offset(3).Select
- Else
- Rng.Offset(2).Select
- End If
- .PasteSpecial Format:="Unicode 文字"
- ' If Selection = "" Then Selection.Offset(1).Select
- ' Set Rng = Selection
- ' Rng.Sort Key1:=Rng.Range("B2"), Order1:=xlDescending, Header:=xlYes ', _
- OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
- :=xlStroke, DataOption1:=xlSortNorma
- End With
- End With
- Exit Sub
- ER:
- FormDLL = "FM20.DLL"
- ThisWorkbook.VBProject.References.AddFromFile "C:\windows\system32\" & FormDLL
- Resume
- End Sub
- Sub Maketxt(xF As String, Q As Range, Code As String) '將匯入資料存入指定的txt
- '***想請問您Code As String的Code是怎麼帶出個股編號的 ****
- ' xF(接收的引數名稱) As String(字串型態), Q As Range(Range物件型態), Code As String(字串型態)
- Dim fs As Object, E As Range, C As Variant
- Set fs = CreateObject("Scripting.FileSystemObject")
- Set fs = fs.CreateTextFile(xF, True) '創見一個檔案,如檔案存在可覆蓋掉
- For Each E In Q.Rows
- C = Application.Transpose(Application.Transpose(E.Value))
- C = Join(C, vbTab)
- fs.WriteLine C
- Next
- fs.Close
- End Sub
- Sub MkDir_Sub(S As String)
- Dim AR, I As Integer, xPath As String
- If Dir(S) = "" Then
- AR = Split(S, "\")
- xPath = AR(0)
- For I = 1 To UBound(AR) - 1
- xPath = xPath & "\" & AR(I)
- If Dir(xPath, vbDirectory) = "" Then MkDir xPath
- Next
- End If
- End Sub
複製代碼 因為我要的文字檔除了個股代號和名稱之外,還有日期也要一併寫入,所以我就自己加了以下這些東西- With IE
- .document.getElementById("StockNo").Value = E
- .document.getelementsByTagName("INPUT")("sub").Click '按下查詢
- '這裡的查詢是<INPUT TYPE="submit" VALUE="查詢" name="sub">
- Do While .Busy Or .readyState <> 4: Loop
- Ep .document.getelementsByTagName("TABLE")(5).outerHTML
- End With
-
- For x = 0 To A
- With IE
- .document.getelementsByTagName("select")("SCA_DATE")(x).Selected = True
- '這裡的資料日期 需用 Select 它是有[年度月份日期]的
- .document.getElementById("StockNo").Value = E
- .document.getelementsByTagName("INPUT")("sub").Click '按下查詢
- '這裡的查詢是<INPUT TYPE="submit" VALUE="查詢" name="sub">
- Do While .Busy Or .readyState <> 4: Loop
- Ep .document.getelementsByTagName("TABLE")(6).outerHTML
- End With
- With IE
- .document.getelementsByTagName("select")("SCA_DATE")(x).Selected = True
- '這裡的資料日期 需用 Select 它是有[年度月份日期]的
- .document.getElementById("StockNo").Value = E
- .document.getelementsByTagName("INPUT")("sub").Click '按下查詢
- '這裡的查詢是<INPUT TYPE="submit" VALUE="查詢" name="sub">
- Do While .Busy Or .readyState <> 4: Loop
- Ep .document.getelementsByTagName("TABLE")(7).outerHTML
- End With
複製代碼 1.首先第一段是為了要擷取("TABLE")(5)才能匯入個股名稱,所以我加了這些語法,由於個股名稱只需要擷取一次
所以將這段語法寫在x迴圈之外,但不知道這樣的語法正不正確
2.因為要擷取的日期是在("TABLE")(6),所以將這段也寫入,就只是複製("TABLE")(7)的改成6而已,也不確定這樣寫到底正不正確
3.以上程式碼在2003使用F8逐行執行時是可以正常的,但使用F5連續執行時有時會出錯,不然就是("TABLE")(5)和("TABLE")(6)會有資料重覆或者漏抓
以("TABLE")(6)抓到的日期來說,會抓到兩個一樣的日期(日期錯誤),但資料內容的("TABLE")(7)卻是不同的(內容正確),也就是日期和資料內容對不上
不知道是不和我的語法有問題
另外先前向您提過,用2007執行上述程式碼時會出錯,出錯代碼為"424",出錯訊息為"此處需要物件",我有點說明進去看,但真的看不太懂
我將說明內容存成PDF一起放在附件中,可以的話再麻煩您看看是不是可以找出為什麼這個程式碼沒法在2007執行的原因,再次感謝您! |
|