Board logo

標題: [發問] Listbox取資料問題 [打印本頁]

作者: Michelle-W    時間: 2016-8-9 16:40     標題: Listbox取資料問題

因最近剛碰自訂表單的部分
有爬問看了一下我想要的寫法
目前有個疑問
請問我的表單在sheet1
資料記錄在sheet2
要如何修改目前的程式碼才能讓Listbox1顯示sheet2 A欄全部的資料??
[attach]24882[/attach]
但A欄的資料會持續增加
目前也不曉得該如何修改.RowSource = "A2:A9"
可以自動讀取A欄有資料的部分??

請問有人可以指點一下嗎?
感謝感謝~~~
[attach]24883[/attach]
作者: c_c_lai    時間: 2016-8-9 16:59

回復 1# Michelle-W
請參考 請問出勤系統設計
作者: Michelle-W    時間: 2016-8-9 17:21

回復 2# c_c_lai


我稍早有看過這篇
但我不懂為什麼她的Listbox可以顯示別的工作表的資料
看不太懂她的Listbox的程式碼意思...
還是您可以協助解釋一下她的意思?
為什麼Listbox可以顯示資料

非常感謝

Private Sub ListBox1_Change()
    Dim AA(), xi As Integer
   
    With ListBox1
        For xi = 0 To .ListCount - 1
            If .Selected(xi) = True Then
                AA = Application.Index(ListBox1.List, xi + 1)
                ' 陣列中抽出指定的元素陣列(這裡是一維陣列)
                TextBox2.Value = AA(1)
                TextBox3.Value = AA(2)
                TextBox4.Value = AA(3)
                TextBox5.Value = AA(5)
                comEnable TextBox5.Value, IIf(TextBox5.Value = "DA", True, False)
            End If
        Next
    End With
End Sub
作者: lpk187    時間: 2016-8-9 17:21

  1. Private Sub CommandButton1_Click()
  2. '輸入的資料回傳至儲存格記錄
  3. With Sheet2
  4. 'Set a = .[A65536].End(xlUp).Offset(1, 0)
  5. 'a.Resize(, 1) = Array(TextBox1)
  6.     ro = .[A65536].End(xlUp).Row + 1
  7.     .Cells(ro, 1) = TextBox1.Value
  8.     TextBox1.Value = ""
  9.     ListB1 '重設 ListBox1
  10. End With
  11. End Sub

  12. Private Sub UserForm_Initialize()
  13. ListB1
  14. End Sub

  15. Public Sub ListB1()
  16.     ro = Sheet2.[A65536].End(xlUp).Row
  17.     With ListBox1
  18.         .MultiSelect = fmMultiSelectMulti
  19.         .RowSource = "Sheet2!A2:A" & ro '如何使其資料顯示sheet2-A欄有資料的部分??
  20.         .ColumnCount = 2
  21.     End With
  22. End Sub
複製代碼
回復 1# Michelle-W
作者: Michelle-W    時間: 2016-8-9 17:30

回復 4# lpk187


謝謝!!
您還幫我修改了CommandButton的程式碼
我還沒想到可以在CommandButton上面直接更新Listbox
非常感謝^^"
作者: c_c_lai    時間: 2016-8-9 17:33

回復 3# Michelle-W
  1. Private Sub 列表框_Change()
  2.     Dim AA(), xi As Integer
  3.    
  4.     With 列表框
  5.         For xi = 0 To .ListCount - 1
  6.             '  判斷列表框 (ListBox1) 是否有被點選
  7.             If .Selected(xi) = True Then
  8.                 '  取出該行之數據,存入 AA 陣列中
  9.                 AA = Application.Index(列表框.List, xi + 1)
  10.                 ' 陣列中抽出指定的元素陣列 (這裡是一維陣列)
  11.                 工號.Value = AA(1)
  12.                 姓名.Value = AA(2)
  13.                 組別.Value = AA(3)
  14.                 出勤站別.Value = AA(5)
  15.                 '  同時存入     出勤站別、出勤時數、以及改變可操機數之旗標
  16.                 comEnable 出勤站別.Value, IIf(出勤站別.Value = "DA", True, False)
  17.                 Exit For
  18.             End If
  19.         Next
  20.     End With
  21.    
  22.     overTime
  23. End Sub
