Board logo

標題: [已解決][發問]程式簡化-陣列-VBA ,尋找某元素是否存在陣列中。 [打印本頁]

作者: Baracuda    時間: 2011-3-28 18:18     標題: [已解決][發問]程式簡化-陣列-VBA ,尋找某元素是否存在陣列中。

本帖最後由 Baracuda 於 2011-4-7 09:24 編輯
  1. Option Explicit
  2. Option Base 1

  3. Dim Input_No  As Integer, Output_No As Integer
  4. Dim Output_Sht_Name_Ary, Input_Sht_Name_Ary

  5. Sub initial()
  6.     Input_Sht_Name_Ary = Array("一", "五", "八")
  7.     Output_Sht_Name_Ary = Array("一", "二", "三", "四", "五", "六")

  8.     Input_No = UBound(Input_Sht_Name_Ary)
  9.     Output_No = UBound(Output_Sht_Name_Ary)

  10. End Sub

  11. Sub main()

  12.    Call initial
  13.    Call Print_Not_Found

  14. End Sub


  15. Sub Print_Not_Found()
  16. Dim Sht_Cnt As Integer
  17. Dim Ctr_1 As Integer, Ctr_2 As Integer
  18. Dim Found_Or_Not As Boolean
  19.    
  20.     Found_Or_Not = False
  21.    
  22.     For Ctr_1 = 1 To Input_No
  23.         
  24.         For Ctr_2 = 1 To Output_No
  25.             If Input_Sht_Name_Ary(Ctr_1) = Output_Sht_Name_Ary(Ctr_2) Then
  26.                 Found_Or_Not = True
  27.                 Exit For
  28.             End If
  29.         Next Ctr_2
  30.         If Not (Found_Or_Not) Then
  31.             Debug.Print Input_Sht_Name_Ary(Ctr_1)
  32.         End If
  33.         
  34.         Found_Or_Not = False
  35.     Next Ctr_1

  36. End Sub
複製代碼

作者: Baracuda    時間: 2011-3-28 18:21

程式的原始碼如上:
現在是用2 個廻圈在尋找是否 Input 的 Element 有存在 Output 的 Array 中。
想請問有無較簡潔的語法可以解決。

依照現在的程式可以找出 "八"是不在 Array Output 之中。
作者: chin15    時間: 2011-3-28 21:18

a = Array("一", "五", "八")
   b = Array("一", "二", "三", "四", "五", "六")
For i = 0 To UBound(a)
If UBound(Filter(b, a(i))) = -1 Then
MsgBox "不 包含" & a(i)
Else
MsgBox "包含" & a(i)
End If
Next
作者: Baracuda    時間: 2011-3-29 09:10

chin15 的方法比我的有效率。
少了一個 Loop 。
這樣的程式也比較簡短。
如果還有別的方式,請各位大哥大姐再幫忙一下。
作者: GBKEE    時間: 2011-3-29 10:22

本帖最後由 GBKEE 於 2011-3-29 10:26 編輯

回復 4# Baracuda
  1. Sub Ex()
  2.     A = Array("一", "五", "八")
  3.     b = Array("一", "二", "三", "四", "五", "六")
  4.     For Each E In A
  5.         M = Application.Match(E, b, 0)
  6.         MsgBox E & IIf(IsNumeric(M), "存在於 ", " 不存在於 ") & Join(b, ",")
  7.     Next
  8. End Sub
複製代碼

作者: Baracuda    時間: 2011-3-30 00:25

GBKEE 謝謝。
這個程式 Work
請問一下變數的型態
E & M 各為何種型態。我現在是設成 Variant
E 設成 String 不會work。
請賜教一下。
作者: GBKEE    時間: 2011-3-30 12:56

本帖最後由 GBKEE 於 2011-3-30 14:31 編輯

回復 6# Baracuda
迴圈  FOR EACH E  IN 物件    E的型態是Variant  或  Object
如  物件是 Range 範圍             E的型態可設為 Range
M = Application.Match(E, b, 0)  傳回 數字 或 #NA
M 的型態 是  Variant
作者: chin15    時間: 2011-3-30 13:17

可以用TypeName 函數取得變數類型
MsgBox TypeName(M)
作者: GBKEE    時間: 2011-3-30 14:34

6樓 問 E 設成 String 不會work。
這是宣告 型態的問題
作者: Baracuda    時間: 2011-3-31 09:22

