Board logo

標題: [發問] 載入網頁資料的問題 [打印本頁]

作者: yuch8663    時間: 2013-6-30 21:02     標題: 載入網頁資料的問題

請問在這組程式裡想將日期部分改為變數`就會出現 "必須是常數運算式"的錯誤訊息,應該如何修改?謝謝。
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


[attach]15341[/attach]
作者: HSIEN6001    時間: 2013-6-30 22:13

回復 1# yuch8663

參考![attach]15343[/attach]
作者: GBKEE    時間: 2013-7-1 07:20

回復 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. 常數皆預設為私有的,程序中的常數都是私有的,常數的可見性不可以改變。在一般模組�堙A模組層次常數的有效範圍可以用 Public 關鍵字來改變。然而,在物件類別模組�堙A常數只能為私有變數,且無法由 Public 關鍵字來改變其可見性。
  12. 若要把多個常數宣告式放在一行�堙A則用逗號來分隔每個常數指定式。當多個常數宣告放在同一行�堙A若使用 Public 或 Private 關鍵字,則適用於全部同一行的常數。
  13. '*******************************
  14. 指定給常數的運算式不可以是變數、使用者自訂函數或 Visual Basic 內建的函數 (例如 Chr)。
  15. '********************************
  16. 附註 常數可以使您的程式較容易修改。和變數不一樣的是,在程式執行時,常數可以避免不小心錯誤的修改。
  17. 如果沒有明確的使用 As type 來宣告常數的型態,則常數會選用最適合 expression 的型態。
  18. 在 Sub、Function 或 Property 程序�堜珓襲i的常數,只適用在該程序的區域�堙C在程序外所宣告的常數,則是在宣告它的模組中所定義的。在任何可以使用運算式的地方,就可以使用常數。
複製代碼
可修改如下
  1. url = "http://www.xe.com/currencytables/?from=USD&date=" & a & "-" & b & "-" & c    ' 正確的
複製代碼

作者: sunnyso    時間: 2013-7-1 08:00

感謝分享, 好好消化一下
作者: HSIEN6001    時間: 2013-7-1 09:03

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

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

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

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

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

[attach]15344[/attach]
作者: GBKEE    時間: 2013-7-1 09:42

本帖最後由 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中開啟後沒關閉吧
作者: HSIEN6001    時間: 2013-7-1 10:27

本帖最後由 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的問題
我還沒找到為何 "有時" 工作表會反黑的原因
作者: GBKEE    時間: 2013-7-1 10:34

回復 7# HSIEN6001
雖然是 On Error Resume Next       '***有些table沒Rows資料會產生錯誤 不理會它,程式繼續走
'
'
但最後還是會 .Quit        '關閉網頁
照道理不會殘留IE的.
要用VBA 關閉殘留IE,還沒試過.
作者: stillfish00    時間: 2013-7-1 13:07

回復 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
複製代碼

作者: HSIEN6001    時間: 2013-7-1 14:18

回復 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 剛剛測試...沒反應
作者: stillfish00    時間: 2013-7-1 14:36

本帖最後由 stillfish00 於 2013-7-1 14:48 編輯

回復 10# HSIEN6001
FullName中是程序的完整路徑,像我的是 "C:\Program Files\Internet Explorer\iexplore.exe"
再去比較後面的字尾看是不是IE的程序而已,應該不用加 *32吧

另外我覺得你要注意的是QueryTable若只是用來取得一次性資料,最好還是順便把連線刪除,不然每次都會新增連線,以後該工作表就有很多資料連線...,可能造成開檔變慢的問題。
作者: HSIEN6001    時間: 2013-7-1 15:35

回復 11# stillfish00
QueryTable 好樣知道耶!  ..^_^..
大略應用幾種方式排除:

(1)
Public Sub 刪除本活頁簿中所有的定義名稱()
For Each c In ActiveWorkbook.Names
   c.Delete
Next
End Sub
*****************
(2) 下載資料 to 新增活頁簿
*****************
(3)
新增"暫時"工作表
用完Delete該工作表
不留連線 QueryTable
*****************
(4)
Dim QueryTable_Name As String   
.
.
.
QueryTable_Name = .Name         
.
.Names(QueryTable_Name).Delete   
---------------------
不知道為甚麼,我 C:\
共有兩個Program Files
Program Files
Program Files (x86)
  1. Sub QuitIE()
  2. Dim oShellWindows As Object, obj As Object
  3. Set oShellWindows = CreateObject("Shell.Application").Windows
  4.     FullName = "C:\Program Files (x86)\Internet Explorer\iexplore.exe"
  5.    
  6.     If oShellWindows.Count > 0 Then
  7.         For Each obj In oShellWindows
  8.             If StrComp(Right(obj.FullName, 12), "iexplore.exe", vbTextCompare) = 0 Then obj.Quit
  9.         Next
  10.     End If
  11. End Sub
複製代碼
這樣對不對?!!
(對不起!!若程序很好笑,我是真的外行,有時隨便套用來的)
別見怪!!   ..^__^..
作者: HSIEN6001    時間: 2013-7-1 15:41

忘了!!
(附圖)
下載時,工作表反黑的現象是這樣
[attach]15345[/attach]
有沒有人知道這個問題的產生原因
作者: yuch8663    時間: 2013-7-1 17:24

謝謝板上各位大大解題,會在琢磨參詳。




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)