返回列表 上一主題 發帖

[發問] 欄位內容包含ABC文字判斷

本帖最後由 Andy2483 於 2022-9-19 10:07 編輯

回復 1# jackyliu


    謝謝前輩發表此主題
VBA方式供參考
後學今天捨近求遠
1.練習變數名參數化
2.更親近字典

後學很想學習不一樣的技巧! 先謝謝各位前輩幫訂正錯誤並再指導!
  1. Option Explicit
  2. Sub 欄位內容包含ABC文字判斷()
  3. 'B欄輸入時數,C欄呈現累加後時間
  4. 'A欄包含ABC,在D欄="上簽"
  5. 'A欄包含ADEM,在D欄="下簽"
  6. 'A欄不包含ABC且不包含ADEM,在D欄="略過"
  7. 'A欄包含ABC且包含ADEM,在D欄="上簽+下簽"
  8. Dim Arr, i, Y, Z(1 To 3)
  9. Set Y = CreateObject("Scripting.Dictionary")
  10. Y = Array("上簽", "下簽", "略過")
  11. Arr = [A2].CurrentRegion
  12. For i = 2 To UBound(Arr)
  13.    Z(1) = Arr(i, 2) / 24 + Arr(i - 1, 3)
  14.    Z(2) = InStr(Arr(i, 1), "ABC")
  15.    Z(3) = InStr(Arr(i, 1), "ADEM")
  16.    Arr(i, 3) = IIf(Arr(i, 2), Z(1), "")
  17.    If Z(2) <> 0 And Z(3) <> 0 Then
  18.       Arr(i, 4) = Y(0) & "+" & Y(1)
  19.       ElseIf Z(2) = 0 And Z(3) = 0 Then
  20.          Arr(i, 4) = Y(2)
  21.       ElseIf Z(3) = 0 Then
  22.          Arr(i, 4) = Y(0)
  23.       Else
  24.          Arr(i, 4) = Y(1)
  25.    End If
  26. Next
  27. [A2].Resize(UBound(Arr), UBound(Arr, 2)) = Arr
  28. End Sub
複製代碼

TOP

回復 6# jackyliu


    謝謝前輩
今日習得
iferror() , LOOKUP() , SEARCH()
模擬情境練習陣列&字典
VBA方式供參考

判斷TEST-20220926_1.zip (30.99 KB)



TOP

回復 12# jackyliu


    謝謝前輩回覆新需求
模擬需求情境做成範例,請前輩試試看!
今天習得 VBA多欄搜尋關鍵字帶入對應值
練習陣列與字典
判斷TEST-20221003-A.zip (36.45 KB)
原始:


關鍵字工作表


結果:

TOP

回復 14# jackyliu


    謝謝前輩再回覆
後學猜錯需求!看這次是否適合!
今田習得 多欄文字儲存格,各欄帶入各自的關鍵字搜尋到的值!
練習陣列與字典!
判斷TEST-20221004-_2.zip (40.63 KB) \
原始:


關鍵字工作表:


結果:

TOP

本帖最後由 Andy2483 於 2022-10-4 09:38 編輯

回復 14# jackyliu


    學習心得如下供前輩參考
也請各位前輩指正!謝謝各位前輩!
Option Explicit
Sub 搜尋關鍵字() '→↑←↓
Application.ScreenUpdating = False
'↑執行時螢幕畫面不要跟著變動

Dim Arr, Brr, Crr, i, x, d, xD, T, q$, f$, n, xA, s, v, SD, SS&
'↑宣告變數
T = Timer
'↑令T=現在時間

Set xA = Sheets("關鍵字").Cells
'↑xA=關鍵字的所有儲存格

Set xD = CreateObject("Scripting.Dictionary")
'↑令xD 是字典

SD = Array(, 1, 4, 7, 10, 13, 16) '@@
'↑令SD是一維陣列

For s = 1 To Columns.Count Step 2
'↑設定迴圈s從 1 到整個工作表的最後一欄,每繞回來一次s要+2

   If xA(1, s) = "" Then
   '↑當第1列的s欄是空格!
   
      GoTo 101
      '↑條件成立就跳到 101 的標示位置
      
   End If
   SS = (s + 1) / 2
   '↑令SS 是要指向 SD陣列 的位置,當s是1時SS=1,是指向上方@@的1
   '↑,當s是3時SS=3,是指向上方@@的4

   
   Arr = Range(Cells(2, SD(SS)), Cells(Rows.Count, SD(SS)).End(3))
   '↑把儲存格值倒入 Arr陣列 裡
   '↑當s是1時,Arr陣列 裡放的是[A2:A101]

   
   ReDim Crr(1 To UBound(Arr), 1 To 1)
   '↑宣告 Crr陣列的大小!縱方向是1 到(Arr陣列縱向數量),橫方向是1欄)
   
   Brr = xA.Range(xA(1, s), xA(Rows.Count, s + 1).End(3))
  '↑把儲存格值倒入 Brr陣列 裡
   '↑當s是1時,到進去的是Sheets("關鍵字").[A1:B10]

   
   xD.RemoveAll
   '↑清空xD字典
   
   For d = 2 To UBound(Brr)
   '↑設定迴圈,從2 到 Brr陣列縱向數量
   
       xD(Brr(d, 1)) = Brr(d, 2)
       '↑當d=2 字典的key="ABC",item="上上籤"
      
   Next
   For i = 1 To UBound(Arr)
   '↑設定迴圈,從1 到 Arr陣列縱向數量
   
      For Each x In xD.Keys
      '↑令x是字典裡的一分子,迴圈從字典裡的第1個key開始運用
      ',每繞回來就變成第2個key.....

      
         q = UCase(Arr(i, 1))
         '↑令q字串是Arr陣列的值(且小寫英文字母都變大寫),例如 UCase("NHjoOa")="NHJOOA"
         
         f = UCase(x)
         '↑令f字串是xD.Key(且小寫英文字母都變大寫)
         
         n = Len(x)
         '↑令n是xD.Key的字數
         
         If InStr(q, f) <> 0 Then
         '↑如果q字串裡包含了f字串,f字串在q字串的第幾個字位置,例如 InStr("ABCD", "CD")=3
         
            Crr(i, 1) = xD(x)
            '↑如果上方條件成立!就令Crr陣列裝入 key是x 的item xD(x)
            
            Cells(i + 1, SD(SS)).Characters(InStr(q, f), n).Font.ColorIndex = 3
            '↑如果上方條件成立!就把字變紅色
            
            Exit For
            '↑如果上方條件成立!就跳出 (For Each x In xD.Keys)這個迴圈
         End If
      Next
   Next
   v = Array(, 2, 5, 8, 11, 14, 17)(SS)
   '↑令v是一維陣列!是用來指定關鍵字所搜尋到的值要放哪裡
   
   Cells(2, v).Resize(UBound(Crr), 1) = Crr
   '↑當s=1時 把Crr倒入工作表[B2:B101]
   
   Cells(1, v) = Brr(1, 2)
   '↑當s=1時 [B1]="籤別"
   
Next

101
MsgBox "共耗時: " & Timer - T

Application.ScreenUpdating = True
'↑螢幕畫面恢復變動
End Sub

TOP

回復 5# 准提部林


    謝謝前輩
公式好難,陣列公式更難,後學研究了一整天,懵懵懂懂
懇請指正指導,謝謝
判斷TEST_20221216_2.zip (9.11 KB)

用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

        靜思自在 : 脾氣嘴巴不好,心地再好也不能算是好人。
返回列表 上一主題