返回列表 上一主題 發帖

[發問] 載入網頁資料的問題

[發問] 載入網頁資料的問題

請問在這組程式裡想將日期部分改為變數`就會出現 "必須是常數運算式"的錯誤訊息,應該如何修改?謝謝。
Sub Test()
Sheets("sheet1").Select
                                         'http://www.xe.com/currencytables/?from=USD&date=2013-06-23
Dim a, b, c As String
    a = Sheets("sheet1").Range("p1").Text ' M起算年
    b = Sheets("sheet1").Range("p2").Text ' M起算月
    c = Sheets("sheet1").Range("p3").Text ' M起算日
    Const url As String = "http://www.xe.com/currencytables/?from=USD&date=" & a & "-" & b & "-" & c    ' 正確的
    Cells.Clear
    Set ie = CreateObject("internetexplorer.application") '使用此方式可以免除 "設定引用項目"
    With ie
        .Visible = False 'True為開啟ie, False為不開啟ie
        .Navigate url
        Do While .ReadyState <> 4 '等待網頁開啟
        DoEvents
        Loop
        .ExecWB 17, 2 'Select All
        .ExecWB 12, 2 'Copy selection
        Range("A1").Activate
        ActiveSheet.PasteSpecial Format:="HTML", Link:=False, DisplayAsIcon:= _
            False, NoHTMLFormatting:=True
    End With
'   Columns("A:B").Delete    ' 將匯入時 A、B 兩欄移除, 原本 C:I 的欄位全部左靠, 成為 A:I
    ie.Quit
  '  MsgBox "資料複製結束"    ' 離開前顯示一小視窗提醒,按它後即結束。
             Dim qyt As QueryTable
            For Each qyt In Worksheets("sheet1").QueryTables
                qyt.Delete
            Next
End Sub


Book2.rar (7.56 KB)

回復 1# yuch8663

參考! 匯率.rar (20.08 KB)

TOP

回復 1# yuch8663
Const 陳述式
  1. 語法
  2. [Public | Private] Const constname [As type] = expression
  3. Const 陳述式的語法具有下列幾項單元:
  4. 單元 描述
  5. Public 選擇性引數。模組層次所使用的關鍵字,用來宣告在所有模組裏的所有程序中都可以使用常數。 不可在程序中使用此項宣告。
  6. Private 選擇性引數。模組層次的關鍵字,用來宣告只在已宣告的模組裏才可以使用常數。不可在程序中使用此項宣告。
  7. Constname 必要的引數。常數的名稱,遵循變數命名規格。
  8. Type 選擇性引數。常數的資料型態,可以是 Byte、Boolean、Integer、Long、Currency、Single、Double、Decimal (目前未支援)、Date、String,或是 Variant。使用 As type 子句來宣告常數。
  9. Expression 必要的引數。文字、其它常數或任何算術及邏輯運算子的組合,但 Is 則除外。
  10. 請注意
  11. 常數皆預設為私有的,程序中的常數都是私有的,常數的可見性不可以改變。在一般模組裏,模組層次常數的有效範圍可以用 Public 關鍵字來改變。然而,在物件類別模組裏,常數只能為私有變數,且無法由 Public 關鍵字來改變其可見性。
  12. 若要把多個常數宣告式放在一行裏,則用逗號來分隔每個常數指定式。當多個常數宣告放在同一行裏,若使用 Public 或 Private 關鍵字,則適用於全部同一行的常數。
  13. '*******************************
  14. 指定給常數的運算式不可以是變數、使用者自訂函數或 Visual Basic 內建的函數 (例如 Chr)。
  15. '********************************
  16. 附註 常數可以使您的程式較容易修改。和變數不一樣的是,在程式執行時,常數可以避免不小心錯誤的修改。
  17. 如果沒有明確的使用 As type 來宣告常數的型態,則常數會選用最適合 expression 的型態。
  18. 在 Sub、Function 或 Property 程序裏所宣告的常數,只適用在該程序的區域裏。在程序外所宣告的常數,則是在宣告它的模組中所定義的。在任何可以使用運算式的地方,就可以使用常數。
複製代碼
可修改如下
  1. url = "http://www.xe.com/currencytables/?from=USD&date=" & a & "-" & b & "-" & c    ' 正確的
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

感謝分享, 好好消化一下
ss

TOP

回復 3# GBKEE
請教,關於 Public 及 Call

Call 模組名稱.程序名稱
NOTE:在程序中可以呼叫同一模組中的任何程序,但對於其它模組中的程序只能呼叫設定為Public的專案及模組程序。
上面這段說明是書上寫的,有點弄不懂。

我在執行時,雖不同模組,卻可呼叫不同模組,卻沒設定Public 的模組
請問這會有 偶爾 bug的問題?!

抑或.....我的範例,這樣兩次 call 程序的寫法是錯的
因為 "有時" 會出現第二次呼叫時,工作表反黑的畫面

另外一問:
若利用 IE下載網頁資料時,工作管理員的處理程序裡
時常有未關閉的iexplore.exe
這該怎麼處理??

Public提問.rar (9.33 KB)

TOP

本帖最後由 GBKEE 於 2013-7-1 10:25 編輯

回復 1# yuch8663
  1. Sub Test()
  2. Dim url As String
  3.     'url = "URL;http://www.xe.com/zh-HK/currencytables/?from=USD&date=" & a & "-" & b & "-" & c   ' 正確的
  4.                                                                         'A,B,C -> YYYY-MM-DD
  5.     url = "URL;http://www.xe.com/zh-HK/currencytables/?from=USD&date=" & Format(Date - 1, "YYYY-MM-DD")
  6.                                                                         '日期須小於當日
  7.     With Sheets("Sheet1")
  8.         .Cells.Clear
  9.         For Each e In .QueryTables
  10.             e.Delete
  11.         Next
  12.         With .QueryTables.Add(Connection:=url, Destination:=.[a1])
  13.             .WebSelectionType = xlSpecifiedTables
  14.             .WebFormatting = xlWebFormattingNone
  15.             .WebTables = """historicalRateTbl"""
  16.             .WebConsecutiveDelimitersAsOne = True
  17.             .WebSingleBlockTextImport = False
  18.             .WebDisableDateRecognition = False
  19.             .WebDisableRedirections = False
  20.             .Refresh BackgroundQuery:=False
  21.         End With
  22.     End With
  23. End Sub
複製代碼
回復 5# HSIEN6001
Sub EX整頁下載(寫入表格, 寫入位置, theURL)   沒加註是 Public 就是公用程序 可直接呼叫

Private Sub EX整頁下載(寫入表格, 寫入位置, theURL)  加註為私用程序
私用程序 用RUN 呼叫
Run "A下載公用程式.EX整頁下載", "暫時", Sheets("暫時").Range("B" & Rows.Count).End(xlUp).Offset(1), "http://siis.twse.com.tw/server-java/STAMAK03?TYPEK=otc&isnew=&colorchg=1&year=102&smonth=01&emonth=12&step=1&order=12"

工作管理員中有沒關閉的IE,可能是在VBA中開啟後沒關閉吧
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

本帖最後由 HSIEN6001 於 2013-7-1 10:31 編輯

回復 6# GBKEE

對!
類似這樣的VBA開啟的IE
我猜...是否沒有找到table時的On Error Resume Next
所留下來的,累積太多就影響後續下載
只能手動一個個強制 "結束處理程序" or 重開機
有沒有程序可以關閉那些殘留....
  1.     With CreateObject("InternetExplorer.Application")
  2.         .Visible = False
  3.         .navigate "http://...."
  4.         Do Until .readyState = READYSTATE_COMPLETE
  5.             DoEvents
  6.         Loop
  7.         Set A = .document.getElementsByTagName("table")
  8.         With Workbooks.Add
  9.             On Error Resume Next       '***有些table沒Rows資料會產生錯誤 不理會它,程式繼續走
  10.                 For ii = 11 To A.Length - 1
  11.                     For i = 0 To A(ii).Rows.Length - 1
  12.                         k = k + 1       '
  13.                         For j = 0 To 2
  14.                             Cells(k + 1, j + 1) = A(ii).Rows(i).Cells(j).innerText
  15.                         Next
  16.                     Next
  17.                 Next
  18.         End With
  19.         .Quit        '關閉網頁
  20.     End With
複製代碼
********************************
"有時" 會出現第二次呼叫時,工作表反黑的畫面.....那就不是有沒有加註Public的問題
我還沒找到為何 "有時" 工作表會反黑的原因

TOP

回復 7# HSIEN6001
雖然是 On Error Resume Next       '***有些table沒Rows資料會產生錯誤 不理會它,程式繼續走
'
'
但最後還是會 .Quit        '關閉網頁
照道理不會殘留IE的.
要用VBA 關閉殘留IE,還沒試過.
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 8# GBKEE
可能下斷點後按F8停止,也會殘留。
不幸的是IE不能用GetObject取得物件來結束掉,
底下是找到的另外一種方法供參考
  1. Sub QuitIE()
  2.   Dim oShellWindows As Object, obj As Object

  3.   Set oShellWindows = CreateObject("Shell.Application").Windows

  4.   If oShellWindows.Count > 0 Then
  5.     For Each obj In oShellWindows
  6.       If StrComp(Right(obj.FullName, 12), "iexplore.exe", vbTextCompare) = 0 Then obj.Quit
  7.     Next
  8.   End If
  9. End Sub
複製代碼

TOP

回復 9# stillfish00


原來是中斷後留下來的
SO...
如果我的顯示這樣iexplore.exe *32
應該是改為這樣?!
  1. Sub QuitIE()
  2.   Dim oShellWindows As Object, obj As Object
  3.   Set oShellWindows = CreateObject("Shell.Application").Windows

  4.   If oShellWindows.Count > 0 Then
  5.     For Each obj In oShellWindows
  6.       If StrComp(Right(obj.FullName, 16), "iexplore.exe *32", vbTextCompare) = 0 Then obj.Quit
  7.     Next
  8.   End If
  9. End Sub
複製代碼
But 剛剛測試...沒反應

TOP

        靜思自在 : 要用心,不要操心、煩心。
返回列表 上一主題