Dữ liệu không hiện Droplist trong combo box (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

vn.danhmay

Thành viên mới
Tham gia
8/11/18
Bài viết
41
Được thích
3
Chào anh chị
Em đang tìm hiểu về Dictionary trong VBA
Nhưng em làm theo hướng dẫn từ các file khác thì không thể sổ ra dữ liệu như mình gán.
Anh chị nào biết có thể giúp em được không ạ.

Mã:
Dim a As Integer

Private Sub Search_tool_Initialize()
Dim Searchdata
Dim Dic_data As Object
Dim i As Integer

Set Dic_data = CreateObject("Scripting.Dictionary")
a = ActiveSheet.RowCount.End(xlUp).Row
Searchdata() = Sheet1.Range("A1:C" & a).Value
For i = 1 To UBound(Searchdata(), 1)
Dic_data.Add Searchdata(i, 1), ""
Next i


CBB1.List = WorksheetFunction.Transpose(Dic_data)


End Sub
 

File đính kèm

Chào anh chị
Em đang tìm hiểu về Dictionary trong VBA
Nhưng em làm theo hướng dẫn từ các file khác thì không thể sổ ra dữ liệu như mình gán.
Anh chị nào biết có thể giúp em được không ạ.

Mã:
Dim a As Integer

Private Sub Search_tool_Initialize()
Dim Searchdata
Dim Dic_data As Object
Dim i As Integer

Set Dic_data = CreateObject("Scripting.Dictionary")
a = ActiveSheet.RowCount.End(xlUp).Row
Searchdata() = Sheet1.Range("A1:C" & a).Value
For i = 1 To UBound(Searchdata(), 1)
Dic_data.Add Searchdata(i, 1), ""
Next i


CBB1.List = WorksheetFunction.Transpose(Dic_data)


End Sub


Mình thì viết cơ bản là như vậy
Thread này nói về Dic bạn có thể tham khảo

Mã:
Private Sub UserForm_Initialize()
    Dim Searchdata() As Variant, rArr
    Dim Dic_data As Object
    Dim i, j As Integer
  
    Set Dic_data = CreateObject("Scripting.Dictionary")
    a = ActiveSheet.Range("B" & Rows.Count).End(xlUp).Row
    Searchdata() = Sheet1.Range("A2:B" & a).Value
  
    ReDim rArr(1 To UBound(Searchdata), 1 To 2)
    For i = 1 To UBound(Searchdata)
        If Not Dic_data.Exists(Searchdata(i, 2)) Then
            j = j + 1
            Dic_data.Add Searchdata(i, 2), j
            rArr(j, 1) = Searchdata(i, 1)
            rArr(j, 2) = Searchdata(i, 2)
        End If
    Next i
  
    CBB1.List = rArr

End Sub
 

File đính kèm

Upvote 0
Mình thì viết cơ bản là như vậy
Thread này nói về Dic bạn có thể tham khảo

Mã:
Private Sub UserForm_Initialize()
    Dim Searchdata() As Variant, rArr
    Dim Dic_data As Object
    Dim i, j As Integer
 
    Set Dic_data = CreateObject("Scripting.Dictionary")
    a = ActiveSheet.Range("B" & Rows.Count).End(xlUp).Row
    Searchdata() = Sheet1.Range("A2:B" & a).Value
 
    ReDim rArr(1 To UBound(Searchdata), 1 To 2)
    For i = 1 To UBound(Searchdata)
        If Not Dic_data.Exists(Searchdata(i, 2)) Then
            j = j + 1
            Dic_data.Add Searchdata(i, 2), j
            rArr(j, 1) = Searchdata(i, 1)
            rArr(j, 2) = Searchdata(i, 2)
        End If
    Next i
 
    CBB1.List = rArr

End Sub
MÌnh cám ơn bạn ạ. Bạn cho mình hỏi code mình viết có lỗi sai ở đâu không ạ.

Với lại mình muốn có một câu hỏi là mình nếu copy dữ liệu nhiều dòng vô một ô excel thì Dic nó sẽ lấy giá trị dòng đầu tiên hay lấy hết tất cả giá trị ạ.
 
Upvote 0
MÌnh cám ơn bạn ạ. Bạn cho mình hỏi code mình viết có lỗi sai ở đâu không ạ.

Với lại mình muốn có một câu hỏi là mình nếu copy dữ liệu nhiều dòng vô một ô excel thì Dic nó sẽ lấy giá trị dòng đầu tiên hay lấy hết tất cả giá trị ạ.

Phần 1 thì bạn có thể tự so sánh từng dòng code, có thể Debug để tìm hiểu kỹ
Phần 2 thì ngoài khả năng của mình, bạn lập 1 bài mới và nêu cụ thể yêu cầu của bạn rồi anh chị kỳ cựu của GPE sẽ hỗ trợ cho bạn

Thân!
 
Upvote 0
Chào anh chị
Em đang tìm hiểu về Dictionary trong VBA
Nhưng em làm theo hướng dẫn từ các file khác thì không thể sổ ra dữ liệu như mình gán.
Anh chị nào biết có thể giúp em được không ạ.

Mã:
Dim a As Integer

Private Sub Search_tool_Initialize()
Dim Searchdata
Dim Dic_data As Object
Dim i As Integer

Set Dic_data = CreateObject("Scripting.Dictionary")
a = ActiveSheet.RowCount.End(xlUp).Row
Searchdata() = Sheet1.Range("A1:C" & a).Value
For i = 1 To UBound(Searchdata(), 1)
Dic_data.Add Searchdata(i, 1), ""
Next i


CBB1.List = WorksheetFunction.Transpose(Dic_data)


End Sub
Phần code của bạn mình tìm thấy những lỗi như dưới đây nhé:
1. Tên hàm khởi tạo form là "Private Sub UserForm_Initialize()" chứ ko phải là "Private Sub Search_tool_Initialize()" nhé.
2. a = ActiveSheet.RowCount.End(xlUp).Row -----> sửa thành: a = Sheet1.Range("B" & Rows.Count).End(xlUp).Row
3. CBB1.List = WorksheetFunction.Transpose(Dic_data) -----> CBB1.List cần gán bằng 1 mảng, nhưng Dic_data là Object nên sẽ báo lỗi. Bạn Tham khảo bài của bạn #2.
 
Upvote 0
MÌnh cám ơn bạn ạ. Bạn cho mình hỏi code mình viết có lỗi sai ở đâu không ạ.
Học tốt nhất là học trên lỗi của mình, sẽ nhớ lâu
1. Sửa Private Sub Search_tool_Initialize() thành Private Sub UserForm_Initialize()
2. Xóa Next j. Làm gì có For j = mà đòi Next j?
3. WorkSheet không có thuộc tính RowCount nên dòng a = ActiveSheet.RowCount.End(xlUp).Row sẽ sai
Thường là thế này
Mã:
a = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row

hoặc

a = ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Row
4. Dim a As Integer. Trong trường hợp này đủ xài nhưng nếu dữ liệu > 32767 dòng thì sẽ có lỗi. Dùng Long thôi.
5.
a.
Mã:
Searchdata() = Sheet1.Range("A1:C" & a).Value
For i = 1 To UBound(Searchdata(), 1)
Dic_data.Add Searchdata(i, 1), ""
Next i
Nếu sau đó chỉ dùng 1 cột của mảng - Searchdata(i, 1), thì sao lại nhét vào mảng tận 3 cột - Searchdata() = Sheet1.Range("A1:C" & a).Value?

b. Sao lại lấy từ dòng 1 (A1)?
c. dùng dic là để lấy duy nhất. Nếu chắc chắn 1000% là dữ liệu luôn duy nhất thì dùng dic làm gì nữa cho tốn điện nước? Còn nếu không chắc chắn thì khi dữ liệu có trùng lặp thì sẽ toi ở dòng
Mã:
Dic_data.Add Searchdata(i, 1), ""
Phải kiểm tra sự tồn tại của giá trị, có hay chưa có trong dic.

6.
Mã:
CBB1.List = WorksheetFunction.Transpose(Dic_data())
Chắc chắn sai vì Dic_data là đối tượng - Object.
-------------
Với code của Minh Tùng thì khi danh sách có 100 dòng trong đó có 50 là duy nhất thì trong ComboBox có 50 dòng trống. Tốt hơn là dùng thuộc tính Column thay cho List.
Ngoài ra trong trường hợp có trùng thì cột 1 củas ComboBox sẽ có STT không liên tục.

Sửa chút chút..
Mã:
Private Sub UserForm_Initialize()
Dim Searchdata() As Variant, rArr() As Variant
Dim Dic_data As Object
Dim i As Long, j As Long
    Set Dic_data = CreateObject("Scripting.Dictionary")
    Dic_data.comparemode = vbTextCompare    ' de phong luc chu hoa luc chu thuong
    a = ActiveSheet.Range("B" & Rows.Count).End(xlUp).Row
    If a = 1 Then Exit Sub  ' khong co du lieu
    Searchdata = Sheet1.Range("B2:B" & a + 1).Value ' lay du  dong

    ReDim rArr(1 To 2, 1 To UBound(Searchdata))
    For i = 1 To UBound(Searchdata) - 1 ' bo quas dong lay du
        If Not Dic_data.Exists(Searchdata(i, 1)) Then
            j = j + 1
            Dic_data.Add Searchdata(i, 1), ""
            rArr(1, j) = j
            rArr(2, j) = Searchdata(i, 1)
        End If
    Next i
    ReDim Preserve rArr(1 To 2, 1 To j) ' loai bo cac cot thua
    CBB1.Column = rArr
End Sub
Với lại mình muốn có một câu hỏi là mình nếu copy dữ liệu nhiều dòng vô một ô excel thì Dic nó sẽ lấy giá trị dòng đầu tiên hay lấy hết tất cả giá trị ạ.
Thì "vô 1 ô" rồi chạy code, rồi nhìn kỹ trong ComboBox thôi. Cái gì tự kiểm nghiệm được thì không nên hỏi. Tự lực đi.
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom