Board logo

標題: [發問] 欄位內容包含ABC文字判斷 [打印本頁]

作者: jackyliu    時間: 2022-9-17 23:35     標題: 欄位內容包含ABC文字判斷

各位大大:


請求幫忙檔案內容判斷須如何寫,求解~

需求
1. 八點做第一筆花1.5小時,C欄位自動計算: 八點加1.5小時為09:30 ; 做第二筆花8小時自動計算:09:30加8小時為17:30 ; c欄位依序
2. 判斷A3欄位內容有包含ABC文字D3欄位顯示: 上簽   ;  判斷A3欄位內容若有包含ADED文字顯示: 下簽 ; 其餘沒有包含的D欄位顯示: 略過
作者: hcm19522    時間: 2022-9-18 10:57

https://blog.xuite.net/hcm19522/twblog/590544234
作者: jackyliu    時間: 2022-9-18 21:53

回復 2# hcm19522


hcm19522 :
之前還用 if 加上%(萬用字元) 判斷欄位內容有ABC相關文字, 一直試不出來說,  感謝 hcm19522 協助解答~
作者: Andy2483    時間: 2022-9-19 10:03

本帖最後由 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
複製代碼

作者: 准提部林    時間: 2022-9-24 16:15

=LOOKUP(,0/FIND({"","ADEM","ABC"},A3),{"略過","下簽","上簽"})
作者: jackyliu    時間: 2022-9-24 22:31

我想請問若改成用Search函數可以嗎?
找到對應的相關文字,顯示相關文字如: 上上籤 , 上中籤 , 上下籤 , 中上籤 , 中中籤 , 中下籤 , 下上籤 , 下中籤 , 下下籤 ,

改新需求:
1. 改成用Search函數
2. 改成將要找的文字統一放在某一欄位(舉例: 欄位A1:ABC   ,欄位A2:BCD   ,欄位A3:CDE   ,欄位A4:Def   ,欄位A5:efG  ,欄位A6:FGh)
3. 將找到相關文字改ABC=上上籤,  BCD=上中籤,   BCD=上下籤....
以上 更新方式, 可以做到嗎?
作者: 准提部林    時間: 2022-9-25 09:36

回復 6# jackyliu

把關鍵字放G:H欄//不分大小寫
D3公式
=iferror(LOOKUP(,0/(SEARCH(G$1:G$99,"|"&A3)>1),H:H),"")
作者: jackyliu    時間: 2022-9-25 21:37

回復 7# 准提部林


謝謝版大協助 ~
不過現在 存檔或複製電腦都會轉圈圈,會花上1~2分鐘時間,是正常現象嗎?
作者: 准提部林    時間: 2022-9-25 23:20

回復 8# jackyliu


資料多, 公式多, 卡...是正常,
要看檔案, 才知是哪部份拖慢檔案,
必要時, 只能用vba
作者: Andy2483    時間: 2022-9-26 16:17

回復 6# jackyliu


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

[attach]35237[/attach]
[attach]35238[/attach]


[attach]35239[/attach]
作者: jackyliu    時間: 2022-9-27 22:59

回復 10# Andy2483


   VBA執行上,快很多~ 超專業...
作者: jackyliu    時間: 2022-10-2 12:46

回復 10# Andy2483


     請教有D欄位 /F欄位 /G欄位 /W欄位 個有搜尋相關文字和對應,要如何改寫呢 ?
作者: Andy2483    時間: 2022-10-3 13:30

回復 12# jackyliu


    謝謝前輩回覆新需求
模擬需求情境做成範例,請前輩試試看!
今天習得 VBA多欄搜尋關鍵字帶入對應值
練習陣列與字典
[attach]35255[/attach]
原始:
[attach]35258[/attach]

關鍵字工作表
[attach]35257[/attach]

結果:
[attach]35256[/attach]
作者: jackyliu    時間: 2022-10-3 22:56

回復 13# Andy2483


    若 籤文(A欄位) 增加 籤文(D欄位) /籤文(G欄位)  搜尋文字後對應關鍵字,可以改嗎?
另外 可以對程式Code 說明一下嗎?(每行註解一下) 謝謝~
作者: Andy2483    時間: 2022-10-4 09:26

回復 14# jackyliu


    謝謝前輩再回覆
後學猜錯需求!看這次是否適合!
今田習得 多欄文字儲存格,各欄帶入各自的關鍵字搜尋到的值!
練習陣列與字典!
[attach]35259[/attach]\
原始:
[attach]35260[/attach]

關鍵字工作表:
[attach]35261[/attach]

結果:
[attach]35262[/attach]
作者: Andy2483    時間: 2022-10-4 09:32

本帖最後由 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
作者: mark15jill    時間: 2022-12-7 14:34

回復 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
複製代碼

作者: Andy2483    時間: 2022-12-16 16:29

回復 5# 准提部林


    謝謝前輩
公式好難,陣列公式更難,後學研究了一整天,懵懵懂懂
懇請指正指導,謝謝
[attach]35611[/attach]

[attach]35612[/attach]




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