返回列表 上一主題 發帖

[發問] 下拉式清單裡選擇"篩選不重複的資料"

回復 13# GBKEE

抱歉,最近工作比較忙,感謝兩位大大的幫忙,清除的指令OK了:) ,但是兩條件的篩選我將程式碼貼上去還是跑不出來,

簡化了一下表單

兩個條件篩選.rar (42.34 KB)

我把問題用圖形表達,謝謝。

TOP

回復 12# lifedidi
1有辦法照順序
  1. Private Sub UserForm_Initialize()  '表單初始化的程序
  2.     Dim D As Object
  3.     Set D = CreateObject("Scripting.Dictionary")    '字典物件
  4.     With Sheet1
  5.         For Each a In .Range(.[D7], .[D7].End(xlDown))
  6.             D(a.Value) = ""
  7.         Next
  8.     End With
  9.     ComboBox1.List = D.keys       '專案選項內容
  10. End Sub
  11. Private Sub ComboBox1_Change()      '專案選項內容: 有改變
  12.     If ComboBox1.ListIndex > -1 Then
  13.         ComboBox2資料
  14.     Else                            '改變的內容不在List中
  15.         ComboBox2.Clear
  16.     End If
  17. End Sub
  18. Private Sub ComboBox2資料()
  19.     Dim D As Object
  20.     Set D = CreateObject("Scripting.Dictionary")
  21.     With Sheet1
  22.         For Each a In .Range(.[D7], .[D7].End(xlDown))
  23.             If a.Value = ComboBox1 Then D(a.Offset(, 3).Value) = ""    '
  24.         Next
  25.         With .Columns(.Columns.Count).EntireColumn           'Sheet1的最後一欄
  26.             .Clear
  27.             .Cells(1).Resize(D.Count, 1) = Application.WorksheetFunction.Transpose(D.keys)
  28.             '*** 排序
  29.             .Cells(1).Resize(D.Count, 1).Sort Key1:=.Cells(1), Order1:=xlAscending, Header:= _
  30.                     xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
  31.                     SortMethod:=xlStroke, DataOption1:=xlSortNormal
  32.             '*******
  33.             ComboBox2.List = .Cells(1).Resize(D.Count, 1).Value  '工種選項內容
  34.             ComboBox2.Value = ComboBox2.List(0)                  '工種選項的值
  35.             .Clear
  36.         End With
  37.     End With
  38. End Sub
複製代碼
2電腦不吃力
  1. Public Sub 清除()
  2.     With Sheet2
  3.         '.Cells(7, 3).Resize(999 - 7 + 1, 25 - 3 + 1) = ""
  4.         .Cells(7, 3).Resize(993, 23) = ""
  5.         'For i = 7 To 999
  6.         '    For j = 3 To 25
  7.         '   Cells(i, j) = ""
  8.         '   Next
  9.         ' Next
  10.     End With
  11. End Sub
複製代碼

TOP

回復 11# Hsieh


    感謝大大的不辭辛勞,看了你的流程感覺更順暢,我修改一下我的問題並把問題寫在excel裡,謝謝。

工時系統excel版本)20130228.rar (80.41 KB)

TOP

回復 10# lifedidi
不是很清楚你要甚麼,試試看附件流程看是否符合需求

工時系統excel版本).rar (51.31 KB)
學海無涯_不恥下問

TOP

回復 8# Hsieh


大大你好:

以下為我程式碼,小弟愚昧,請幫忙修改。

想法:
【先篩選D7以下資料】→【再篩選G7以下資料】→【兩次篩選後的資料總工時相加(並把資料貼在C7之後)】

操作:
【第一視窗:選擇資料(D7篩選)按確定】→【第二視窗:選擇資料(G7篩選)案確定】→【第三視窗:ListBox秀出總工時】 *所篩選出的資料PO在C7之後

Sub 計算(work As Integer)
Dim Ar(), Ay()
With Sheet1
   For Each a In .Range(.[D7], .[D7].End(xlDown))
      If a.Value = 工種查詢x專案編號.ComboBox1.Value Then
         ReDim Preserve Ar(s)
         ReDim Preserve Ay(s)
         Ar(s) = a.Offset(, 14).Value
         Ay(s) = a.Offset(, -3).Resize(, 23).Value
         s = s + 1
      End If
   Next
   For Each a In .Range(.[G7], .[G7].End(xlDown))
      If a.Value = 工種查詢x專案x選擇工種.ComboBox1.Value Then
         ReDim Preserve Ar(x)
         ReDim Preserve Ay(x)
         Ar(x) = a.Offset(, 11).Value
         Ay(x) = a.Offset(, -6).Resize(, 23).Value
         x = x + 1
      End If
   Next
        