謝謝 GBKEE,我也是先這樣設定變數型態。
只是我怕太過於耗系統資源(雖然現在的系統資源都還好),但是為養成好習慣,還是平常就省著點用。
作者: Baracuda    時間: 2011-3-31 09:23

chin15 謝謝。從你回答的問題,覺得你是強手,已經從小學生轉為中學生了,謝謝。程度本來就不應該是小學生。
作者: GBKEE    時間: 2011-4-6 18:26

回復 12# Baracuda
要按下 如圖的代碼 將程式碼貼上 後按提交


[attach]5260[/attach]
作者: greetingsfromtw    時間: 2016-10-26 23:50

回復 5# GBKEE

GBKEE前輩好,冒昧打擾,

感謝提供程式碼,
小弟有試著修改前輩的程式碼,
試圖將儲存格內的值做為元素儲至陣列中,但是會出現錯誤,不知如何解決,

小弟斗膽,是否能夠麻煩前輩指點迷津,十分感謝.

附上檔案及修改自前輩所寫程式碼:
  1. '此程式碼修改自麻辣家族討論區excel高手GBKEE前輩所寫,非我自創.
  2. '討論區網址:http://forum.twbts.com/index.php
  3. Sub Ex()
  4.     A = Range("a2:a" & Cells(Rows.Count, 1).End(xlUp).Row)
  5.     b = Range("b2:b" & Cells(Rows.Count, 2).End(xlUp).Row)
  6.     For Each E In A
  7.         M = Application.Match(E, b, 0)
  8.         MsgBox E & IIf(IsNumeric(M), "存在於 ", " 不存在於 ") & Join(b, ",")
  9.     Next
  10. End Sub
複製代碼
[attach]25656[/attach]
作者: GBKEE    時間: 2016-10-27 04:53

回復 13# greetingsfromtw
  1. '討論區網址:http://forum.twbts.com/index.php
  2. Option Explicit
  3. Sub Ex()
  4.     Dim M As Variant, A(), B()
  5.     A = Range("a2:a" & Cells(Rows.Count, 1).End(xlUp).Row)  '二維陣列
  6.     B = Range("b2:b" & Cells(Rows.Count, 2).End(xlUp).Row) '二維陣列
  7.     B = Application.WorksheetFunction.Transpose(B)                '轉至為一維陣列
  8.     For Each E In A
  9.         M = Application.Match(E, B, 0)
  10.         MsgBox E & IIf(IsNumeric(M), "存在於 ", " 不存在於 ") & Join(B, ",")
  11.         'Join 函數 傳回一個字串,該字串是透過連結某個陣列中的多個子字串而建立的。
  12.         '******** 某個陣列 ,必須是一維陣列********************
  13.     Next
  14. End Sub
複製代碼

作者: greetingsfromtw    時間: 2016-10-27 14:04

回復 14# GBKEE

非常感謝GBKEE前輩詳細解說,
原來問題出在一維陣列,小弟再研究看看.
作者: ssooi    時間: 2020-8-12 16:16

回復 3# chin15
  1. a = Array("一", "五", "八")
  2.    b = Array("一", "二", "三", "四", "五", "六")
  3. For i = 0 To UBound(a)
  4. If UBound(Filter(b, a(i))) = -1 Then
  5. MsgBox "不 包含" & a(i)
  6. Else
  7. MsgBox "包含" & a(i)
  8. End If
  9. Next
複製代碼
請問該怎麼樣做才能進一步顯示A是存在B陣列的第幾個索引值呢?
謝謝
作者: 軒云熊    時間: 2020-8-12 20:00

本帖最後由 軒云熊 於 2020-8-12 20:10 編輯

這樣好像也可以
  1. Sub 練習顯示陣列位置()

  2. Dim A, B, i, k

  3. A = Array("一", "五", "八")
  4. B = Array("一", "二", "三", "四", "五", "六")

  5.     For i = 0 To UBound(B)
  6.         If A(k) = B(i) Then
  7.            MsgBox " A的 " & A(k) & " 在 B 的 第 " & i & " 個"
  8.            If k <= UBound(A) Then k = k + 1
  9.         Else
  10.            MsgBox " B 的 第 " & i & " 個" & " 是 " & B(i)
  11.         End If
  12.     Next i
  13.    
  14. End Sub
複製代碼

作者: 准提部林    時間: 2020-8-13 10:16

回復 16# ssooi


可以使用 APPLICATION.MATCH
陣列數量大  字典--ITEM記錄位置




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