Board logo

標題: 新手發問 - 請問 [打印本頁]

作者: alex_wu    時間: 2012-5-29 23:21     標題: 新手發問 - 請問

新手要學Excel VBA 需要先由那部分學起呢?
有去谷歌了一些網站
但是光 Dim (後面一堆命名就搞不懂了)
Ex: Dim x as long
     Dim x as integater
     Dime arr()
這是vba 開頭一定要做的東西嗎??
作者: alex_wu    時間: 2012-5-29 23:23

另外問一下桃園或那裡有專業學Excel VBA的網站嗎?
若有的話亦麻煩分享之.想努力學習之.
作者: kimbal    時間: 2012-5-30 20:17

dim 是用來製做上 "可放東西的器皿" 稱為"變量"
AS 之後的為"器皿"的屬性

這些是放數字(LONG,INTEGER)的器皿
Dim x as long
Dim y as integer
x=1  '把1放進X
y=2  '把2放進Y
msgbox(x+y) '這句把X和Y的數值加總顯示出來

這些個文字(STRING)的器皿
Dim S as STRING
S="ABC"
msgbox(S)'這句把S內容顯示出來


Dim arr(2) 是陣列
ARR(1)="A"
ARR(2)="B"
MSGBOX(ARR(1) & ARR(2)) '這句把ARR(1)和ARR(2)的內容合併顯示出來,即"AB"
陣列通常用於迴圈

學Excel VBA的網站:
http://forum.twbts.com/thread-6621-1-3.html
作者: alumi    時間: 2012-5-30 20:31

本帖最後由 alumi 於 2012-5-30 20:33 編輯

DIM 是用於宣告變數名稱 與 變數型態
語法:
Dim 變數名稱 as 變數型態
範例:
Dim I as Integer  ' 宣告 I 為整數型態, 其值最大與最小範圍為 -32768 ~ 32767

任何子程式 開頭, 用 Dim 進行變數的宣告 及使用 , 是一個良好的寫程式習慣.
作者: alex_wu    時間: 2012-5-30 21:43

謝謝二位大大,學習到了一些宣告變數的觀念了.
但是 long 與 integer 有什麼差異呢?
另外問一下,可以這樣宣告陣列嗎? Dime arr(x) 還是只能 Dime(1)?
=================================
Dim x as long          整數? (重覆嗎)
Dime x as Integer    整數? (重覆嗎)
Dim x as string        字串
Dim arr(x)              陣列  (可以這樣宣告陣列嗎?)
=================================
作者: alumi    時間: 2012-5-30 23:18

Long 可存儲的數值 範圍, 比 Integer  大上許多,
相對來說, 運算速度也不及 Integer 所宣告變數來的快.
Integer  2 個位元組 -32,768 到 32,767
Long (long integer) 4 個位元組 -2,147,483,648 到 2,147,483,647
--------------------------------------------------------------------
Dimarr(x)   
可以這樣子宣告, 但不建議.
建議後方 再定義其資料型態
例如:
Dim arr(x) as Variant
Dim arr(x) as string
Dim arr(x) as integer
作者: alex_wu    時間: 2012-5-31 13:26

1.所以若要加快程式速度, 所以宣告時 ,若使用之Data 不會超過65536筆
    則用Dime x as integer 較佳.對嗎?
2.請問以下認知對嗎 ?
Dim arr(x) as Variant  --> 指定義陣列x的資料為 ?? Variant是??
Dim arr(x) as string    --> 指定義陣列x的"內容"為"字串"
Dim arr(x) as integer  --> 指定義陣列X的"內容"為"數值"
作者: kimbal    時間: 2012-5-31 21:48

1.所以若要加快程式速度, 所以宣告時 ,若使用之Data 不會超過65536筆
    則用Dime x as integer 較佳.對嗎 ...
alex_wu 發表於 2012-5-31 13:26


1. 對. 如果只是十數個變量,這個年代的電腦,速度分別不會很大

2.
VARIANT 的意思是任意類型, 由excel自己由內容設定類型
dim abc as variant
abc = 123
這樣abc的類型就會變成 "variant/integer" 即integer

dim abc as variant
abc = "def"
abc的類型就會變成 "variant/string"

