• 156

(不定期更新)使用VBA解決 excel web 查詢無法匯入、匯入太慢的股市資料

排版測試 test


for i=1 to 10
i=i+1
next i

sub test()
a=a
b=b
c=c
end sub



for i=1 to 10
i=i+1
next i

sub test()
a=a
b=b
c=c
end sub







1
2
3
4
5
6
7
8
9
for i=1 to 10 
i=i+1
next i

sub test()
a=a
b=b
c=c
end sub


1
2
3
4
5
6
7
8
9
for i=1 to 10 
i=i+1
next i

sub test()
a=a
b=b
c=c
end sub






For i=1 to 10


      For j=1 to 10


            Debug.print I,j


      Next j


Next I


 


yuehmao 大

我用的是 office 2010, 我執行的是範例中的網頁
程式碼也完全沒改

我後來發現,有可能是因為我把程式碼複製,貼到我另外一個檔案中的模組去執行而發生錯誤

就跑到某一行程式碼的時候發生78樓的錯誤,但有時候是在 Set Table 那一行
有時候是在下圖中
Sheets("sheet1").Range(Cells(1, 1), Cells(Table.Length, Table(2).Cells.Length)) = TempArray()
這一行,不過我看不出來為什麼就是了XD

若直接執行 snare 大提供的檔案,就不會有問題 (雖然是完全一模一樣的程式碼)





snare 大

我確實是用網頁中的範例,還沒有做修改,只是先跑一次然後嚐試理解程式碼做的事情
情況就如上面的說明

但我跑完後發現結果跟你的不太一樣,資料的位置有區別
目前看起來金額跟%的位置都往左 shift , 還有所有的季度顯示是連在一起的
請問是為什麼呢?



謝謝~
keeptry wrote:
但我跑完後發現結果跟你的不太一樣,資料的位置有區別
目前看起來金額跟%的位置都往左 shift , 還有所有的季度顯示是連在一起的
請問是為什麼呢?...(恕刪)


您可以回去看 59樓、71樓的圖片
沒排版好,是我故意留的
snare wrote:
程式自動化、美觀,請自行另加程式碼處理...(恕刪)


因為第1列、第2列,的原始網頁資料,本來就是連在一起的
這也是為什麼我用第3列 Table(2).Cells.Length ,來判斷表格的最大寬度
而不用第1列 Table(0).Cells.Length 的原因

提示:
當 i=0 and i=1,需向右移動儲存格位置
不會改,就用錄巨集,單獨調整第1、2列就可以,反正格式都是固定的

keeptry wrote:
但有時候是在 Set Table 那一行
有時候是在下圖中
Sheets("sheet1").Range(Cells(1, 1), Cells(Table.Length, Table(2).Cells.Length)) = TempArray()
這一行,不過我看不出來為什麼就是了XD
若直接執行 snare 大提供的檔案,就不會有問題 (雖然是完全一模一樣的程式碼)
...(恕刪)


可能
1、 url,url_a 對照的各表單的代碼改錯
請用我各項分類中的網址來改
snare wrote:
其它年表、季表
url_a :只需要改最後4個字(股票代號)
url :要改2個地方
一、STOCK_ID=(股票代號)
二、年表、季表、年份,請照下面代碼修改

...(恕刪)

2、您的檔案中,有正在跑的副程式影響
3、您的程式中的全域變數,剛好和我的範例變數同名稱
4、其它不明原因
原來如此,排版的問題我能處理

我還看不出從 source 抓下來的資料長怎麼樣子,
就比較難猜的出來該怎麼修改
知道原因就可以試了

謝謝 snare 大這麼夜深還如此快速的回覆問題
受教了~

snare wrote:
可能
1、 url,url_a 對照的各表單的代碼改錯
2、您的檔案中,有正在跑的副程式影響
3、您的程式中的全域變數,剛好和我的範例變數同名稱
4、其它不明原因


這我要消化一下了,我再檢查看看
謝謝 snare 大
keeptry wrote:
source 抓下來的資料長怎麼樣子...(恕刪)


