返回列表 上一主題 發帖

[發問] 篩選?關鍵字?查詢?

回復 34# emma
  1. Option Explicit
  2. Private Sub Worksheet_Change(ByVal Target As Range)
  3.     Dim Target_Row As String, s As Integer, dot As Long, k As Integer, m As String
  4.     Dim Ar(), A As Range
  5.     If Target.Address(0, 0) = "E1" Then
  6.         Range("D3").AutoFilter Field:=2, Criteria1:="*" & Target & "*"
  7.     ElseIf Target.Address(0, 0) = "C1" Then
  8.         Range("C3").AutoFilter Field:=1, Criteria1:="*" & Target & "*"
  9.     End If
  10.     With Sheet1
  11.         If Application.Count(.Range("B:B")) > 0 Then
  12.             For Each A In .Range("B:B").SpecialCells(xlCellTypeConstants, 1)
  13.                 ReDim Preserve Ar(s)
  14.                 If A.Offset(, 8) = "V" And A.Offset(, 9) >= Date And A > A.Offset(, 4) Then dot = Int(A / 1000) * 1000 Else dot = 0
  15.                 k = IIf(Sheets("查詢").[B1] = "總店", 10, 11)
  16.                 If A.Offset(, 7) < Date Then
  17.                     m = "已結束"
  18.                 ElseIf A < A.Offset(, 4) Then
  19.                     m = "運費+手續費"
  20.                 ElseIf InStr(A.Offset(, 5), "推") And A > A.Offset(, 4) Then       '包含
  21.                     m = "免運"
  22.                 ElseIf InStr(A.Offset(, 5), "推") = 0 And A > A.Offset(, 4) Then   '不包含
  23.                     m = "運費"
  24.                 End If
  25.                 Ar(s) = Array(A.Offset(, 2).Value, A.Value, A.Offset(, 3).Value, dot, A.Offset(, 12).Value, A.Offset(, k).Value, m, A.Offset(, 6).Value)
  26.                 s = s + 1
  27.             Next
  28.         End If
  29.     End With
  30.     With Sheets("查詢")
  31.         If s > 0 Then
  32.             Target = ""
  33.             .Range("A" & .Rows.Count).End(xlUp).Offset(1).Resize(s, 8) = Application.Transpose(Application.Transpose(Ar))
  34.             .Range("A4").CurrentRegion.Sort key1:=.[A4], Header:=xlYes
  35.         End If
  36.     End With
  37. End Sub
複製代碼

TOP

回復 31# Hsieh


    Hsieh版大,還有一個地方想順便請教一下,就是↓這個地方可不可以改成「包含」與「不包含」的用法?但我不知道不包含的語法是什麼,所以這麼試的結果當然是跟我說語法錯誤啦 ,謝謝您!!
  1. ElseIf A.Offset(, 5) = "推" And A > A.Offset(, 4) Then
  2.          m = "免運"
  3.          ElseIf A.Offset(, 5) <> "推" And A > A.Offset(, 4) Then
複製代碼
  1. ElseIf A.Offset(, 5) Like "*推*" And A > A.Offset(, 4) Then
  2.          m = "免運"
  3.          ElseIf A.Offset(, 5) Not Like "*推*" And A > A.Offset(, 4) Then
複製代碼

TOP

謝謝分享
感覺好多要學的喔
大大們都太強了

TOP

回復 31# Hsieh


    非常感謝Hsieh版大、GBKEE版大,得二位高手的協助,我已綜合出我想要的版本了,
    Hsieh版大,其實我也只是照使用者想要的功能去研究,是希望使用者在輸入數量時,能簡化人員用人工判斷的條件,以減少人工判斷的錯誤,所以就...成了這樣的工作表了。

PS.我想要再請教一個問題,能不能讓使用者在輸入完數量,將該筆數量寫至【查詢】工作表,就立即清空該儲存格?例如在B3輸入完1234離開後,將B3列資料帶入【查詢】工作表裡,再立即將B3的儲存格清空!!有這種方法嗎?

附上最後完成的練習範本,或許版大們可以更理解我問PS.的方法用意
VBAtest9.rar (36.62 KB)

TOP

回復 30# emma

我覺得妳的需求不像是查詢資料
比較像是把資料檔工作表B欄有數値的列
經過處理後寫入查詢工作表
試試附件
VBAtest7.rar (17.2 KB)
學海無涯_不恥下問

TOP

回復 28# Hsieh

