標題:
[發問]
Excel VBA有什麼現有的函數可以用來找尋二維陣列中的資料?
[打印本頁]
作者:
newstarmoon
時間:
2018-5-29 02:01
標題:
Excel VBA有什麼現有的函數可以用來找尋二維陣列中的資料?
各位前輩好,我剛用Excel VBA寫巨集沒多久,目前我會將工作表中的資料,先讀到陣列後再做運算(這樣執行速度較快)
平常查某個值有沒有在陣列中很好比對,但最近遇到一個狀況,就是我要查A值(例如身份證號)有沒有在B陣列中,但B陣列中,每個行列值,並不單純是身份證號,而且一長串的文字(可能有十幾個字,而其中包含了身份證號),
有什麼現有的函數或方法可以用來比對A值有沒有在B陣列中? ~~新手提問,煩請大家指教~~謝謝~~
作者:
newstarmoon
時間:
2018-6-2 17:53
這Excel檔裡有3個工作表,工作表中的藥代欄是主要資料,我要從藥材檔的資料中,比對藥代是否一樣,目前已經可以比對藥代、健保碼、藥名是否相同;但藥材檔中的"DK"列,有這藥品的歷史修改資料,我想用健保碼跟DK列比對,看DK列中是否有相同的健保碼,不知道有什麼方法可以使用?
作者:
GBKEE
時間:
2018-6-5 09:24
本帖最後由 GBKEE 於 2018-6-11 14:09 編輯
回復
2#
newstarmoon
試試看
Option Explicit
Sub Ex()
Dim AR(), Ar1(), Ar2(), i As Long, ii As Long, iii As Long, Msg As String
Dim xRow As Integer
Ar1 = Array("a", "b", "d") '你的C欄隱藏了
ReDim AR(1 To UBound(Ar1) + 1)
Sheets("運算").UsedRange.Clear
With Sheets("工作表")
For i = 1 To UBound(Ar1) + 1
ii = IIf(.Cells(Rows.Count, Ar1(i - 1)).End(xlUp).Row > ii, .Cells(Rows.Count, Ar1(i - 1)).End(xlUp).Row, ii)
'如果某一列的資料有100行,而第5行是空白
'***必須找出所有欄位中最後資料有的列號 ***
Next
For i = 1 To UBound(Ar1) + 1
AR(i) = Application.WorksheetFunction.Transpose(.Range(Ar1(i - 1) & "1").Resize(ii).Value)
Next
End With
With Sheets("藥材檔")
Ar1 = .Range(.[A5], .[A5].End(xlDown)).Resize(, 5).Value
For i = 1 To .[A5].End(xlDown).Row - 4
Ar1(i, 5) = .Range("DK" & i + 4) '**加入"DK"欄
Next
End With
For i = 2 To UBound(AR(1)) '藥代
'**************************
'"工作表"
'AR(1)(i)=>藥代 AR(2)(i)=>藥單名 AR(3)(i)=>健保碼
'**************************
'"藥材檔"
'Ar1(ii, 1)=>藥代 Ar1(ii, 2)=>代號 Ar1(ii, 3)=>健保碼 Ar1(ii, 4)=>藥名
'Ar1(ii, 5)=>DK
'**************************
Msg = ""
For ii = 1 To UBound(Ar1)
If AR(1)(i) <> "" And Ar1(ii, 1) <> AR(1)(i) Then '藥代不相同
'InStr(Ar1(ii, 5), (AR(3)(i))) ->查看有無相同健保碼
If UCase(Ar1(ii, 4)) = UCase(AR(2)(i)) Or UCase(Ar1(ii, 3)) = UCase(AR(3)(i)) Or InStr(Ar1(ii, 5), (AR(3)(i))) Then
Msg = Msg & IIf(Msg <> "", ",", "") & ii '比對到帶入
End If
End If
Next
If Msg <> "" Then
With Sheets("運算").Cells(Rows.Count, "A").End(xlUp)
xRow = IIf(.Row = 1, 0, 2)
Ar2 = Application.Index(Application.WorksheetFunction.Transpose(AR), 1)
.Offset(xRow).Resize(, UBound(Ar2)) = Ar2
Ar2 = Application.Index(Application.WorksheetFunction.Transpose(AR), i)
.Offset(xRow + 1).Resize(, UBound(Ar2)) = Ar2
Ar2 = Array("藥代", "代號", "健保碼", "藥名", "DK欄")
.Offset(xRow + 2).Resize(, UBound(Ar2) + 1) = Ar2
End With
With Sheets("運算").Cells(Rows.Count, "A").End(xlUp).Offset(1)
For iii = 0 To UBound(Split(Msg, ","))
Ar2 = Application.Index(Ar1, Split(Msg, ",")(iii))
.Offset(iii).Resize(, UBound(Ar2)) = Ar2
Next
End With
End If
Next
End Sub
複製代碼
作者:
newstarmoon
時間:
2018-6-11 00:21
謝謝版主的回復,因為我只有六日比較有空,所以這一兩天才花時間好好理解版主的程式碼;
仔細研究完後,版主的程式碼讓我受益良多,也學到了許多概念。
像你用的"InStr"函數,就是我提問中,最需要的函數,我會好好運用它;你另外有用了"Split"函數,我有去查了Split函數的用法,這函數功能真的很不錯,我會仔細記下來。
另外再請教版主一個問題,你程式碼中"AR(i) = Application.WorksheetFunction.Transpose(.Range(Ar1(i - 1) & ":" & Ar1(i - 1)).SpecialCells(xlCellTypeConstants).Value)"這一段,如果某一列的資料有100行,而第5行是空白,後面接著有資料,但這一段程式,它讀到第5行是空白後就結束不會再讀下去,這有沒有什麼方法可以改良?
謝謝版主的細心回覆~~
作者:
newstarmoon
時間:
2018-7-5 10:38
版主你好,我最近有碰到一個小問題要再請教你一下
For i = 1 To UBound(Ar1) + 1
AR(i) = Application.WorksheetFunction.Transpose(.Range(Ar1(i - 1) & "1").Resize(ii).Value)
上面這段程式碼,平常在用的時候都ok,但我最近遇到我的資料行數超過6萬多行時,這一段程式碼就會出錯,不知道是不是Transpose有什麼限制,或者有什麼方法可以改善?
謝謝版主~~
歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)