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ầyGó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 (?)
Lý do tại sao Hải phòng số nhỏ hơn Hưng yên thì tôi chưa rõ.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . .. . . . . . . . . . . . . . . . . . . . . . . DANH MỤC VÀ MÃ SỐ
CÁC ĐƠN VỊ HÀNH CHÍNH VIỆT NAMPhần I
(Ban hành kèm theo Quyết định số 124/2004/QĐ-TTg ngày 08/07/2004 của Thủ tướng Chính phủ)
QUY ĐỊNH CHUNG1. Nguyên tắc mã hoá
Mã số đơn vị hành chính là một dãy số được quy định cho từng đơn vị theo nguyên tắc thống nhất, là số định danh duy nhất, không thay đổi, ổn định trong suốt quá trình một đơn vị hành chính tồn tại thực tế. Mã số đã cấp không được sử dụng để cấp lại cho đơn vị hành chính khác cùng cấp.
2. Cấu trúc mã số đơn vị hành chính
Mã số đơn vị hành chính gồm 10 số, được phân làm 3 cấp độc lập, mỗi cấp có mã số mở để cấp mã số mới cho đơn vị hành chính khi thay đổi. Cụ thể:
+ Cấp tỉnh được mã hoá bằng 2 chữ số từ 01 đến 99;
+ Cấp huyện được mã hoá bằng 3 chữ số từ 001 đến 999;
+ Cấp xã được mã hoá bằng 5 chữ số từ 00001 đến 99999.
3. Nguyên tắc sắp xếp đơn vị hành chính khi mã hoá
Đơn vị hành chính được xếp theo thứ tự Bắc - Nam, Tây - Đông, lấy đường ranh giới ở điểm địa đầu và có kết hợp với vùng địa lý của từng cấp làm căn cứ xác định. Trong phạm vi cả nước, thành phố Hà Nội được xếp thứ nhất, các tỉnh thành phố còn lại được xếp theo nguyên tắc trên. Trong phạm vi cấp tỉnh và cấp huyện, đơn vị hành chính có trụ sở Uỷ ban nhân dân được xếp thứ nhất, các đơn vị hành chính còn lại được xếp theo thứ tự thành thị trước, nông thôn sau, từ Bắc xuống Nam, từ Tây sang Đông.
Ở đây mình xây dựng CSDL để mình quản lý thì quan tâm làm gì đến mấy nguyên tắc của nhà nước hả sư phụ?Lý do ở đây:
Thời buổi này là hội nhập mà NDU!Ở đây mình xây dựng CSDL để mình quản lý thì quan tâm làm gì đến mấy nguyên tắc của nhà nước hả sư phụ?
Mục đích cuối cùng là quản lý hiệu quả. Chúng ta đâu có cần đưa mấy cái mã ấy cho người dùng xài chứ. Mã ta đặt, tự ta biết, vậy là được rồi
Nếu bắt buộc phải xuất ra mã của nhà nước, cùng lắm ta thêm cột mã nhà nước vào. Lúc này cột mã nhà nước chỉ là dữ liệu, không phải key quản lý trong chương trình
Bạn ơi mình làm theo cách của bạn nhưng sao mình không load dữ liệu lên được. Mong bạn giúp đởGóp vui code dựa vào file bạn như sau:
Mã: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ôi đã làm hoàn chỉnh ở bài #13, có đính kèm tập tinCó ai giúp mình load dữ liệu lên được không ạ
Mình có thể mặc định khi hiện form lên là tỉnh huyện xã khác được không bạn. thank bạnTôi đã làm hoàn chỉnh ở bài #13, có đính kèm tập tin
![]()
Combobox danh sách phụ thuộc nhau không load được trong From
Chào các anh/chị Mình đang làm Combobox quê quán theo 3 cấp và có viết code nhưng nó báo lỗi và không làm sao load được vào Form. Mong các anh/chị chỉnh giúp mình. Cảm ơn anh/chị nhiềuwww.giaiphapexcel.com
Ở cuối Sub nap_tinh_huyen_xa cóMình có thể mặc định khi hiện form lên là tỉnh huyện xã khác được không bạn. thank bạn
.ListIndex = 0
If .Name = "cbxTinh" Then
.ListIndex = 1
Else
.ListIndex = 0
End If
Cám ơn bạn rất nhiềuỞ cuối Sub nap_tinh_huyen_xa có
Mã:.ListIndex = 0
Giả sử thay dòng trên bằng
Mã:If .Name = "cbxTinh" Then .ListIndex = 1 Else .ListIndex = 0 End If
thì có nghĩa là trong ComboBox Tỉnh chọn mục thứ 2 (có chỉ số là 1) là Đà Nẵng, còn trong 2 combobox Huyện và Xã chọn mục 1 (có chỉ số là 0).