Danh mục Tỉnh, Huyện, Xã chỉ nên nạp 1 lần duy nhất vào Dictionary lúc mở file (AutoOpen). Sau đó cần tìm cái gì cứ tra vào từ điểnÝ anh là như này?
Góp vui code dựa vào file bạn như sau:Ý anh là như này?
Dim cn As Object
Private Sub UserForm_Initialize()
Set cn = CreateObject("ADODB.Connection")
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;;Data source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=No"""
With CreateObject("ADODB.Recordset")
.Open "Select distinct F1 From [PHUONG$B2:B]", cn
vl10.Clear
vl10.Column = .getrows
End With
End Sub
Private Sub vl10_AfterUpdate()
With CreateObject("ADODB.Recordset")
.Open "Select distinct F3 From [PHUONG$B2:D] where F1='" & vl10.Text & "'", cn
vl11.Clear
vl11.Column = .getrows
End With
End Sub
Private Sub vl11_AfterUpdate()
With CreateObject("ADODB.Recordset")
.Open "Select distinct F5 From [PHUONG$B2:F] where F1='" & vl10.Text & "' and F3='" & vl11.Text & "'", cn
vl12.Clear
vl12.Column = .getrows
End With
End Sub
Tức là mình Set dic = CreateObject("Scripting.Dictionary") trong sự kiện workbook_open phải không thầy? em mới bỏ vào thử vẫn chạy, giờ em mới biết vấn đề này. Em cảm ơn thầy.Danh mục Tỉnh, Huyện, Xã chỉ nên nạp 1 lần duy nhất vào Dictionary lúc mở file (AutoOpen). Sau đó cần tìm cái gì cứ tra vào từ điển
Mỗi lần tìm lại nạp dictionary thì không tốt lắm, bởi danh mục Tỉnh, Huyện, Xã thuộc danh sách cố định, hiếm khi thay đổi
ADO nữa hả thầy , để em nghiên cứu, mới học xong nên chưa áp dụng được (em là Trọng vừa mới học lớp ADO của thầy nè )Góp vui code dựa vào file bạn như sau:
Ở Page "Nhâp Xã - Huyên - Tinh" mà.Trong file em đâu thấy combobox nào liên quan tới xã huyện tỉnh đâu?
Ở Page "Nhâp Xã - Huyên - Tinh"
Sau khi chọn 3 ComboBox thì nhấn vô Label tương ứng để ghi lên 1 trong 3 TextBox cần nhập (Quê Quán; Nơi Sinh & Thường Trú)
để nhập mới hay sửa chữa/bổ sung.
Tôi sẽ làm dựa vào file của bạn nhéTức là mình Set dic = CreateObject("Scripting.Dictionary") trong sự kiện workbook_open phải không thầy? em mới bỏ vào thử vẫn chạy, giờ em mới biết vấn đề này. Em cảm ơn thầy.
Public dicVNAddress As Object
Public dicProvince As Object
Public dicDistrict As Object
Public arrSource As Variant
Private Sub Auto_Open()
Dim wksVNAddress As Worksheet
Dim lRow As Long
Dim strID As String
Dim strProvinceID As String
Dim strDistrictID As String
Dim strAddress As String
Dim strProvince As String
Dim strDistrict As String
Dim strVillage As String
Dim strDistrictKey As String
Dim strVillageKey As String
On Error Resume Next
Set wksVNAddress = ThisWorkbook.Worksheets("VNAddress")
arrSource = wksVNAddress.Range("A2", wksVNAddress.Range("C60000").End(xlUp)).Value
Set dicVNAddress = CreateObject("Scripting.Dictionary")
Set dicProvince = CreateObject("Scripting.Dictionary")
Set dicDistrict = CreateObject("Scripting.Dictionary")
For lRow = 1 To UBound(arrSource, 1)
strID = arrSource(lRow, 1)
strAddress = arrSource(lRow, 2)
dicVNAddress.Add strID, strAddress
Select Case Len(strID)
Case Is = 2
strProvince = strAddress
dicProvince.Add strProvince, vbNullString
Case Is = 4
strProvinceID = Left(strID, 2)
strProvince = dicVNAddress.Item(strProvinceID)
strDistrict = strAddress
strDistrictKey = strProvince & "|" & strDistrict
If Not dicDistrict.Exists(strDistrictKey) Then
dicDistrict.Add strDistrictKey, vbNullString
If dicProvince.Item(strProvince) = vbNullString Then
dicProvince.Item(strProvince) = strDistrict
Else
dicProvince.Item(strProvince) = dicProvince.Item(strProvince) & "|" & strDistrict
End If
End If
Case Is = 6
strProvinceID = Left(strID, 2)
strDistrictID = Left(strID, 4)
strVillage = strAddress
strProvince = dicVNAddress.Item(strProvinceID)
strDistrict = dicVNAddress.Item(strDistrictID)
strDistrictKey = strProvince & "|" & strDistrict
If dicDistrict.Item(strDistrictKey) = vbNullString Then
dicDistrict.Item(strDistrictKey) = strVillage
Else
dicDistrict.Item(strDistrictKey) = dicDistrict.Item(strDistrictKey) & "|" & strVillage
End If
End Select
Next
If Err.Number Then MsgBox Err.Description, , lRow
End Sub
Private Sub Auto_Close()
Set dicVNAddress = Nothing
Set dicProvince = Nothing
Set dicDistrict = Nothing
End Sub
Sub ShowForm()
ufVNAddress.Show False
End Sub
Private Sub UserForm_Initialize()
If dicVNAddress Is Nothing Then Application.Run "'" & ThisWorkbook.Name & "'!modInitialize.Auto_Open"
cboProvince.List = dicProvince.Keys
cboProvince.ListIndex = 0
End Sub
Private Sub cboProvince_Click()
Dim aList
Dim strProvinceKey As String
strProvinceKey = cboProvince.Text
If dicProvince.Exists(strProvinceKey) Then
aList = Split(dicProvince.Item(strProvinceKey), "|")
cboDistrict.List = aList
cboDistrict.ListIndex = 0
End If
End Sub
Private Sub cboDistrict_Click()
Dim aList
Dim strDistrictKey As String
strDistrictKey = cboProvince.Text & "|" & cboDistrict.Text
If dicDistrict.Exists(strDistrictKey) Then
aList = Split(dicDistrict.Item(strDistrictKey), "|")
cboVillage.List = aList
cboVillage.ListIndex = 0
End If
End Sub
Ham hố làm cái gì cơ chứ, lúc mở file là excel nạp đủ các loại dữ liệu để chạy, mà còn chịu khó chất cho nó gánh nặng nạp từ điển. Chả khác nào đã mệt lại còn yêu cầu làm thêm việc. Chưa kể dữ liệu lại nằm trên ram, tốn kém ra mà có được cái gì đâu ( có khi mở file ra rồi chả bao giờ dùng đến cái từ điển).trong sự kiện workbook_open phải không thầy? em mới bỏ vào thử vẫn chạy, giờ em mới biết vấn đề này. Em cảm ơn thầy.
Nước ta có 9 quân khu; Nên chăng mã tỉnh nên nương theo các quân khu này?!Tôi sẽ làm dựa vào file của bạn nhé
Việc đầu tiên của tôi là sửa hết tên các đối tượng
(Sửa luôn tên các Lable cho đồng bộ)
Tiếp theo là cách bố trí CSDL. Tôi bố trí hoàn toàn khác với cách của bạn (mời xem file).
Mã tỉnh huyện xã được đặt có ý đồ
Gì mà có quân khu ở đây hả sư phụ? Địa chỉ cả nước em lấy trên trang web nhà nước, hổng có cái quân khu nào cảNước ta có 9 quân khu; Nên chăng mã tỉnh nên nương theo các quân khu này?!
xem lại code ở bài 10 thì mình hiểu sai ý của thầy ndu96081631, nhưng nạp vào thì nó vẫn chạy, mình nghĩ cũng tùy trường hợp, khi nào cần thì nạp thư viện cũng được mà, bạn có thể cho mình biết ưu và khuyết khi nạp thư viện ở sự kiện workbook_open được không?Ham hố làm cái gì cơ chứ, lúc mở file là excel nạp đủ các loại dữ liệu để chạy, mà còn chịu khó chất cho nó gánh nặng nạp từ điển. Chả khác nào đã mệt lại còn yêu cầu làm thêm việc. Chưa kể dữ liệu lại nằm trên ram, tốn kém ra mà có được cái gì đâu ( có khi mở file ra rồi chả bao giờ dùng đến cái từ điển).
Tôi sẽ làm dựa vào file của bạn nhé
Việc đầu tiên của tôi là sửa hết tên các đối tượng
- UserForm: ufVNAddress
- ComboBox Tỉnh: cboProvince
- ComboBox Huyện: cboDistrict
- ComboBox Xã: cboVillage
- Module: modInitialize
(Sửa luôn tên các Lable cho đồng bộ)
Tiếp theo là cách bố trí CSDL. Tôi bố trí hoàn toàn khác với cách của bạn (mời xem file). Mã tỉnh huyện xã được đặt có ý đồ
Mình đề xuất các tỉnh thuộc quân khu 9 nè:Gì mà có quân khu ở đây hả sư phụ? Địa chỉ cả nước em lấy trên trang web nhà nước, hổng có cái quân khu nào cả
An Giang H0
Bạc Liêu H1
Bến Tre H2
Cà Mau H3
Cần Thơ H4
Đồng Tháp H5
Hậu Giang H6
Kiên Giang H7
Sóc Trăng H8
Tiền Giang H9
Trà Vinh I1
Vĩnh Long I2
An Giang 805
Hà Nội 101
Hải Phòng 103
Hải Dương 107
Hưng Yên 109
Hà Nam 111
Nam Định 113
Thái Bình 115
Ninh Bình 117
Hà Giang 201
Cao Bằng 203
Lào Cai 205
Bắc Cạn 207
Lạng Sơn 209
Tuyên Quang 211
Yên Bái 213
Thái Nguyên 215
Phú Thọ 217
. . . . .
1010101 Phúc Xá
1010103 Trúc Bạch
1010105 Vĩnh Phúc
1010107 Cống Vị
1010109 Liễu Giai
1010111 Nguyễn Trung Trực
1010113 Ngọc Hà
1010115 Đội Cấn
1010117 Kim Mã
1010119 Giảng Võ
. . . . . . .
Tôi cũng lấy danh sách ở đó đóMã tỉnh huyện xã em thấy trong trang web của Tổng cục Thống kê có đầy đủ rồi, mình lấy về dùng thôi.
https://www.gso.gov.vn/dmhc2015/
Ý đồ của tôi trong việc đặt mã đó là:Còn ý của bác @ndu96081631 thì em không rõ vì cả tháng nay không sờ đến máy tính rồi.
Loại cho mã số thế này là phương pháp tương đối khoa học. Trông dạng giống như là mượn từ cách chia vùng để giao thư và hàng hoá của bưu chính.Riêng trong Excel mà xài mấy con số 02, 03 hay 06,. . . . có ngày mang họa!
Mình thấy có ngành nào đó xài cách này cho mã tỉnh thấy hay hơn nè:
...
Như vậy riêng mã các tỉnh là 3 con số cho 1 đơn vị HC (hành chính), nhưng luôn > 100
Các đơn vị HC cấp thấp hơn cấp này đều 2 con số
...
Ở bảng thứ nhất, các bạn chú í thêm: Sao người ta chọn An Giang là 805 & bắc đầu từ Hà Giang là 201 (?)