Dim arr(x) as integer
不是"陣列x", 而是有 X+1 個值的"陣列ARR"
例如
Dim abc(3) as integer
跟這4行類似
Dim abc1 as integer
Dim abc2 as integer
Dim abc3 as integer
Dim abc4 as integer

設定數值時:
abc(0)=1
abc(1)=2
abc(2)=3
abc(3)=4
相對於
abc1=1
abc2=2
abc3=3
abc4=4
作者: alex_wu    時間: 2012-5-31 22:23

嗯,謝謝,對宣告有基礎的認知了
可是為什麼要把資料丟到陣列裡呢?
直接把儲存格內的資料運算不是較快嗎?

另外問一下,學了宣告(Dim)之後,下一階段需要學什麼呢?
作者: GBKEE    時間: 2012-6-1 17:44

回復 9# alex_wu
可是為什麼要把資料丟到陣列裡呢? 直接把儲存格內的資料運算不是較快嗎?
圖1  資料存在儲存格內的所佔的資源
    [attach]11216[/attach]

圖2  資料存在陣列的所佔的資源

[attach]11217[/attach]
作者: kimbal    時間: 2012-6-1 21:36

嗯,謝謝,對宣告有基礎的認知了
可是為什麼要把資料丟到陣列裡呢?
直接把儲存格內的資料運算不是較快嗎?
...
alex_wu 發表於 2012-5-31 22:23



可是為什麼要把資料丟到陣列裡呢?
直接把儲存格內的資料運算不是較快嗎?

我也讚成盡量把資料放在頁面儲存格上處理,
陣列通常是用來作暫時位置,不用找個頁面來用.
例如把文字分拆
arr= split("ABC;DEF;GHG",";")->
arr(0) 會變成ABC
arr(1) 會變成DEF
arr(2) 會變成GHG

另外問一下,學了宣告(Dim)之後,下一階段需要學什麼呢?
可以看一下 function/sub,  for/next, loop/while,
excel相關的是RANGE() 的用法.
最簡單是從錄製巨集中學習.
作者: alex_wu    時間: 2012-6-1 23:47

謝謝分析,原來陣列的好處是陣列所占的資源較少.我想意思
應該是-->陣列有一點像是開了另一個工作表來進行運算.
(但實際是透過陣列內資料+公式進行運算) 突然有點懂了
謝謝各位大大. (對我們新手而且,還是先熟悉頁面儲存格運算
再切入VBA應該較快)
下一階段再挑戰看看由簡易的錄製巨集 + 迴圈試試 , 謝謝大家
作者: alumi    時間: 2012-6-3 22:00

嗯,謝謝,對宣告有基礎的認知了
可是為什麼要把資料丟到陣列裡呢?
直接把儲存格內的資料運算不是較快嗎?
...
alex_wu 發表於 2012-5-31 22:23


1. Excel 工作表, 本身就是一個大型的 二維陣列.
   但它每一個儲存格, 不定大小, 可存放各類型態的資料與相關屬性, 故相對而言, 是比 單一型態的陣列, 耗用更多的記憶體.
   優點: 可視化

2. VBA 內的單一型態陣列, 在程式執行時, 其速度, 遠比再去調用 工作表的儲存格資料, 還要來的快.
作者: alumi    時間: 2012-6-3 22:21

回復 7# alex_wu

1.所以若要加快程式速度, 所以宣告時 ,若使用之Data 不會超過65536筆
    則用Dim x as integer 較佳.對嗎?
2.請問以下認知對嗎 ?
Dim arr(x) as Variant  --> 指定義陣列x的資料為 ?? Variant是??
Dim arr(x) as string    --> 指定義陣列x的"內容"為"字串"
Dim arr(x) as integer  --> 指定義陣列X的"內容"為"數值"
------------------------------------------------------------------------
感覺有點怪怪的.
X 為整數值, 其值的範圍為 -32768 ~ 32767
可以這樣子宣告
Const  X as Integer = 32767
Dim Arr(x) as String    ' 陣列索引範圍為 0~32766
或者
Dim Arr(1 to X) as String ' 陣列索引範圍為 1  ~ 32767

若您想在程式碼中, 所宣告的陣列, 是由 1 開始, 而不是 0 開始,
請在最上面加上一行 Option Base 1




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