返回列表 上一主題 發帖

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

回復 10# Andy2483


   VBA執行上,快很多~ 超專業...

TOP

回復 10# Andy2483


     請教有D欄位 /F欄位 /G欄位 /W欄位 個有搜尋相關文字和對應,要如何改寫呢 ?

TOP

回復 12# jackyliu


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


關鍵字工作表


結果:

TOP

回復 13# Andy2483


    若 籤文(A欄位) 增加 籤文(D欄位) /籤文(G欄位)  搜尋文字後對應關鍵字,可以改嗎?
另外 可以對程式Code 說明一下嗎?(每行註解一下) 謝謝~

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

回復 1# jackyliu
  1. Sub test()
  2.     For uu = 3 To 工作表1.Range("a3").CurrentRegion.Rows.Count
  3.         工作表2.Cells(uu, 1) = 工作表1.Cells(uu, 1)
  4.         工作表2.Cells(uu, 2) = 工作表1.Cells(uu, 2)
  5.         
  6.          If (InStr(1, 工作表2.Cells(uu, 1), "ABC") >= 1) Then
  7.             工作表2.Cells(uu, 4) = "上簽"
  8.          End If
  9.         
  10.          If (InStr(1, 工作表2.Cells(uu, 1), "A") >= 1) And (InStr(1, 工作表2.Cells(uu, 1), "D") >= 1) And (InStr(1, 工作表2.Cells(uu, 1), "E") >= 1) And (InStr(1, 工作表2.Cells(uu, 1), "D") >= 1) Then
  11.             工作表2.Cells(uu, 4) = "下簽"
  12.          End If
  13.          If 工作表2.Cells(uu, 1) <> "" And 工作表2.Cells(uu, 4) = "" Then
  14.             工作表2.Cells(uu, 4) = "略"
  15.          End If
  16.          
  17.         If 工作表2.Cells(uu, 1) <> "" Then
  18.             If uu = 3 Then
  19.                 工作表2.Cells(uu, 3) = DateAdd("n", 90, 工作表2.Cells(uu - 1, 3))
  20.                 工作表2.Cells(uu, 3).Select
  21.                 Selection.NumberFormatLocal = "hh:mm"
  22.             End If
  23.             If uu > 3 Then
  24.                 工作表2.Cells(uu, 3) = DateAdd("h", 8, 工作表2.Cells(uu - 1, 3))
  25.                 作表2.Cells(uu, 3).Select
  26.                 Selection.NumberFormatLocal = "hh:mm"
  27.             End If
  28.         End If
  29.             If 工作表2.Cells(uu, 1) = "" Then End
  30.     Next
  31.    
  32.    
  33.     工作表2.Cells(2, 4) = ""
  34. End Sub
複製代碼

  多做多想多學習,少看少錯少迷途

  多做=多多練習,多多編寫。
  多想=想想為什麼人家程式要那樣寫,如果換成自己,又會怎寫。
  多學習=學習人家的發問並解答,學習人家的寫法

  少看=只看不做也枉然

TOP

回復 5# 准提部林


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

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

TOP

        靜思自在 : 待人退一步,愛人寬一寸,就會活得很快樂。
返回列表 上一主題