Board logo

標題: [發問] 下拉式清單裡選擇"篩選不重複的資料" [打印本頁]

作者: lifedidi    時間: 2013-2-26 10:09     標題: 下拉式清單裡選擇"篩選不重複的資料"

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

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

請問該怎麼下手比較好?

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

請指點方法,謝謝。
作者: Hsieh    時間: 2013-2-26 11:18

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

作者: lifedidi    時間: 2013-2-26 13:15

謝謝超級版主的幫忙

這筆資料為

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顯示出結果】

煩請大大指點,感謝。
作者: Hsieh    時間: 2013-2-26 14:17

本帖最後由 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
複製代碼
[attach]14252[/attach]
作者: lifedidi    時間: 2013-2-26 15:39

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

請教儲存格的問題:

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

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

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

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

對應的格式該怎麼設定呢?麻煩了。
作者: Hsieh    時間: 2013-2-26 16:02

回復 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
作者: lifedidi    時間: 2013-2-26 17:25

回復 6# Hsieh

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

[attach]14254[/attach]

謝謝,辛苦了。
作者: Hsieh    時間: 2013-2-26 23:05

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

作者: lifedidi    時間: 2013-2-27 09:44

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

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

小弟繼續研究...
作者: lifedidi    時間: 2013-2-27 21:59

回復 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
作者: Hsieh    時間: 2013-2-27 23:24

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

[attach]14267[/attach]
作者: lifedidi    時間: 2013-2-28 13:00

回復 11# Hsieh


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

[attach]14271[/attach]
作者: GBKEE    時間: 2013-2-28 16:57

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

作者: lifedidi    時間: 2013-3-2 17:59

回復 13# GBKEE

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

簡化了一下表單

[attach]14286[/attach]

我把問題用圖形表達,謝謝。
作者: GBKEE    時間: 2013-3-2 21:12