複製代碼

作者: c_c_lai    時間: 2016-8-9 17:37

本帖最後由 c_c_lai 於 2016-8-9 17:42 編輯

回復 3# Michelle-W
模組:
  1. Sub DA出勤()
  2.     Dim rng As Range
  3.    
  4.     With DA出勤更新.列表框
  5.         '.MultiSelect = fmMultiSelectMulti ' => 1 : 列表框 (ListBox1) 屬性設定可複選
  6.         ' fmMultiSelectSingle 0 只能選取一個專案( 預設)。
  7.         ' fmMultiSelectSimple 1 按下空白鍵或按下滑鼠鍵,可以選取、
  8.         ' 取消選取清單中的專案。
  9.         ' fmMultiSelectExtended 2 按下SHIFT 並按下滑鼠鍵,或按下SHIFT
  10.         ' 並按下一個方向鍵,可選取一個範圍內的所有專案。按下CTRL 並
  11.         ' 按下滑鼠鍵,可選取或取消選取一個專案。
  12.         ' .Visible = False
  13.         ' .ColumnHeads = True
  14.         .ColumnCount = 5
  15.         ' 指定下拉式清單方塊或清單方塊的顯示行數。
  16.         .ColumnWidths = "60,80,60,80,60"
  17.         ' 指定多行下拉式清單方塊或清單方塊中的各行寬度。
  18.     End With
  19.    
  20.     With Sheets("人力資料庫")
  21.         .Select
  22.         '  Set rng = Range(.Range("C2:E" & .[E2].End(xlDown).Row), .Range("G2:G" & .[G2].End(xlDown).Row))
  23.         'Set rng = .Range("C2:E" & .[E2].End(xlDown).Row)
  24.         Set rng = Range(.[C1], .[G1].End(xlDown))
  25.         DA出勤更新.列表框.RowSource = rng.Address
  26.     End With

  27.     Sheets("操作介面").Select
  28.     DA出勤更新.Show
  29. End Sub