Hsieh版大,不好意思,恕小的愚笨,我試了一整天才試出關於活動狀態的部份而以,所以只好再求救一下,
此方法把程式寫在【查詢】的「店別」欄位裡,所以只有在變動到「店別」的欄位時才能更新到【查詢】的內容,
所以如果想讓使用者在【資料檔】一變更數量欄位時就可以更新至【查詢】工作表的話,應該要如何設定才好呢?
目前的工作表不是不能使用,但是使用上有二個問題
一是必需將【資料檔】裡的數量欄位先清除掉,重新只key入想新增的數量,再至【查詢】工作表選擇店別,就可以順利新增,
但如果沒有全部清除的話,資料會混在一起分不清「儲位」是哪個店別的「儲位」,希望您能明白我在敘述什麼,殘念的希望週末回來後,
能再有所精進,祝您週末愉快^^
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2. Dim Ar(), A As Range
  3. If Target.Address <> "$B$1" Then Exit Sub
  4. If Application.CountA(Range([A5], Cells(Rows.Count, 1))) > 0 Then
  5.    For Each A In Range([A5], Cells(Rows.Count, 1).End(xlUp))
  6.       ReDim Preserve Ar(s)
  7.       Ar(s) = Application.Transpose(Application.Transpose(A.Resize(, 8)))
  8.       s = s + 1
  9.     Next
  10. End If
  11.    
  12. With Sheet1
  13. If Application.Count(.Range("B:B")) > 0 Then
  14.    For Each A In .Range("B:B").SpecialCells(xlCellTypeConstants, 1)
  15.    ReDim Preserve Ar(s)
  16.    If A.Offset(, 8) = "V" And (A.Offset(, 9) > Date Or A.Offset(, 9) = "") And A > A.Offset(, 4) Then dot = Int(A / 1000) * 1000 Else dot = 0
  17.    k = IIf(Target = "總店", 10, 11)
  18.       If A.Offset(, 7) >= Date Then
  19.       If A < A.Offset(, 4) Then
  20.          m = "運費+手續費"
  21.          ElseIf A.Offset(, 5) = "推" And A > A.Offset(, 4) Then
  22.          m = "免運"
  23.          ElseIf A.Offset(, 5) <> "推" And A > A.Offset(, 4) Then
  24.          m = "運費"
  25.       End If
  26.    Else
  27.    m = "已結束"
  28.    End If
  29.    Ar(s) = Array(A.Offset(, 2).Value, A.Value, A.Offset(, 3).Value, dot, A.Offset(, 12).Value, A.Offset(, k).Value, m, A.Offset(, 6).Value)
  30.    s = s + 1
  31. Next
  32. End If
  33. End With
  34. If s > 0 Then [A5].Resize(s, 8) = Application.Transpose(Application.Transpose(Ar))
  35. Range("A4").CurrentRegion.Sort key1:=[A4], Header:=xlYes
  36. End Sub
複製代碼

TOP

回復 28# Hsieh

是的,謝謝Hsieh版大,大致上是這樣的效果,但是初步使用我想如果有二個地方可以調整一下的話會更好
1.工作表有【分店】與【總店】共通查詢使用,但大部份使用的人員只會只查自己所在的點,所以如果是【總店】應該就會固定查詢【總店】
在【資料檔】輸入數量後必需至【查詢】再點選「店別」的欄位才會帶出資料,可以先依預設的「店別」直接帶出資料嗎?
而且只要切換一次「店別」就會將【資料檔】所有輸入數量的欄位再帶進【查詢】一次(如圖一至圖三)

2.活動狀態少了判斷【最後預購日】這個條件,如果今天的日期大於【最後預購日】就顯示「已結束」提醒使用者此筆商品無法被購買。




↓以此圖為例,除了【欣錩】以外,其他筆的活動狀況如果可以設為已結束的話就更好了。


當然,我也會自己努力試試怎麼完成自己想要的效果,謝謝Hsieh版大的幫忙^^

TOP

