Sửa chữa, bổ sung hay nhập mới địa danh Xã - Huyện - Tỉnh vô CSDL nhân sự nhờ 3 ComboBox liên hệ nhau

Liên hệ QC

SA_DQ

/(hông là gì!
Thành viên danh dự
Tham gia
8/6/06
Bài viết
14,528
Được thích
22,790
Nghề nghiệp
U80
Các bạn thao tác theo file đính kèm ở #9,. . . .
Xin lỗi các bạn vì đã đưa nhầm file!
 
Lần chỉnh sửa cuối:
Trong file em đâu thấy combobox nào liên quan tới xã huyện tỉnh đâu?
 
Upvote 0
Ý anh là như này?
 

File đính kèm

  • tinh_huyen_xa.xlsm
    447.4 KB · Đọc: 41
Upvote 0
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
 
Upvote 0
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
 

File đính kèm

  • tinh_huyen_xa.xlsm
    437.1 KB · Đọc: 42
Upvote 0
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
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.
Bài đã được tự động gộp:

Góp vui code dựa vào file bạn như sau:
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è :D)
 
Upvote 0
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" mà.
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.
 
Upvote 0
Ở Page "Nhâp Xã - Huyên - Tinh" mà.
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.
Vậy là sư phụ lộn file rồi
Form của sư phụ hổng có cái nào là Page "Nhâp Xã - Huyên - Tinh" cả

Capture.JPG
 
Upvote 0
Thôi, chết tôi rồi & rất xin lỗi các bạn rất nhiều vì nhầm file;
Ở 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.

File này đây, các bạn:
 

File đính kèm

  • Form.rar
    208.5 KB · Đọc: 49
Upvote 0
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.
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ó ý đồ
Cuối cùng là code
1> Code trong Module modInitialize
Mã:
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
Code này chạy 1 lần duy nhất khi mở file nên trong form sẽ không có bất cứ vòng lập nào nữa cả. Chỉ việc truy vào dictionary, lấy ra xài
2> Code trong UserForm ufVNAddress
Mã:
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
 

File đính kèm

  • tinh_huyen_xa.xlsm
    349.1 KB · Đọc: 51
Lần chỉnh sửa cuối:
Upvote 0
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.
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).
 
Upvote 0
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ó ý đồ
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?!
 
Upvote 0
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).
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?
Bài đã được tự động gộp:

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ó ý đồ

Em xem file của thầy rồi,em vẫn còn mơ hồ về mấy cái biến với sub private,public lắm, trước giờ em chỉ khai báo trong module thôi, em chưa biết tài liệu nào nói chi tiết về cách khai báo 2 kiểu đó, để em tìm hiểu thêm. Mà CSDL bố trí như file dựa vào mã có khó khăn hơn cho người dùng khi muốn thêm hay xóa bớt không thầy(ngoài để ý tên phải để ý thêm mã nữa), CSDL của em nếu cần có thể không cần mã để sử dụng( tùy vào mục đích người dùng), mà khi muốn chỉnh sửa thì em nghĩ cũng dễ thao tác hơn.
 
Lần chỉnh sửa cuối:
Upvote 0
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ả
Mình đề xuất các tỉnh thuộc quân khu 9 nè:
PHP:
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
 
Upvote 0
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è:
PHP:
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
. .    . . .
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ố
ví dụ:
PHP:
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õ
. . .    . . . .

Ở 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 (?)

(?) Có bạn nào để ý đến ý đồ mà NDU đã nêu (ở #10) chưa vậy.
 
Lần chỉnh sửa cuối:
Upvote 0
Mã tỉnh huyện xã tổng cục thống kê cũng có lợi là dễ nhớ và cập nhật. Cứ lên trang web tải file excel về. 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.
 
Upvote 0
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/
Tôi cũng lấy danh sách ở đó đó
---------------------------------------------------------------
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.
Ý đồ của tôi trong việc đặt mã đó là:
- Từ một mã con có thể truy cập về mã cha của nó. Mã xã gồm 6 ký tự, trong đó 4 ký tự đầu chứa mã huyện mà nó phụ thuộc, đồng thời 2 ký tự đầu chứa luôn mã tỉnh. Lấy ví dụ từ mã B9AEAC ta biết được đó là xã Xuân Hòa. Tra tiếp 4 ký tự đầu B9AE ra được huyện Thọ Xuân và cuối cùng 2 ký tự đầu B9 cho ta tỉnh Thanh Hóa
- Mã tôi đặt là mã Hexa nên có thể tính toán cộng trừ nhân chia được
- Với cặp số từ 00 đến FF sẽ cho ta 256 trường hợp, quá thừa cho số lượng của tỉnh huyện xã trong nước
- Vì là mã Hexa có khả năng tính toán nên sau này nếu có mở rộng thêm bớt là chuyện rất dễ dàng, tính là ra mà không cần phải suy nghĩ
Cách tính toán tôi từng đề cập ở đây:
https://www.giaiphapexcel.com/diendan/threads/bàn-về-chương-trình-tìm-kiếm-tỈnh-huyỆn-xÃ-trong-nước.133079/post-841234
---------------------------------------------------------------
Đương nhiên giải thuật là tùy ý từng người. Tôi không nói cách của tôi hay hơn mọi người nhưng ít nhất tôi cảm thấy cách của tôi nó dễ hiểu (đối với tôi) và tôi thoải mái triển khai được ý tưởng của mình mà không gặp bất cứ trục trặc kỹ thuật nào
 
Upvote 0
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 (?)
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.
Nhìn sơ sơ thì thấy ngừoi ta chia địa đồ ra từng vùng. Có lẽ miền Bắc từ số 1-3 gì đó, và 1 cho các tỉnh cận HN, 2 cho các tỉnh xa hơn. Như vậy miền Nam có lẽ là 7-8, với 7 là cận SG, và 8 là xa.
Với cách này, ngừoi ta chỉ cần nhìn cái bản đồ thì có thể đoán ra đại khái số mã. Nếu khong đoán được thì cũng dễ dàng dò từ từ.
Cách dùng chữ để lập mã đòi hỏi ngừoi ta phải có kiến thức nhiều hơn về luật mã hoá. Bảo ngừoi ta phải biết thêm về hệ thập lục phân thì có hơi quá đáng.
Lý do tại sao Hải phòng số nhỏ hơn Hưng yên thì tôi chưa rõ.

Chú: ngừoi Mỹ dùng 2 ký tự để làm ký hiệu tiểu bang. Nhưng họ dùng cách viết tắt đơn giản, những tiểu bang trùng nhau thì vẫn giữ ký tự thứ nhất và tìm đặc điểm riêng của tên mà làm ký tự thứ hai. AL = Alabama, AK = Alaska, AZ = Arizona, AR = Arkansas; lưu ý là cái AR là 2 ký đầu của Arizona và Arkansas.
Cái ZIP code của họ là số mã 5 số dùng cho bưu điện. Rõ ràng là tổ chức theo vùng.
 
Upvote 0
Web KT

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

Back
Top Bottom