End With
If s > 0 Then
Sheet2.Range("C5").CurrentRegion.Offset(2) = ""
Sheet2.[C7].Resize(x, 23) = Application.Transpose(Application.Transpose(Ay))
If work = 1 Then ListBox1.AddItem Application.Text(Application.Sum(Ar), "[hh]:mm:ss")
End If
End Sub

TOP

非常謝謝Hsieh大大,照你的做法在show後面加0 就可以順利完成。

小弟想以此類推其他部分,可以解釋變數的部分嗎?謝謝!

小弟繼續研究...

TOP

本帖最後由 Hsieh 於 2013-2-27 19:01 編輯

回復 7# lifedidi
首先先把所有Form.Show的參數加上0
Form.Show 0
讓開啟的表單都為非強制回應
  1. Sub 計算(work As Integer)
  2. Dim Ar(), Ay()
  3. With Sheet1
  4.    For Each a In .Range(.[D7], .[D7].End(xlDown))  '在D欄的資料循環
  5.       If a.Value = 專案編號.ComboBox1.Value Then   '如果D欄的值等於下拉選單的值
  6.          ReDim Preserve Ar(s)  '保留陣列元素並重設陣列上限
  7.          ReDim Preserve Ay(s)
  8.          Ar(s) = a.Offset(, 17).Value  '將D欄向右17欄的值寫入陣列
  9.          Ay(s) = a.Offset(, -3).Resize(, 26).Value  '將A:Z欄的值寫入陣列
  10.          s = s + 1  '預備下次陣列擴展的上限
  11.       End If
  12.    Next
  13. End With
  14. If s > 0 Then  '如果有符合的資料
  15. Sheet2.Range("C5").CurrentRegion.Offset(2) = ""   '先清空上次的查詢內容
  16. Sheet2.[C7].Resize(s, 26) = Application.Transpose(Application.Transpose(Ay))   '寫入工作表
  17. If work = 1 Then ListBox1.AddItem Application.Text(Application.Sum(Ar), "[hh]:mm:ss")  '文字方塊顯示加總結果
  18. If work = 2 Then ListBox1.AddItem Application.Text(Application.Average(Ar), "[hh]:mm:ss")  '文字方塊顯示平均結果
  19. End If
  20. End Sub
複製代碼
學海無涯_不恥下問

TOP

回復 6# Hsieh

大大,請麻煩幫忙看一下哪裡有問題,

工時系統excel版本).rar (69.61 KB)

謝謝,辛苦了。

TOP

回復 5# lifedidi
你是要在LISTBOX內顯示或是儲存格內顯示?
LISTBOX內要顯示超過24小時加總時間
  1. Sub 計算(work As Integer)
  2. Dim Ar()
  3. With Sheet1
  4.    For Each a In .Range(.[A2], .[A1].End(xlDown))
  5.       If a.Value = FormA.ComboBox1.Value Then
  6.          ReDim Preserve Ar(s)
  7.          Ar(s) = a.Offset(, 1).Value
  8.          s = s + 1
  9.       End If
  10.    Next
  11. End With
  12. If work = 1 Then ListBox1.AddItem Application.Text(Application.Sum(Ar), "[hh]:mm:ss")
  13. If work = 2 Then ListBox1.AddItem Application.Text(Application.Average(Ar), "[hh]:mm:ss")
  14. End Sub
複製代碼
若儲存格格式則自訂為[hh]:mm
學海無涯_不恥下問

TOP

謝謝超級版主的幫忙!小弟公式還在吸收中。

請教儲存格的問題:

B欄為小時:分 (ex: 03:50 為 3小時50分鐘)

我的儲存格式該用哪一種型式?小弟目前用"自訂"mm:hh

run起來怪怪的,顯示不出來,

小弟手上的資料大約估計加總後為幾百個小時,

對應的格式該怎麼設定呢?麻煩了。

TOP

        靜思自在 : 太陽光大、父母恩大、君子量大,小人氣大。
返回列表 上一主題