返回列表 上一主題 發帖

[發問] 如何加資料

本帖最後由 Hsieh 於 2011-1-7 20:27 編輯

回復 20# FAlonso
首先我必須先佩服的求知態度
記得當初剛接觸陣列與dictionary物件時,也有著跟你相同的疑惑
但我就是不求甚解的個性,就把TRANSPOSE函數作為處理陣列問題的方法而已
今天遇到您提出疑問,那就讓我們一起來探討他的奧秘吧!
以下是我個人對陣列與dictionary的理解方式
提供您做參考
若有不是之處,還請各位前輩指正

1.Range("A1:A4")算不算是一個陣列?
是陣列,而且是二維陣列
以下列程式碼測試該陣列狀態
  1. Sub Ex()
  2. Dim j%, i%, Ar As Variant
  3. On Error Resume Next
  4. Ar = [A1:A4]
  5. Do Until j > 2  'j為計算轉置次數的變數
  6. MsgBox IIf(IsArray(Ar), "ar是陣列", "ar不是陣列") '是否為陣列
  7. i = 1
  8. Do Until Err.Number > 0
  9. i = i + 1
  10. k = UBound(Ar, i)
  11. Loop
  12. MsgBox "此陣列為" & i - 1 & "維陣列" & Chr(10) & "被轉置" & j & "次" '第一維上限(列數)
  13. Err.Clear
  14. Ar = Application.Transpose(Ar)
  15. j = j + 1
  16. Loop
  17. End Sub
複製代碼
2.為什麼打直的格子,一次transpose就可以,打橫的要兩次?
那是因為join的引數必須是一維陣列

3.d(mystr) = d(mystr) + A.Offset(, 4).Value這句是怎解釋,為什麼可以作累加的作用?
因為dictionary物件,你可以直接視為陣列,當中的mystr就是索引值(一般陣列會是數值,在此是除了陣列型態以外的任何資料型態),代表此物見某個元素的指定索引
d(mystr)就是d這個物件的mystr位置的那個元素
d(mystr) = d(mystr) + A.Offset(, 4).Value  
變數(新值)=變數(原值)+常數
就好比一個變數了,所以自然就能計算累加值
學海無涯_不恥下問

TOP

第二個問題先擱下不表
第三個問題是否指先把mystr注冊在dictionary的index,d(mystr),而該index的default資料為 = 0(即 d(mystr)=0), 再引以offset(,4)計數?還有dictionary照理說應該是幾D array?

感覺愈來愈近真相!
80 字節以內
不支持自定義 Discuz! 代碼

TOP

Dictionary物件當加入KEY的同時即產生對應該KEY的值為Empty的初始值
整個物件當可視為二維陣列
其第一維則是該物件的數量
其第二維則是該物件的keys與items
該陣列大小表示如下:
ThisArray(d.count,2)
但你無法以INDEX指定該陣列
因為這只是將其視為二維陣列
但實際上他是2個縱列的陣列合起來
所以一般應用上會以其Key直接指定到對應的Item
學海無涯_不恥下問

TOP

感謝各位先進
之前針對dictionary & transpose 總是不太了解
看完本文章後,總算比較了解其用法了。
100 字節以內
不支持自定義 Discuz! 代碼

TOP

本帖最後由 linshin1999 於 2011-1-8 11:26 編輯

回復 16# basarasy

變數要用Object嗎?
Dim d as Object ??



Dim d                                                              '建立一個變數
Set d = CreateObject(Scripting.Dictionary)


VBA 中變數的宣告不明確說明型別為何時,它的型別就是 Variant 它的意思就是什麼型態都可以,
1)有好處:就 Scripting.Dictionary 來講,它要處厘跟著來的 陣列 所以它的型別會跟著後面的 陣列 跑,它的型別就一定要是 Variant ,如果没有 variant 這個型別, Dictionary 就不存在了 .
2)有缺點:就是不明確,對於習慣明確型別的人會很不習慣,我也是這樣.

今天再回頭讀 Hsieh 版主 和 TAlonso 精彩的論述,才注意到有這則回復,真不好意思.


回復 24# b9208

太精彩了,我也來加碼.
V98

TOP

回復 25# linshin1999
dim d as object
這是正確宣告,dictionary他是個物件所以宣告為物件沒錯
dictionary這個物件不會因為他的key與item產生資料型態變化
你可將此物件看成一個容器,此容器的內容物並不會改變此容器本身的性質

所以VBA說明中提到
dictionary物件,其key式除了陣列以外的任何資料型態,而item則可為任何形態的資料。
一個關鍵字可對應任何的資料,這是此物件的特性。
學海無涯_不恥下問

TOP

回復 26# Hsieh
多謝H大指點,現在終於完全解通了
另外在#18,我新增了一些筆記,希望以後對他人有用
80 字節以內
不支持自定義 Discuz! 代碼

TOP

怎麼講呢?就是一點點加一點點加,然後就懂了,謝謝各位,放假了大家都還在努力,FAlonso台灣好冷,那裡還好吧!
V98

TOP

linshin1999 兄

於#18對transpos說明非常詳細
建議對transpos變化不了解的,可以前往拜讀。
非常感謝
100 字節以內
不支持自定義 Discuz! 代碼

TOP

回復 29# b9208


    我是後學, 論壇上談的都是我進步的糧食,會很珍惜的,這個論壇真的幫助我很多,借此再說聲謝謝大家!!:D
V98

TOP

        靜思自在 : 待人退一步,愛人寬一寸,就會活得很快樂。
返回列表 上一主題