返回列表 上一主題 發帖

用excel上網查音標 又掛了

回復 24# GBKEE
回復 21# c_c_lai

謝謝兩位大大指導
我會努力消化
~感恩~^__^~

TOP

回復 23# c_c_lai
找不出你的錯誤
  1. Option Explicit
  2. Sub Ex() 'Split在字串中以指定的字元作分割傳回一維陣列
  3.     Dim A As String, W, xi As Integer, i As Integer
  4.     A = "1ABCD2ABCD3ABCD4ABCD"
  5.    ' (For 5 to 6)
  6.     For i = 0 To 4       '   <---   正確應為 For i = 0 To 3
  7.         W = Split("1ABCD2ABCD3ABCD4ABCD", Mid(A, 5, i)) ' '-> 'D'
  8.     MsgBox "分割字串 """ & Mid(A, 5, i) & """陣列上限維度 " & UBound(W) & " 最後一維字串: " & W(UBound(W)) '-> 1ABC,2ABC,3ABC,4ABC)
  9.     Next
  10. End Sub
複製代碼
回復 20# HSIEN6001
Split(字串,分割字元)(1)--->這個(1)是?意思
18#有示範的程式
  1. Sub Ex_Split() 'Split(字串,分割字元)(1)--->這個(1)是?意思
  2.     Dim A As String, W, xi As Integer, i As Integer
  3.     A = "1ABCD2ABCD3ABCD4ABCD"
  4.     W = Split(A, "B")
  5.     For i = 0 To UBound(W)
  6.         MsgBox "W(" & i & ")  -> " & W(i)
  7.     Next
  8. End Sub
複製代碼
壓縮檔內有兩個下載,一個是NG,一個OK
21#c_c_lai  不是說
第一次一定是 OK 的,因為在 D:\ 內 市.csv、櫃.csv 並不存在,按第二次時,
妳又再次使用 .SaveToFile (Apath & "市.csv") 以及 .SaveToFile (Apath & "櫃.csv")
所以就會出錯了。
  1. Sub Ex()
  2. Dim xml As New XMLHTTP
  3. Dim stream As New ADODB.stream
  4. Dim strURL As String
  5. Dim x As String, y As String
  6. Dim Apath As String, ApathFile As String
  7. Apath = "D:\"
  8. If Dir(Apath & "市.csv") <> "" Then Kill Apath & "市.csv"       '加上有則刪除的判斷
  9. If Dir(Apath & "櫃.csv") <> "" Then Kill Apath & "櫃.csv"
複製代碼

TOP

回復 18# GBKEE
我指的是#16 的第32行
' (For 5 to 6)
' (For i = 0 To 4)                   <---   正確應為 For i = 0 To 3
' Split("1ABCD2ABCD3ABCD4ABCD",Mid(A,5,1)) -> 'D'
' Join(W,',') -> 1ABC,2ABC,3ABC,4ABC,
'
10.png

TOP

回復 21# c_c_lai

只按一次而已
程序後處理,有下Kill 指令刪除檔案
但下載錯誤的頁面,無法完成所有動作.

出現錯誤的下載   
<head>
<link rel='stylesheet' href='/ppp.css' type='text/css'>
</head>
<body>
<center>
<br><h4 align='center'><font color='red'>檔案不存在</font></h4>
<!- filename1 = t108sb27_20120715_18181771.csv' --><br>
<!- filename2 = t108sb27_20120715_18181771.csv' -->
<!- fromNew =  -->

不ㄧ定在[市]or[櫃]出現錯誤的下載
跟回傳速度有關係?!

TOP

本帖最後由 c_c_lai 於 2012-7-15 20:52 編輯

回復 20# HSIEN6001
第一次一定是 OK 的,因為在 D:\ 內 市.csv、櫃.csv 並不存在,按第二次時,
妳又再次使用 .SaveToFile (Apath & "市.csv") 以及 .SaveToFile (Apath & "櫃.csv")
所以就會出錯了。
應該在 .SaveToFile() 前先判斷檔案是否業已存在,如是的話,就應先予以刪除後,
才能執行 .SaveToFile()。
至於如何去執行刪除動作(VBA 語法)就要請教 GBKEE 大大了。

TOP

回復 18# GBKEE

Split(字串,分割字元)(1)--->這個(1)是?意思
看不懂(1)的作用  , 我是參考#2 樓語法
Rng.Offset(0, 1) = Left(VBA.Split(.responseText, "KK</span>")(1), InStr(VBA.Split(.responseText, "KK</span>")(1), "]"))
修改應用 Left(VBA.Split(.responseText, "filename' value='")(1), InStr(VBA.Split(.responseText, "<table class='noBorder")(1), "<"))

不好意思!我表達不夠清楚
壓縮檔內有兩個下載,一個是NG,一個OK
不知為何有時會NG
測試-某次NG結果.rar (147.33 KB)

TOP

本帖最後由 HSIEN6001 於 2012-7-15 17:50 編輯

回復 18# GBKEE

程式碼在#14樓

若顯示在[A1]
  1. Sub EX()
  2. Dim xml As New XMLHTTP
  3. Dim stream As New ADODB.stream
  4. Dim strURL As String
  5.     strURL = "http://mops.twse.com.tw/mops/web/ajax_t108sb27?step=1&firstin=ture&off=1&TYPEK=otc&co_id_1=&co_id_2=&year=" & _
  6.                 Year(Date) - 1911 & "&month=&b_date=&e_date=&type=1&rulesubmit2=%20%E6%90%9C%E5%B0%8B%20"
  7.         With xml
  8.             .Open "GET", strURL, 0
  9.             .send
  10.             Do While xml.ReadyState <> 4
  11.             Loop
  12.             [A1] = Left(VBA.Split(.responseText, "filename' value='")(1), InStr(VBA.Split(.responseText, "<table class='noBorder")(1), "<"))
  13.             
  14.         End With
  15. End Sub
複製代碼
不知為何有時OK~有時不行?!


我是參考#2 樓語法
Rng.Offset(0, 1) = Left(VBA.Split(.responseText, "KK</span>")(1), InStr(VBA.Split(.responseText, "KK</span>")(1), "]"))
修改而來的
Left(VBA.Split(.responseText, "filename' value='")(1), InStr(VBA.Split(.responseText, "<table class='noBorder")(1), "<"))

Split(字串,分割字元)(1)--->這個(1)是?意思
看不懂(1)的作用

TOP

回復 16# c_c_lai
(For i = 0 To 4)                   <---   正確應為 For i = 0 To 3
' Split("1ABCD2ABCD3ABCD4ABCD",Mid(A,5,1)) -> 'D'  這裡並沒有套入 i  這變數
可以傳上你所說的錯誤 程式碼

回復 17# HSIEN6001
  1. Sub Ex()
  2.     Dim strURL As String, x As String
  3.     strURL = "http://mops.twse.com.tw/mops/web/ajax_t108sb27?step=1&firstin=ture&off=1&TYPEK=sii&co_id_1=&co_id_2=&year=" & _
  4.                 Year(Date) - 1911 & "&month=&b_date=&e_date=&type=1&rulesubmit2=%20%E6%90%9C%E5%B0%8B%20"
  5.         With CreateObject("Microsoft.XMLHTTP")
  6.             .Open "GET", strURL, 1
  7.            .send
  8.             Do While .ReadyState <> 4
  9.             Loop
  10.              x = Left(VBA.Split(.responseText, "filename' value='")(1), InStr(VBA.Split(.responseText, "<table class='noBorder")(1), "<"))
  11.            MsgBox x
  12.         End With
  13. End Sub
  14. Sub Ex_Split() 'Split(字串,分割字元)(1)--->這個(1)是?意思
  15.     Dim A As String, W, xi As Integer, i As Integer
  16.     A = "1ABCD2ABCD3ABCD4ABCD"
  17.     W = Split(A, "B")
  18.     For i = 0 To UBound(W)
  19.         MsgBox "W(" & i & ")  -> " & W(i)
  20.     Next
  21. End Sub
複製代碼

TOP

回復 13# GBKEE

終於意會這範例
xi=2 , Mid(A,2,1)=A , W=Split(1ABCD2ABCD3ABCD4ABCD,A)=4 個 A , UBound(W)=4 , For i = 0 To 4
  則 W(0)=1 , W(1)=BCD2 , W(2)=BCD3 , W(3)=BCD4 , W(4)=BCD

xi=3 , Mid(A,3,1)=B , w=Split(1ABCD2ABCD3ABCD4ABCD,B)=4 個 B , UBound(W)=4 , For i = 0 To 4
  則 W(0)=1A , W(1)=CD2A , W(2)=CD3A , W(3)=CD4A , W(4)=CD

xi=4 , Mid(A,4,1)=C , w=Split(1ABCD2ABCD3ABCD4ABCD,C)=4 個 C , UBound(W)=4 , For i = 0 To 4
  則 W(0)=1AB , W(1)=D2AB , W(2)=D3AB , W(3)=D4AB , W(4)=D

xi=5 , Mid(A,5,1)=D , w=Split(1ABCD2ABCD3ABCD4ABCD,D)=4 個 D , UBound(W)=4 , For i = 0 To 4
  則 W(0)=1ABC , W(1)=2ABC , W(2)=3ABC , W(3)=4ABC , W(4)=空值

xi=6 , Mid(A,3,1)=2 , w=Split(1ABCD2ABCD3ABCD4ABCD,D)=1 個 2 , UBound(W)=1 , For i = 0 To 1
  則 W(0)=1ABCD , W(1)=ABCD3ABCD4ABCD

好難喔!需要消化.....很久!
魚不如漁,謝謝版大的範例說明

===========================
再來自解問題
InStr函數可返回一個字串在另一個字串中首次出現的位置。
Split在字串中以指定的字元作分割傳回一維陣列。
需求是 t108sb27_20120712_17145551.csv

語法修改前:Left(VBA.Split(.responseText, "filename' value='")(1), InStr(VBA.Split(.responseText, "<table class='noBorder")(1), "<"))

VBA.Split(.responseText, "filename' value='")=t108 開始
InStr(VBA.Split(.responseText, "<table class='noBorder")(1),"<")
因為兩段落之間有Alt+Enter

所以給了這個值 -1
(InStr(VBA.Split(.responseText, "<table class='noBorder")(1),"<")-1)
RUN結果不對耶!

若遇上字串間有個Alt+Enter 該如何處理??  這疑問尚未解決
<input type='hidden' name='filename' value='t108sb27_20120712_17145551.csv'>
<table class='noBorder' align='center' width='100%'><tr><td align='left'>

再請教 Split(字串,分割字元)(1)--->這個(1)是?意思

TOP

回復 13# GBKEE
  1. Option Explicit
  2. Sub Ex() 'Split在字串中以指定的字元作分割傳回一維陣列
  3.     Dim A As String, W, xi As Integer, i As Integer
  4.     A = "1ABCD2ABCD3ABCD4ABCD"
  5.     For xi = 2 To 6
  6.         W = Split(A, Mid(A, xi, 1))
  7.         For i = 0 To UBound(W)
  8.         Debug.Print W(i)     '在即時運算視窗可見
  9.         Next
  10.         ' MsgBox Join(W, ",")
  11.         MsgBox "(For " & xi & " To 6)" & Chr(10) & Chr(13) & "(For i = 0 To " & UBound(W) & ")" & Chr(10) & Chr(13) & _
  12.                                          " Split(" & A & ", Mid(A, " & xi & ", 1)) -> " & "'" & Mid(A, xi, 1) & "'" & _
  13.                                          Chr(10) & Chr(13) & "Join(W, ', ') -> " & Join(W, ",")
  14.     Next
  15. End Sub

  16. ' (For 2 to 6)
  17. ' (For i = 0 To 4)
  18. ' Split("1ABCD2ABCD3ABCD4ABCD",Mid(A,2,1)) -> 'A'
  19. ' Join(W,',') -> 1,BCD2,BCD3,BCD4,BCD
  20. '
  21. ' (For 3 to 6)
  22. ' (For i = 0 To 4)
  23. ' Split("1ABCD2ABCD3ABCD4ABCD",Mid(A,3,1)) -> 'B'
  24. ' Join(W,',') -> 1A,CD2A,CD3A,CD4A,CD
  25. '
  26. ' (For 4 to 6)
  27. ' (For i = 0 To 4)
  28. ' Split("1ABCD2ABCD3ABCD4ABCD",Mid(A,4,1)) -> 'C'
  29. ' Join(W,',') -> 1AB,D2AB,D3AB,D4AB,D
  30. '
  31. ' (For 5 to 6)
  32. ' (For i = 0 To 4)                   <---   正確應為 For i = 0 To 3
  33. ' Split("1ABCD2ABCD3ABCD4ABCD",Mid(A,5,1)) -> 'D'
  34. ' Join(W,',') -> 1ABC,2ABC,3ABC,4ABC
  35. '
  36. ' (For 6 to 6)
  37. ' (For i = 0 To 1)
  38. ' Split("1ABCD2ABCD3ABCD4ABCD",Mid(A,6,1)) -> '2'
  39. ' Join(W,',') -> 1ABCD.ABCD3ABCD4ABCD
複製代碼
謝謝您的範例,簡明扼要。
經測試, For 5 to 6 的迴圈時,因該 A 字串尾端字元為 D,
且 Split(A, Mid(A,5,1)) 又為 D 時, UBound(W) 會判定為 4,
因為 W(4) = ""。 如果使用 UBound(W) 來做處理就會有 Bug 了。

TOP

        靜思自在 : 謊言像一朵盛開的鮮花,外表美麗,生命短暫。
返回列表 上一主題