複製代碼
附上備註 ( ' ) 可幫助你明白其為何及其作用。
[attach]24884[/attach]
作者: Michelle-W    時間: 2016-8-10 08:43

回復 7# c_c_lai


謝謝C大大
有您的解釋,我比較容易理解各程式碼的邏輯與作用了
真的非常感謝~~!!!
作者: Michelle-W    時間: 2016-8-10 15:48

回復 7# c_c_lai


C大~不好意思請教您一下
我想要選擇Listbox1中多個不連續的資料,可以存至sheet1的A欄中
資料是累積的,但我目前的程式碼執行起來怪怪的,請問哪邊錯了QQ?
可以麻煩您指點一下嗎? 感恩~

Private Sub CommandButton1_Click()
    Dim AA(), xi As Integer
    With ListBox1
        For xi = 0 To .ListCount - 1
            '  判斷列表框 (ListBox1) 是否有被點選
            If .Selected(xi) = True Then
                '  取出該行之數據,存入 AA 陣列中
                AA = Application.Index(ListBox1.List, xi + 1)
                Range("A1").Select
                Selection.End(xlUp).Select
                Sheets("sheet1").Range("a" & ActiveCell.Row + 1) = AA
                Exit For
            End If
        Next
    End With

End Sub
作者: c_c_lai    時間: 2016-8-10 19:33

回復 9# Michelle-W
                Range("A1").Select
                Selection.End(xlUp).Select
                Sheets("sheet1").Range("a" & ActiveCell.Row + 1) = AA

你這三行指的是?
作者: GBKEE    時間: 2016-8-11 06:02

本帖最後由 GBKEE 於 2016-8-11 06:07 編輯

回復 9# Michelle-W
  1. Private Sub CommandButton1_Click()
  2.     Dim AA(), xi As Integer
  3.     With ListBox1
  4.         For xi = 0 To .ListCount - 1
  5.             '  判斷列表框 (ListBox1) 是否有被點選
  6.             If .Selected(xi) = True Then
  7.                 '  取出該行之數據,存入 AA 陣列中
  8.                 AA = Application.Index(ListBox1.List, xi + 1)
  9.                 Range("A1").Select
  10.                 '*******************
  11.                 Selection.End(xlUp).Select   
  12.                 '***'xlUp 往上 "A1"的 往上 還是在"A1"
  13.                 Sheets("sheet1").Range("a" & ActiveCell.Row + 1) = AA
  14.                 Exit For
  15.             End If
  16.         Next
  17.     End With
  18. End Sub
複製代碼
A欄中資料如何累積的請說明
是這樣嗎?
  1. Option Explicit
  2. Private Sub Ex_CommandButton1_Click()
  3.     Dim AA(), xi As Integer
  4.     With ListBox1
  5.         For xi = 0 To .ListCount - 1
  6.             '  判斷列表框 (ListBox1) 是否有被點選
  7.             If .Selected(xi) = True Then
  8.                 '  取出該行之數據,存入 AA 陣列中
  9.                 AA = Application.Index(ListBox1.List, xi + 1)
  10.                  With Range("A" & xi + 1)
  11.                     '.Cells = AA
  12.                     .Cells = .Cells + AA  '資料是累積的
  13.                ' Exit For       '離開 For 迴圈
  14.                '*******************
  15.                'Listbox1中多個不連續的資料, Exit For 就不執行下一個 .Selected(xi) = True
  16.                '******************************
  17.             End If
  18.         Next
  19.     End With
  20. End Sub
  21. Option Explicit
  22. Private Sub CommandButton1_Click()
  23.     Dim AA(), xi As Integer
  24.     With ListBox1
  25.         For xi = 0 To .ListCount - 1
  26.             '  判斷列表框 (ListBox1) 是否有被點選
  27.             If .Selected(xi) = True Then
  28.                 '  取出該行之數據,存入 AA 陣列中
  29.                 AA = Application.Index(ListBox1.List, xi + 1)
  30.                  With Range("A" & Rows.Count).End(xlUp)  '.Offset(1)  '**還是下一儲存格
  31.                     .Cells = AA
  32.                     '還是 .Cells = .Cells + AA '資料是累積的
  33.                 End With
  34.                     
  35.                     '***Count 屬性 傳回一個 Long (長整數),等於在一個集合物件中的物件數目。
  36.                     'Rows.Count : 工作表的最後一列
  37.                  
  38.                     ' ***Offset 屬性   套用至 Range 物件時用 Offset 屬性。
  39.                     '傳回 Range 物件,用以代表某個指定區域以外的範圍。唯讀。
  40.                     'expression.Offset(RowOffset, ColumnOffset)
  41.                     'Range("A" & Rows.Count).End(xlUp).Offset(1)
  42.                     '工作表A欄底部 , 往上到有資料的儲存格, 的下一儲存格
  43.                 'Exit For
  44.             End If
  45.         Next
  46.     End With
  47. End Sub
複製代碼

作者: Michelle-W    時間: 2016-8-11 11:10

回復 10# c_c_lai


我想要將Listbox中所選擇的資料寫入A欄
可能邏輯寫錯了導致您看不懂QQ"
作者: Michelle-W    時間: 2016-8-11 11:16

回復 11# GBKEE

就是點選Listbox中的資料,填入sheet3的A欄
我自己嘗試過即使選擇了三筆,A欄資料也只會出現1筆

想要達到的功能如下圖
[attach]24903[/attach]
[attach]24904[/attach]


另外我也想要在Listbox點選可以刪除的功能
目前的程式碼會一直出現無法辨認的錯誤
不懂錯在哪邊QQ
不曉得可否一起幫我看看
感恩

[attach]24905[/attach]
作者: lpk187    時間: 2016-8-11 13:15

回復 13# Michelle-W
  1. Private Sub 刪除_Click()

  2. '還沒處理完,一直錯誤
  3. Dim i As Integer
  4. For i = home.ListBox1.ListCount - 1 To 0 Step -1 '程式所在位置在 home表單中可以省略 home.
  5. If ListBox1.Selected(i) Then '即然等於True 就不用等於True了
  6. home.ListBox1.RemoveItem (i) 'ListBox1的 list所指定的是清單來源,也就是說清單來源有改變ListBox1的清單才會改變
  7. '所以這裡用RemoveItem是錯誤的,正確方式,應該刪除 Sheet2的資料,這裡先不幫你修正
  8. End If
  9. Next

  10. End Sub
複製代碼
  1. Private Sub 匯入_Click()
  2.     Dim AA(), xi As Integer
  3.     With ListBox1
  4.         For xi = 0 To .ListCount - 1
  5.             '  判斷列表框 (ListBox1) 是否有被點選
  6.             If .Selected(xi) Then '即然等於True 就不用等於True了
  7.                 '  取出該行之數據,存入 AA 陣列中
  8.                 AA = Application.Index(ListBox1.List, xi + 1)
  9.                 ''下列語句必須加入.End(xlUp),這裡已幫你修正
  10.                 With Sheets("sheet3").Range("A" & Rows.Count).End(xlUp).Offset(1)  '.Offset(1)  '**還是下一儲存格
  11.                     '''''''''''''''''''''
  12.                     '下面2個語法依你的需求擇一
  13.                     .Cells = AA '單一儲存格使用
  14.                     .Resize(, UBound(AA)) = AA '若使用多欄多列必須指定有多少的儲存格給它
  15.                     '''''''''''
  16.                     '還是 .Cells = .Cells + AA '資料是累積的
  17.                 End With
  18.                     
  19.                     '***Count 屬性 傳回一個 Long (長整數),等於在一個集合物件中的物件數目。
  20.                     'Rows.Count : 工作表的最後一列
  21.                  
  22.                     ' ***Offset 屬性   套用至 Range 物件時用 Offset 屬性。
  23.                     '傳回 Range 物件,用以代表某個指定區域以外的範圍。唯讀。
  24.                     'expression.Offset(RowOffset, ColumnOffset)
  25.                     'Range("A" & Rows.Count).End(xlUp).Offset(1)
  26.                     '工作表A欄底部 , 往上到有資料的儲存格, 的下一儲存格
  27.                 'Exit For
  28.             End If
  29.         Next
  30.     End With
  31.     ListB1 '匯入後重新設定ListBox1
  32. End Sub
複製代碼

作者: lpk187    時間: 2016-8-11 14:55

  1. Private Sub 刪除_Click()
  2. Dim arr() '設定一個空白陣列
  3. Dim i As Integer
  4. n = 0
  5. For i = ListBox1.ListCount - 1 To 0 Step -1
  6.     If ListBox1.Selected(i) Then
  7.         n = n + 1
  8.         ReDim Preserve arr(1 To n) '重設陣列數目,增加陣列數目,
  9.         arr(n) = i + 2 '將欲刪除的列號記錄在陣列中,+2是從 (RowSource = "Sheet2!A2:A" & ro) 的A2計算列號
  10.     End If
  11. Next
  12. For Each ar In arr
  13.     Sheet2.Rows(ar).Delete '將記錄在陣列的列號一一刪除
  14. Next
  15. ListB1 '刪除後重設ListBox1
  16. '這裡會分2個迴圈刪除是因為,當刪除Sheet2中記錄時會使得其他ListBox1.Selected為False
  17. '(也就是說所有已選取的資料會變成無選取狀態)以致於只能刪除一列,
  18. '故只有先記錄欲刪除的列號,再刪除其資料
  19. End Sub
複製代碼
回復 13# Michelle-W
作者: Michelle-W    時間: 2016-8-11 15:36

回復 15# lpk187
回復 11# GBKEE
回復 10# c_c_lai

謝謝你還幫我解釋刪除的程式碼錯誤,我剛有自己研究了一下怎麼刪除儲存格
不過還是您比較快~哈哈


非常謝謝各位前輩們提供的程式碼
最重要的是都還有附上講解,讓小妹我能更快進入狀況
覺得很溫暖^^
非常感謝!!!
作者: GBKEE    時間: 2016-8-11 15:50

回復 16# Michelle-W
整理一下你的程式碼
可了解看看
  1. Option Explicit
  2. Dim Rng As Range, Msg As Boolean
  3. Private Sub UserForm_Initialize()
  4.     Msg = MsgBox("ListBox 清單的來源。" & vbLf & "Yes=使用RowSource" & vbLf & "No= 使用List(陣列)", vbYesNo) = vbYes
  5.     ListB1
  6. End Sub
  7. Public Sub ListB1()
  8.     Dim RO As Integer
  9.     With Sheet2
  10.         RO = IIf(.Cells(Rows.Count, 1).End(xlUp).Row > 2, .Cells(Rows.Count, 1).End(xlUp).Row, 2)
  11.         Set Rng = .Range("A2:A" & RO)
  12.     End With
  13.     With ListBox1
  14.         .MultiSelect = fmMultiSelectMulti
  15.         If Msg Then
  16.             .RowSource = Rng.Address(, , , 1, 1)
  17.         Else
  18.             .List = Rng.Value
  19.         End If
  20.         .ColumnCount = Rng.Columns.Count
  21.     End With
  22. End Sub
  23. Private Sub 新增_Click()
  24. '輸入的資料回傳至儲存格記錄
  25. Dim RO As Integer
  26. With Sheet2
  27.     RO = .[A65536].End(xlUp).Row + 1
  28.     .Cells(RO, 1) = TextBox1.Value
  29.     TextBox1.Value = ""
  30.     ListB1 '重設 ListBox1
  31. End With
  32. End Sub
  33. Private Sub 刪除_Click()
  34.     Dim i As Integer, r As String, E As Variant
  35.     For i = home.ListBox1.ListCount - 1 To 0 Step -1
  36.         If home.ListBox1.Selected(i) = True Then
  37.            If Msg = False Then         '**ListBox 清單的來源。No= 使用List(陣列)
  38.                 home.ListBox1.RemoveItem (i)
  39.             ElseIf Msg = True Then   '**ListBox 清單的來源。Yes=使用RowSource
  40.                 r = IIf(r <> "", r & "," & i + 1, i + 1)
  41.             End If
  42.         End If
  43.     Next
  44.     If Msg = True Then
  45.         For Each E In Split(r, ",")
  46.             Rng.Rows(E).Delete            '**刪除範圍中的資料 Yes=使用RowSource
  47.         Next
  48.         ListB1
  49.     End If
  50. End Sub
  51. Private Sub 匯入_Click()
  52.     Dim AA, xi As Integer
  53.     With ListBox1
  54.         For xi = 0 To .ListCount - 1
  55.             '  判斷列表框 (ListBox1) 是否有被點選
  56.             If .Selected(xi) = True Then
  57.                 '  取出該行之數據,存入 AA 陣列中
  58.                 AA = Application.Index(ListBox1.List, xi + 1)
  59.                  'With Sheets("sheet3").Range("A" & Rows.Count).Offset(1)  '.Offset(1)  '**還是下一儲存格
  60.                  With Sheets("sheet3").Range("A" & Rows.Count).End(xlUp).Offset(1)  '.Offset(1)  '**還是下一儲存格
  61.                     .Cells = .Cells + AA
  62.                     '還是 .Cells = .Cells + AA '資料是累積的
  63.                 End With
  64.             End If
  65.         Next
  66.     End With
  67. End Sub
複製代碼

作者: afu9240    時間: 2018-3-14 14:44

回復 15# lpk187


    [attach]28440[/attach]

大大
   想請教一下如果Listbox資料欄位比較多 要如何匯入儲存格,依照您給的code要如何修改呢~~求解惑




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