回復 14# lifedidi
附檔中UserForm1的程式碼
  1. Private Sub UserForm_Initialize()                   '表單初始化的程序
  2.     Dim D As Object
  3.     Set D = CreateObject("Scripting.Dictionary")    '字典物件
  4.     Sheet2.Range("b1").CurrentRegion.Offset(1) = "" '先清除舊資料
  5.     With Sheet1
  6.         .AutoFilterMode = False                     '取消自動篩選模式
  7.         For Each A In .Range(.[A2], .[A2].End(xlDown))
  8.             D(A.Value) = ""
  9.         Next
  10.         ComboBox1.List = D.KEYS                     '專案選項內容
  11.     End With
  12. End Sub
  13. Private Sub ComboBox1_Change()                      '專案選項內容: 有改變
  14.      With Sheet1
  15.         .AutoFilterMode = False
  16.         If ComboBox1.ListIndex > -1 Then
  17.             ComboBox2資料
  18.             .Range("a1").AutoFilter 1, ComboBox1    '自動篩選模式:第1欄的篩選準則為 ComboBox1的值
  19.         Else                                        '改變的內容不在List中
  20.             .Range("a1").AutoFilter 1, "<>"         '自動篩選模式:第1欄的篩選準則為不是空白欄
  21.             ComboBox2.Clear
  22.         End If
  23.         資料複製
  24.     End With
  25. End Sub
  26. Private Sub ComboBox2_Change()                      '專案選項內容: 有改變
  27.     If ComboBox2.ListIndex > -1 Then
  28.         Sheet1.Range("a1").AutoFilter 2, ComboBox2  '自動篩選模式:第2欄的篩選準則為 ComboBox2的值
  29.     Else
  30.         Sheet1.Range("a1").AutoFilter 2, "<>"       '自動篩選模式:第2欄的篩選準則為不是空白欄
  31.     End If
  32.     資料複製
  33. End Sub
  34. Private Sub ComboBox2資料()
  35.     Dim D As Object, A
  36.     Set D = CreateObject("Scripting.Dictionary")
  37.     With Sheet1
  38.         For Each A In .Range(.[A2], .[A2].End(xlDown))
  39.             If A.Value = ComboBox1 Then D(A.Offset(, 1).Value) = ""
  40.         Next
  41.         If D.Count > 1 Then
  42.             With .Columns(.Columns.Count).EntireColumn           'Sheet1的最後一欄
  43.                 .Clear
  44.                 .Cells(1).Resize(D.Count, 1).Value = Application.WorksheetFunction.Transpose(D.KEYS)
  45.                 '*** 排序
  46.                 .Cells(1).Resize(D.Count, 1).Sort Key1:=.Cells(1), Order1:=xlAscending, Header:= _
  47.                     xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
  48.                     SortMethod:=xlStroke, DataOption1:=xlSortNormal
  49.                 '*******
  50.                 ComboBox2.List = .Cells(1).Resize(D.Count, 1).Value  '工種選項內容
  51.                 .Clear
  52.             End With
  53.         Else
  54.             A = D.KEYS
  55.             ComboBox2.AddItem A(0)
  56.         End If
  57.             ComboBox2.Value = ComboBox2.List(0)                  '工種選項的值
  58.     End With
  59. End Sub
  60. Private Sub 資料複製()
  61.     Dim Rng As Range
  62.     Sheet2.Range("b1").CurrentRegion = ""             '先清除舊資料
  63.     Sheet1.Range("a1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy Sheet2.Range("b1")
  64.     '複製:'自動篩選出的資料
  65. End Sub
  66. Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  67.     Sheet1.AutoFilterMode = False      '表單關閉前取消自動篩選模式
  68. End Sub
複製代碼

作者: lifedidi    時間: 2013-3-11 22:57

回復 15# GBKEE


小弟這幾天在研究VBA,首先感謝兩位大大的程式碼,

對VBA也有些眉目了,不過很傷精神就對了...目前兩條件篩選OK了,

現在我把工時加總套用上去,發生了問題,也稍做些修改還是不行

希望大大能幫小弟解惑,感恩不盡。

問題在附件裡,小弟盡量表達我的問題所在,謝謝。

[attach]14336[/attach]
作者: GBKEE    時間: 2013-3-12 08:44

本帖最後由 GBKEE 於 2013-3-12 08:49 編輯

回復 16# lifedidi
  1. Dim 資料表 As Worksheet  '***設定資料工作表 供表單中的程序共同使用 ***
  2. Dim 查詢表 As Worksheet  '***設定資料工作表 供表單中的程序共同使用 ***
  3. Private Sub UserForm_Initialize()  '表單初始化的程序
  4.     Dim D As Object
  5.     Set D = CreateObject("Scripting.Dictionary")    '字典物件
  6.     Set 資料表 = Sheet1      ' 資料工作表 或 查詢工作表 的工作表 如有變動時
  7.     Set 查詢表 = Sheet2      ' 在此修改:不必去所有程式碼中一一修改工作表名稱
  8.     With 資料表
  9.         .AutoFilterMode = False
  10.         For Each a In .Range(.[A2], .[A2].End(xlDown))
  11.             D(a.Value) = ""
  12.         Next
  13.     End With
  14.     ComboBox1.List = D.keys       '專案選項內容
  15. End Sub
  16. Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  17.         '表單關閉的程序
  18.         資料表.AutoFilterMode = False                             '取消自動篩選
  19.         查詢表.UsedRange.Offset(1) = ""
  20. End Sub
  21. Private Sub CommandButton1_Click()
  22.     '*** UserForm2 的ListBox1 改成 TextBox 控制項             *****
  23.     With UserForm2
  24.         .TextBox1 = Application.Text(Application.Sum(查詢表.[D:D]), "[hh]:mm")
  25.         .Show 0
  26.     End With
  27. End Sub
  28. Private Sub ComboBox1_Change()      '專案選項內容: 有改變
  29.     If ComboBox1.ListIndex > -1 Then
  30.         ComboBox2資料
  31.     Else                            '改變的內容不在List中
  32.         ComboBox2.Clear
  33.     End If
  34.     Show_資料
  35. End Sub
  36. Private Sub ComboBox2_Change()      '專案選項內容: 有改變
  37.     Show_資料
  38. End Sub
  39. Private Sub ComboBox2資料()
  40.     Dim D As Object
  41.     Set D = CreateObject("Scripting.Dictionary")
  42.     With 資料表
  43.         .AutoFilterMode = False
  44.         For Each a In .Range(.[A2], .[A2].End(xlDown))
  45.             If a.Value = ComboBox1 Then D(a.Offset(, 1).Value) = ""    '
  46.         Next
  47.         With .Columns(.Columns.Count).EntireColumn           'Sheet1的最後一欄
  48.             .Clear
  49.             .Cells(1).Resize(D.Count, 1) = Application.WorksheetFunction.Transpose(D.keys)
  50.             '*** 排序
  51.             .Cells(1).Resize(D.Count, 1).Sort Key1:=.Cells(1), Order1:=xlAscending, Header:= _
  52.                     xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
  53.                     SortMethod:=xlStroke, DataOption1:=xlSortNormal
  54.             '*******
  55.             ComboBox2.List = .Cells(1).Resize(D.Count, 1).Value  '工種選項內容
  56.             ComboBox2.Value = ComboBox2.List(0)                  '工種選項的值
  57.             .Clear
  58.         End With
  59.     End With
  60. End Sub
  61. Private Sub Show_資料()
  62.     UserForm2.TextBox1 = ""
  63.     With 資料表
  64.         .AutoFilterMode = False                             '取消自動篩選
  65.         If ComboBox1.ListIndex > -1 Then
  66.             .Range("A1").AutoFilter 1, ComboBox1            '自動篩選: 第一欄(A欄)的準則 為 ComboBox1
  67.             If ComboBox2.ListIndex > -1 Then
  68.                 .Range("A1").AutoFilter 2, ComboBox2        '自動篩選: 第一欄(A欄)的準則 為 ComboBox12
  69.             End If
  70.         End If
  71.         .UsedRange.Range("A:C").Copy 查詢表.[B1]            '資料表:自動篩選出的資料 複製到 查詢表
  72.     End With
  73. End Sub
複製代碼

作者: lifedidi    時間: 2013-3-12 09:16

回復 17# GBKEE


大大,

ComboBox2資料、Show_資料可以更深入解釋嗎?

我把變數套用excel檔,卡在第71列,不知道怎麼修改,感謝你!
作者: GBKEE    時間: 2013-3-12 10:14

回復 18# lifedidi
卡在第71列 可能是2007 不接受這寫法 請修改如下
  1. Private Sub ComboBox2資料()  'ComboBox1有異動:尋找 [工種]欄位的字串
  2.     Dim D As Object
  3.     Set D = CreateObject("Scripting.Dictionary")
  4.     With 資料表
  5.         .AutoFilterMode = False
  6.         For Each a In .Range(.[A2], .[A2].End(xlDown))
  7.             
  8.             If a.Value = ComboBox1 Then D(a.Offset(, 1).Value) = ""
  9.             '符合ComboBox1 的 [工種]中-> 字典物件:D(Key) -> D(工種的字串)
  10.         Next
  11.        '** 以下程式碼將 字典物件:D(Key)的字串複製在最後一欄
  12.        '** 之後加以排序然後設為 ComboBox2.List
  13.        With .Columns(.Columns.Count).EntireColumn           'Sheet1的最後一欄
  14.             .Clear
  15.             .Cells(1).Resize(D.Count, 1) = Application.WorksheetFunction.Transpose(D.keys)
  16.             '*** 排序
  17.             .Cells(1).Resize(D.Count, 1).Sort Key1:=.Cells(1), Order1:=xlAscending, Header:= _
  18.                     xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
  19.                     SortMethod:=xlStroke, DataOption1:=xlSortNormal
  20.             '*******
  21.             ComboBox2.List = .Cells(1).Resize(D.Count, 1).Value  '工種選項內容
  22.             ComboBox2.Value = ComboBox2.List(0)                  '工種選項的值
  23.             '**
  24.         End With
  25.     End With
  26. End Sub
  27. Private Sub Show_資料()    '** 資料表中 自動篩選
  28.     With 資料表
  29.         .AutoFilterMode = False        '取消自動篩選-> 資料全部顯示出來:新篩選後的資料才會正確
  30.         If ComboBox1.ListIndex > -1 Then
  31.             .Range("A1").AutoFilter 1, ComboBox1            '自動篩選: 第一欄(A欄)的準則 為 ComboBox1
  32.             If ComboBox2.ListIndex > -1 Then
  33.                 .Range("A1").AutoFilter 2, ComboBox2        '自動篩選: 第一欄(A欄)的準則 為 ComboBox12
  34.             End If
  35.         End If
  36.         '.UsedRange.Range("A:C").Copy 查詢表.[B1]
  37.         .Range("A:C").Copy 查詢表.[B1]                       '資料表:自動篩選出的資料 複製到 查詢表
  38.     End With
  39. End Sub
複製代碼

.Range("A1").AutoFilter 1, ComboBox1   如圖


[attach]14340[/attach]
作者: lifedidi    時間: 2013-3-12 10:48

第37列
.Range("A:C").Copy 查詢表.[C7]                      '資料表:自動篩選出的資料 複製到 查詢表

大大,

請問【Range("A:C")】要如何修改呢?我套用我資料表("A:R")還是偵錯。
作者: GBKEE    時間: 2013-3-12 10:57

回復 20# lifedidi
請在附上檔案 看看
作者: lifedidi    時間: 2013-3-12 11:06

回復 21# GBKEE


謝謝。

    [attach]14341[/attach]
作者: GBKEE    時間: 2013-3-12 11:21

回復 22# lifedidi
自動 或 進階 篩選 資料庫的表頭 都不適宜有合併的儲存格
作者: lifedidi    時間: 2013-3-12 14:30

謝謝大大!找出原因了^^

但是總工時的公式怎麼寫呢?

其實最重要的是工時Orz..
作者: lifedidi    時間: 2013-3-12 16:01

本帖最後由 lifedidi 於 2013-3-12 16:02 編輯

If .Parent.AutoFilterMode = False Then .AutoFilter
            .AutoFilter Field:=2, Criteria1:=ComboBox1
            For Each a In .Columns(2).Cells.SpecialCells(12)
            If a <> "" Then
            d(a.Value) = ""
            Else
            Exit For
        End If
        Next

請問大大!這程式碼的變數有哪些呢?我試了一下午還是找不出來,

【For Each a In .Columns(2).Cells.SpecialCells(12)】

這是指第二列的什麼?specialcells(12)→12指的是?

我按F8一個一個跑,都會跳過NEXT,請指教,感謝!

謝謝
作者: GBKEE    時間: 2013-3-12 16:58

回復 25# lifedidi
  1. Sub Ex()
  2.     Dim a
  3.     With [a1] '不清楚 With ????
  4.        ' .Parent (上一層的物件): 工作表
  5.         If .Parent.AutoFilterMode = False Then .AutoFilter
  6.         .AutoFilter Field:=2, Criteria1:=ComboBox1
  7.         'For Each a In .Columns(2).Cells.SpecialCells(12)
  8.         '上面 For 這裡有錯誤:直接跳到 Next 不會執行回圈
  9.         '如是 With ' [a1]->儲存格範圍 須改成如下
  10.         For Each a In .Parent.Columns(2).Cells.SpecialCells(xlCellTypeVisible)
  11.             If a <> "" Then
  12.                 d(a.Value) = ""
  13.             Else
  14.                 Exit For
  15.             End If
  16.         Next
  17.     End With
  18. End Sub
複製代碼
  1. SpecialCells 方法 傳回 Range 物件,此物件代表與指定型態及值相符合的所有儲存格。Range 物件。
  2. expression.SpecialCells(Type, Value)
  3. expression      必選。該運算式會傳回 [套用於] 清單中的其中一個物件。
  4. Type     必選的 XlCellType。要包含的儲存格。
  5. XlCellType 可以是這些 XlCellType 常數之一。
  6. xlCellTypeAllFormatConditions。  任何格式的儲存格
  7. xlCellTypeAllValidation。具有驗證準則的儲存格
  8. xlCellTypeBlanks。空儲存格
  9. xlCellTypeComments。包含註解的儲存格
  10. xlCellTypeConstants。包含常數的儲存格
  11. xlCellTypeFormulas。包含公式的儲存格
  12. xlCellTypeLastCell。已用範圍的最後一個儲存格
  13. xlCellTypeSameFormatConditions。  有相同格式的儲存格
  14. xlCellTypeSameValidation。  有相同驗證準則的儲存格
  15. xlCellTypeVisible。所有可見儲存格
複製代碼
[attach]14345[/attach]

[attach]14346[/attach]
作者: lifedidi    時間: 2013-3-12 18:07

哇賽!我了解了!謝謝大大!我繼續研究~
作者: lifedidi    時間: 2013-3-14 14:05

請問大大:
有三個textbox分別是1、2和3
1和2是key時間用,3是把2-1
舉例:textbox1 key入 08:00
             textbox2 key入 12:00
             textbox3 自動顯示 4:00  (也就是2-1)
目前寫到

Private Sub UserForm_Initialize()

Text1.Value = Format( "HH:MM:SS")
Text2.Value = Format("HH:MM:SS")
TextBox3 = Val(TextBox2) - Val(TextBox1)

End Sub

請問哪裡有錯呢?請指導!感謝你!
作者: GBKEE    時間: 2013-3-14 14:36

回復 28# lifedidi
  1. Option Explicit
  2. Private Sub UserForm_Initialize()
  3.     Dim A As Date
  4.     TextBox1.Value = "8:00"
  5.     TextBox2.Value = "12:00"
  6.     TextBox3 = Val(TextBox2) - Val(TextBox1)
  7.     'TextBox3 = Format(CDate(TextBox2) - CDate(TextBox1), "H:M")
  8.     'A = CDate(TextBox2) - CDate(TextBox1)
  9.     'TextBox3 = A
  10. End Sub
複製代碼

作者: lifedidi    時間: 2013-3-14 16:34

GBKEE大大你好:

TextBox1及TextBox2是空格給使用者keyin的

TextBox3也是為時間格式 ex: TextBox1 key入 8:20
                                                        TextBox2 key入 11:55
                                                        TextBox3 顯示出 3:35
對照圖↓
[attach]14358[/attach]

請問第七列與第八、九列的功能是一樣的嗎?

" ' "不只有註解的功能,還有其他作用?
作者: GBKEE    時間: 2013-3-14 17:35

回復 30# lifedidi
  1. Option Explicit
  2. Private Sub TextBox1_Change()
  3.     計時
  4. End Sub
  5. Private Sub TextBox2_Change()
  6.     計時
  7. End Sub
  8. Private Sub 計時()
  9.     'TextBox3控制項 請改成Label控制項為佳
  10.     If IsDate(TextBox1) And IsDate(TextBox2) Then
  11.         TextBox3 = Format(CDate(TextBox2) - CDate(TextBox1), "HH:MM")
  12.         'Label1.Caption = Format(CDate(TextBox2) - CDate(TextBox1), "HH:MM")
  13.     Else
  14.         TextBox3 = ""
  15.       '  Label1.Caption = ""
  16.     End If
  17. End Sub
複製代碼

作者: jasonsdk    時間: 2013-3-15 15:35

我也碰到類似的困難,真的順利的解決了 謝謝∼!
作者: Qoo    時間: 2013-5-6 16:22

一連串精彩的問答,真是獲益良多




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