長這樣
第1列、第2列
因為 rowspan 和 colspan 網頁合併儲存格的關係,所以vba抓出來會少格子
不過格式固定,所以直接位移、調整就好,不必另外寫程式去抓rowspan、colspan的參數

又知道了一點新的東西了
謝謝 snare 大

snare 大是還沒睡還是已經醒了
一點多回文,五點多還回文
真神人是也~~

keeptry wrote:
...
我用的是 office 2010, 我執行的是範例中的網頁
程式碼也完全沒改

我後來發現,有可能是因為我把程式碼複製,貼到我另外一個檔案中的模組去執行而發生錯誤

就跑到某一行程式碼的時候發生78樓的錯誤,但有時候是在 Set Table 那一行
有時候是在下圖中
Sheets("sheet1").Range(Cells(1, 1), Cells(Table.Length, Table(2).Cells.Length)) = TempArray()
這一行,不過我看不出來為什麼就是了XD

若直接執行 snare 大提供的檔案,就不會有問題 (雖然是完全一模一樣的程式碼)

(恕刪)


如果是依在下自已的經驗來說的話,
通常發生錯誤時,
首一定是先去看 錯誤發生的位置 和 錯誤訊息的提示(說明),
通常由這些資訊就大多可以明白並找出發生的問題點在那裏了,
而有時候發生問題的因素,就是新版本 Excel 所用的語法和函數,在舊的版本上並不存在這些用法,
所以有時把某個版本所製作的 Excel 用在不同版本的 Excel 中執行時會出現問題,
這種情況大多是把新版用在舊版上執行的情況比較容易出現,
也因此,在下才會先猜想您所用的版本是不是 2003 之前的...^^"
不過,看您有說明是用2010的,那這樣就不是在下原先所猜測的版本相容的這個問題了,
但,總之要找問題,在下是覺得大概就是先從 錯誤發生點 和 錯誤訊息先來判斷,
再來就是靠經驗來做處理了。

不過,像 snare大大 這次分享的像下面這種寫法
Sheets("sheet1").Range(Cells(1, 1), Cells(Table.Length, Table(2).Cells.Length)) = TempArray()
---> [Range].Length
這種用法在下也是初次見到...^^"
有稍為去查了一下 MSDN 的相關說明,但又沒找到...
所以在下也正先在自行測試摸索中,後面或許還需向 snare大大 來請教指點。

yuehmao wrote:
在下把 snare大大 PO在 71F 的範例做了些修改,變成如下的畫面呈現。
71F(75) 的範例改成如下,
也稍為修改了輸入資料的地方,當不小心輸入錯誤可以退回上一步再重新輸入。...(恕刪)


沒排版
擋住畫面的按鈕
您把我故意留的全改掉了
我本來想讓抄的人,稍微辛苦一下的說

不過,這種美觀、輸入的修改也沒關係啦
不要改到“100%完全自動化”就好,留一點變數給他們思考
71樓、75樓的範例,內文就有寫,本來就是寫出來給大家抄的
您願意幫他們改,我很欣賞,那些都是我不願意做的事

yuehmao wrote:
Sheets("sheet1").Range(Cells(1, 1), Cells(Table.Length, Table(2).Cells.Length)) = TempArray()
---> [Range].Length
這種用法在下也是初次見到...^^"
有稍為去查了一下 MSDN 的相關說明,但又沒找到...
...(恕刪)


.length 是 CreateObject("htmlfile") 的變數之一
table是我定義的,名稱隨意
Table.Length,該資料表格的最大長度(列數)
Table(2).Cells.Length,該資料表格的最大寬度(欄數),為什麼用2前面解釋過了

會這樣做,是因為資料量太多
有時是上萬格的資料,如果用迴圈一次一格填入,會浪費excel 的處理時間
所以先把資料丟到陣列裡

range.cells(第一格,最後一格)=陣列(需和cells同大小)
一次填入全部資料
  • 156
內文搜尋
X
評分
評分
複製連結
請輸入您要前往的頁數(1 ~ 156)
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?