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
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
Với những ai yêu thích Excel nói chung và yêu thích VBA nói riêng thì chắc hẳn cũng đã biết qua các khái niệm về mảng, về công thức điều kiện, vòng lặp,..., những thứ rất quen thuộc mà gần như là sử dụng thường xuyên trong từng bài toán lập trình. Tuy nhiên, có lẽ sẽ rất ít người biết về...
www.giaiphapexcel.com
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
Với những ai yêu thích Excel nói chung và yêu thích VBA nói riêng thì chắc hẳn cũng đã biết qua các khái niệm về mảng, về công thức điều kiện, vòng lặp,..., những thứ rất quen thuộc mà gần như là sử dụng thường xuyên trong từng bài toán lập trình. Tuy nhiên, có lẽ sẽ rất ít người biết về...
www.giaiphapexcel.com
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ị ạ.
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
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.
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
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ị ạ.