返回列表 上一主題 發帖

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

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

請問我手邊有一筆資料
sheet1:
  A
1 ●
2 ●
3 ○
4 ○
5 ○
6 ※
7 ※
8 ※

今天我想要用個按鈕在sheet2,按下按鈕後會出現視窗,這視窗有下拉式清單,經過篩選後可以選擇A欄裡這三種不同資料

請問該怎麼下手比較好?

小弟目前在【建立按鈕】→【按下後show出視窗】→【?】

請指點方法,謝謝。

回復 1# lifedidi
表單模組
  1. Private Sub UserForm_Initialize()
  2. Set d = CreateObject("Scripting.Dictionary")
  3. With Sheet1
  4.    For Each a In .Range(.[A1], .[A1].End(xlDown))
  5.    d(a.Value) = ""
  6.    Next
  7. End With
  8. ComboBox1.List = d.keys
  9. End Sub
複製代碼
學海無涯_不恥下問

TOP

謝謝超級版主的幫忙

這筆資料為

sheet1:
  A  B
1 ● 3:05
2 ● 1:51
3 ○ 0:40
4 ○ 3:01
5 ○ 5:11
6 ※ 5:01
7 ※ 3:36
8 ※ 2:11

(*A為產品類別 B為需時)

小弟需要的流程:

【在Sheet2建立按鈕】→【按下後show出A視窗】→【下拉式清單選擇●○※之一】→【選擇●】→【點選確定】→【按下後show出B視窗】→【B視窗為兩個按鈕 1.總時間 2.平均時間】→【點選1.總時間】→【show出C視窗】→【C視窗有個ListBOX顯示出結果】

煩請大大指點,感謝。

TOP

本帖最後由 Hsieh 於 2013-2-26 14:18 編輯

回復 3# lifedidi

Sheet2模組
  1. Private Sub CommandButton1_Click()
  2.    FormA.Show 0
  3. End Sub
複製代碼
FormA模組
  1. Private Sub CommandButton1_Click()
  2. FormB.Show 0
  3. End Sub

  4. Private Sub UserForm_Initialize()
  5. Set d = CreateObject("Scripting.Dictionary")
  6. With Sheet1
  7.    For Each a In .Range(.[A2], .[A1].End(xlDown))
  8.    d(a.Value) = ""
  9.    Next
  10. End With
  11. ComboBox1.List = d.keys
  12. End Sub
複製代碼
FormB模組
  1. Private Sub CommandButton1_Click()
  2. FormC.Show 0
  3. FormC.計算 1
  4. End Sub

  5. Private Sub CommandButton2_Click()
  6. FormC.Show 0
  7. FormC.計算 2
  8. End Sub
複製代碼
FormC模組
  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 Format(Application.Sum(Ar), "hh:mm:ss")
  13. If work = 2 Then ListBox1.AddItem Format(Application.Average(Ar), "hh:mm:ss")
  14. End Sub
複製代碼
Form Test.zip (12.55 KB)
學海無涯_不恥下問

TOP

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

請教儲存格的問題:

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

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

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

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

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

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

回復 6# Hsieh

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

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

謝謝,辛苦了。

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

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

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

小弟繼續研究...

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

        靜思自在 : 閒人無樂趣,忙人無是非。
返回列表 上一主題