回復 27# emma
是不是這樣效果?
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2. Dim Ar(), A As Range
  3. If Target.Address <> "$B$1" Then Exit Sub
  4. If Application.CountA(Range([A5], Cells(Rows.Count, 1))) > 0 Then
  5.    For Each A In Range([A5], Cells(Rows.Count, 1).End(xlUp))
  6.       ReDim Preserve Ar(s)
  7.       Ar(s) = Application.Transpose(Application.Transpose(A.Resize(, 8)))
  8.       s = s + 1
  9.     Next
  10. End If
  11.    
  12. With Sheet1
  13. If Application.Count(.Range("B:B")) > 0 Then
  14.    For Each A In .Range("B:B").SpecialCells(xlCellTypeConstants, 1)
  15.    ReDim Preserve Ar(s)
  16.    If A.Offset(, 8) = "V" And (A.Offset(, 9) > Date Or A.Offset(, 9) = "") And A > A.Offset(, 4) Then dot = Int(A / 1000) * 1000 Else dot = 0
  17.    k = IIf(Target = "總店", 10, 11)
  18.       If A < A.Offset(, 4) Then
  19.          m = "運費+手續費"
  20.          ElseIf A.Offset(, 5) = "推" And A > A.Offset(, 4) Then
  21.          m = "免運"
  22.          ElseIf A.Offset(, 5) <> "推" And A > A.Offset(, 4) Then
  23.          m = "運費"
  24.       End If
  25.    Ar(s) = Array(A.Offset(, 2).Value, A.Value, A.Offset(, 3).Value, dot, A.Offset(, 12).Value, A.Offset(, k).Value, m, A.Offset(, 6).Value)
  26.    s = s + 1
  27.    Next
  28. End If
  29. End With
  30. If s > 0 Then [A5].Resize(s, 8) = Application.Transpose(Application.Transpose(Ar))
  31. Range("A4").CurrentRegion.Sort key1:=[A4], Header:=xlYes
  32. End Sub
複製代碼
VBAtest7.rar (19.28 KB)
學海無涯_不恥下問

TOP

回復 25# GBKEE

對不起,更正一下 關於「活動狀態」的說明
     1.如果數量小於【基本量】就是要收取「運費」+「手續費」
     2.如果數量大於【基本量】但是【主推商品】欄位沒有「推」字的話,只要收取「運費」
     3.如果數量大於【基本量】但是【主推商品】欄位且有「推」字的話,就「免運」
     ps.當【最後預購日】(例101/11/15不含當天),也就是今天的【最後預購日期】如果是101/11/14(含)之前的話,就直接顯示「已結束」


補充說明「累積點數」的判斷
1.【點數累積】欄位為「V」且【最後預購日】(例101/11/15含當天),就計算累積點數,累積點數是以1000為單位,小於1000就沒有累積,例如1000~1999算累積1000、2000~2999算累積2000,以此類推。
2.如果沒有完全符合上述的條件,例如【點數累積】欄位為「V」且【最後預購日】為101/11/14(今天以前)、【點數累積】欄位為「X」、數量小於1000,這些的點數就不用去計算了。

  謝謝GBKEE版大的幫忙^^

TOP

回復 25# GBKEE


    GBKEE版大,謝謝您^^,test2已正常~~~
    「宏全」會有二筆是因為,宏全可以有多筆不同的「數量」,使用者每輸入一次就會帶一筆到【查詢】裡,這也是我研究test2的原因
     累積點數的判斷是產品有分為「有點數累積」跟「沒有點數累積」的所以才在資料檔中建一欄位為【點數累積】,【點數累積】欄位為「V」就是「有點數累積」,【點數累積】欄位為「X」就是沒有「沒有點數累積」,但又存在第二個判斷的條件,就是「有點數累積」的有期間限制,而且每一件產品的累積期間不同,其判斷條件就設在「點數累積結束」這個欄位,如未KEY上結束日期前(就是保留空值""),才能計算累積點數,第三個條件就是累積點數是以1000為單位,小於1000就沒有累積,例如1000~1999算累積1000、2000~2999算累積2000,以此類推。
  活動狀態是想要判斷運費是否要計算,在「資料檔」工作表中,【主推商品】欄位有「推」字的話,就可以免運,但前提是要數量有大於【基本量】欄位,如果沒有符合上述條件的話,就要加計運費,當【主推商品】欄位沒有「推」字的話,數量又小於【基本量】欄位時,除運費另計外還要再加特別處理的手續費,但是當今天(當下的日期,如101/11/15)的日期超過【最後預購日】時,就不用做這些判斷,直接顯示「已結束」,因為商品已無法下單了。

所以我還滿頭大的,不曉得這樣是否能傳達清楚,謝謝GBKEE版大的幫忙^^

TOP

        靜思自在 : 人生沒有所有權,只有生命的使用權。
返回列表 上一主題