不好意思,再多請教關於VBA陣列存入後取出的問題

假設我用回圈跑標題列,將需要標題找出,欄位分別記入到二維陣列中..
此時假設
陣列(1,1)=姓名 .陣列(1,2)=2
陣列(2,1)=血型 .陣列(2,2)=4
陣列(3,1)=身高 .陣列(3,2)=5
陣列(4,1)=性別 .陣列(4,2)=10
....
....

此時我可以利用陣列的索引編號來回查所需的內容
但如果我不想利用索引編號來回查...(因為內容過多時,編號變得不好處理了)
那有什麼方法我可以再從以存入要用的資料的陣列內,再次利用如:姓名...血型...等來回查其所屬的欄位在哪一欄呢?
想到頭都爆了= ="" Orz
2021-11-27 11:13 發佈
陣列(1,1)=姓名 .陣列(1,2)=2
陣列(2,1)=血型 .陣列(2,2)=4
陣列(3,1)=身高 .陣列(3,2)=5
陣列(4,1)=性別 .陣列(4,2)=10

看不出來這樣設計的目的是什麼
可以描述一下目前想做的事情嗎?

  1. 使用者會輸入什麼資訊?
  2. 原本 excel 表格格式長什麼樣子?
  3. 希望做什麼事?(輸出是什麼)

會問這些,是因為有可能用其他做法會比較適合,只是目前不是很清楚需求。
ren1244 wrote:
看不出來這樣設計的目(恕刪)

恩...先謝謝您熱心的回覆
其實是因為陣列這東東我才剛接觸...實在很模糊.
我主要是想利用陣列的方式來做標題列的存放與相關欄位的記錄.
例如:標題列B1格為姓名 .D1為血型...
則我抓到姓名這關鍵字後,
將"姓名" 存入陣列(1,1),然後順道將姓名所在的欄存到陣列(2,1)

同理,我抓到標題列有血型這關鍵字時,將"血型"存到陣列(1,2),將血列的欄位存入陣列(2,,2)
以此類推下..
陣列(1,1)=姓名.
陣列(2,1)= 1 'A欄

陣列(1,2)=血型
陣列(2,2)= 4 'D欄
、、、、、
-------------------------
其主要目的是為了日後回查關鍵字時,能抓到對應的欄位所在

另若情況可以,不知可否再多請教下,用range來抓欄位的方法..
因為我用range抓欄位時,凡超過Z欄後..就不知怎麼抓欄位了..很久前我好像有用過某個函數來轉成英文字母..
但欄位太多時也是會錯位..
故最後都是用cells(row,column)來抓位置的..
恩..其它就是若此抓位置的方式有其它更好的方法可供解決,也請不吝指教..拜託了..
祝順心如意..
MaverickRay wrote:
那有什麼方法我可以再從以存入要用的資料的陣列內,再次利用如:姓名...血型...等來回查其所屬的欄位在


您的作法有點「奇怪」,正常來說,如果是要記錄個人資料,欄位應該會是固定的。
比如:
如果是單純紀錄列,那第一列(標題列不算)放甲的資料,A欄固定是姓名、B欄固定是血型、C固定是身高....以此類推。
所以不用放標題「姓名、血型....」的資料(已經是固定,只要另外跑一次迴圈,就能得到全部的標題值)
有5個人,那
(1,1)就放甲姓名...抓cells(1,1);(1,2)就放甲的血型...抓cells(1,2);..........
(2,1)就放乙姓名...抓cells(2,1);(1,2)就放乙的血型...抓cells(2,2);..........

如果是履歷表格式(5個人資料都放同一張工作表),那甲的資料區,B1固定是姓名、D1固定是血型.....乙的資料區,B35(假設)、D35固定是血型.....丙的資料區,B69(假設)、D69固定是血型 .....(每張表佔34列,假設)
一樣不用放標題「姓名、血型....」的資料(已經是固定,只要另外跑一次迴圈,就能得到全部的標題值)
有5個人,那
(1,1)就放甲姓名...抓cells(1,2);(1,2)就放甲的血型...抓cells(1,4);.............1可用 1+(i-1)*34取得,變數i=1
(2,1)就放乙姓名...抓cells(35,2);(2,2)就放乙的血型...抓cells(35,4);..........35可用 1+(i-1)*34取得,變數i=2
(3,1)就放丙姓名...抓cells(69,2);(3,2)就放乙的血型...抓cells(69,4);..........69可用 1+(i-1)*34取得,變數i=3
.......以此類推

總之,標題可用「寫死」,或另用一個一維陣列處理;資料的2維陣列就不用放標題,而是只放純資料。


MaverickRay wrote:
但如果我不想利用索引編號來回查...(因為內容過多時,編號變得不好處理了)
那有什麼方法我可以再從以存入要用的資料的陣列內,再次利用如:姓名...血型...等來回查其所屬的欄位在哪一欄呢?

有個方法,使用VBA的字典功能........(可google查詢關鍵字:VBA 字典)
例如:
d("姓名")="張三"
d("血型")="O"
d("地址")="台中市"
......
存入字典陣列中,將來可以:1.用列舉key或值的陣列編號來迴圈取得內容;2.直接用Key的值來取得內容:
Msgbox d("血型")
馬上就得到O,不用用編號跑迴圈


MaverickRay wrote:
因為我用range抓欄位時,凡超過Z欄後..就不知怎麼抓欄位了..很久前我好像有用過某個函數來轉成英文字母..
但欄位太多時也是會錯位..
故最後都是用cells(row,column)來抓位置的..

用cells的好處就是可以套變數數字,不用再去轉英文字母啊.........
如果是怕欄數數錯,可以:
1.在工作表內該欄位(比如AA1)下函數「=column()」,這樣就會得到27
2.寫一個自訂函數function,來將英文欄位轉成數字編號。(算簡單,不難,自己動手才有成就感)

甚至Range的寫法也可以套用cells,比如:
Range(Cells(1, 27), Cells(1, 27)).Select
就是選取AA1儲存格,和寫成:
Range("AA1").Select
效果一樣。

以上,提供樓主您參考囉
Der,misser1
MaverickRay
MaverickRay 樓主

先謝謝您百忙抽空回覆,這些細節我得再另外抽空再多做研究,先上來表達感謝之心..祝您一切順心&如意

2021-11-30 12:11
建議以使用者自訂的資料型態來做比較方便
EX:
Private Type 資料
姓名 As String
血型 As String
身高 As Single
性別 As String
欄位 As Long
End Type
Dim n() As 資料

Private Sub Command1_Click() '將資料放入陣列

For r = 1 To 10
ReDim Preserve n(r - 1)
n(r - 1).姓名 = Cells(r, 1)
n(r - 1).血型 = Cells(r, 2)
n(r - 1).身高 = Cells(r, 3)
n(r - 1).性別 = Cells(r, 4)
n(r - 1).欄位 = i
Next
End Sub

Private Sub Command2_Click() '查詢
For i = 0 To UBound(n)
If n(i).姓名 = "AAA" Then Debug.Print n(i).欄位
Next
End Sub
MaverickRay
MaverickRay 樓主

恩...先感謝日後我有空閒研究後再來細談,不過你這方法我先前好像就是用此法來抓欄位..後半段似有不同.(須詳看再聊),我是宣告一堆變數,抓的速度也很快,唯不知是否變數過多,致後來工作簿的VBA莫名故障

2021-11-30 12:13
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?