Board logo

標題: 不用迴圈,不用Worksheet函數(match等),判斷某element在是否陣列中 [打印本頁]

作者: sunnyso    時間: 2013-6-30 23:02     標題: 不用迴圈,不用Worksheet函數(match等),判斷某element在是否陣列中

例如
  1. Sub ss_test1()
  2.     alltype = Array("A類", "B類", "C類", "D類", "E類", "F類", "G類", "H類", "I類", "J類")
  3.     aj = "1D類"
  4.     If UBound(Filter(alltype, aj)) < 0 Then Debug.Print "Empty"
  5.     Stop
  6. End Sub
複製代碼

作者: sunnyso    時間: 2013-6-30 23:11

回復 1# sunnyso

判斷該element在陣列中位置
Debug.Print UBound(Split(Split(Join(alltype, "|"), aj)(0), "|")) + 1
  1.     If UBound(Filter(alltype, aj)) < 0 Then
  2.         Debug.Print "Empty"
  3.     Else
  4.         Debug.Print UBound(Split(Split(Join(alltype, "|"), aj)(0), "|")) + 1
  5.     End If
複製代碼

作者: sunnyso    時間: 2013-7-1 00:01

回復  sunnyso

判斷該element在陣列中位置
Debug.Print UBound(Split(Split(Join(alltype, "|"), aj)( ...
sunnyso 發表於 2013-6-30 23:11


樓上有bug,改爲
  1.     If UBound(Filter(alltype, aj)) < 0 Then
  2.         Debug.Print "Empty"
  3.     Else
  4.         Debug.Print UBound(Split(Split(“ ” & Join(alltype, "|"), aj)(0), "|"))
  5.     End If
複製代碼

作者: GBKEE    時間: 2013-7-1 08:21

本帖最後由 GBKEE 於 2013-7-1 10:02 編輯

回復 3# sunnyso
判斷完全等於該element在陣列中位置
  1. Sub Ex()
  2.     Dim S As String, alltype(), Aj As String, Ar  As String
  3.     S = ","                           '輔助字串
  4.     alltype = Array("A類", "B類", "DEC類", "EC類", "C類", "F類", "G類", "H類", "I類", "J類")
  5.     Aj = S & "C類" & S
  6.     Ar = S & Join(alltype, S) & S
  7.     If InStr(Ar, Aj) = 0 Then
  8.         Debug.Print "Empty"
  9.     Else
  10.        Ar = Split(Ar, Aj)(0)
  11.        Debug.Print IIf(UBound(Split(Ar, S)) < 0, 0, UBound(Split(Ar, S)))
  12.     End If
  13. End Sub
複製代碼

作者: sunnyso    時間: 2013-7-1 09:36

本帖最後由 sunnyso 於 2013-7-1 09:41 編輯

回復 4# GBKEE


版大你的code有bug,跟我第一次的code(2樓)一樣的bug。就是第一element(即: "A類") 回傳 -1
應該像我3樓的改動(或者看我另一帖子)才可以,在Join 後的 AllType前面加上一個任意非 S(輔助字串)的字串,例如“<space>", 不然第一個emement會回傳-1, 還有在Join 後的 AllType後面並不需要串輔助字串

改動後如下
  1. Sub ss_teswt()
  2.     alltype = Array("A類", "B類", "C類", "D類", "E類", "F類", "G類", "H類", "I類", "J類")
  3.     Aj = "J類"
  4.     If UBound(Filter(alltype, Aj)) < 0 Then
  5.         Debug.Print "Empty"
  6.     Else
  7.         Debug.Print UBound(Split(Split(" " & Join(alltype, "|"), Aj)(0), "|"))
  8.     End If
  9.     'Stop
  10. End Sub
複製代碼

作者: GBKEE    時間: 2013-7-1 10:04

本帖最後由 GBKEE 於 2013-7-1 10:09 編輯

回復 5# sunnyso
謝謝指正有錯當改 , 4#已修正.

可是如這樣還是有bug 找到 "JJ類"
  1. Sub ss_teswt()
  2.     alltype = Array("A類", "B類", "C類", "D類", "JJ類", "F類", "G類", "H類", "I類", "J類")
  3.     Aj = "J類"
  4.     If UBound(Filter(alltype, Aj)) < 0 Then
  5.         Debug.Print "Empty"
  6.     Else
  7.         Debug.Print UBound(Split(Split(" " & Join(alltype, "|"), Aj)(0), "|"))
  8.     End If
  9.     'Stop
  10. End Sub
複製代碼

作者: sunnyso    時間: 2013-7-1 10:21

回復 6# GBKEE

的確,再想想有沒有更好的方法
作者: sunnyso    時間: 2013-7-1 10:44

回復 4# GBKEE

這樣可以少一IF判斷
  1. Sub Ex()
  2.     Dim S As String, alltype(), Aj As String, Ar  As String
  3.     S = ","                           '輔助字串
  4.     alltype = Array("DA類", "B類", "DEC類", "EC類", "C類", "F類", "G類", "H類", "I類", "J類")
  5.     Aj = S & "DA類" & S
  6.     Ar = " " & S & Join(alltype, S)
  7.     If InStr(Ar, Aj) = 0 Then
  8.         Debug.Print "Empty"
  9.     Else
  10.        Ar = Split(Ar, Aj)(0)
  11.        Debug.Print UBound(Split(Ar, S))
  12.     End If
  13. End Sub
複製代碼

作者: GBKEE    時間: 2013-7-1 10:51

回復 8# sunnyso
在此討論區就是要有如此的交流精神,謝謝你
作者: sunnyso    時間: 2013-7-1 11:26

回復 9# GBKEE

6樓的code適合以關鍵字來判斷element的位置
作者: a5007185    時間: 2017-9-15 12:23

回復 8# sunnyso

雖然這個討論串歷史已久,(4年前...
但仍然對我有很大的幫助,
謝謝各位先進的幫助!

但 05. 中 「Aj = S & "DA類" & S」有點小疑問,
若此時搜尋對象變成J類的時候,
便會無法找到,
原因在於,
Aj 經 05. 處理後,變成「,J類,」
但 Ar 字串在 06. 處理後,變成「 ,DA類,B類,DEC類,EC類,C類,F類,G類,H類,I類,J類」
此時用InStr(Ar, Aj),絕對會等於 0

試問,
05. 中,後面的&S原本立意為何?
是不是利用兩個","來決定字串的頭與尾?
若是如此,如果在「Ar = " " & S & Join(alltype, S)」後面追加 & S,會更完美?:P

最後,還是感謝各位大大,
居然可以活用Join再配合InStr達到判定是否存在的目的,
最後再連續利用Split並配合UBound來指出該項目的位置,
實在厲害!XD




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