Tìm tên theo chữ cái tiếng việt và dấu trong tiếng việt

MyVTV Add-ins

Masu1991

Thành viên mới
Tham gia ngày
21 Tháng ba 2020
Bài viết
28
Được thích
8
Điểm
103
Tuổi
29
xin chào mọi người,
mình có 1 cái tên viết không dấu, mình muốn tìm tất cả các tên trong tiếng việt có đầu đủ dấu để thành 1 cái tên có nghĩa:
MẪU TÊN:THANH DAO
1​
Thanh Đao
2​
Thanh Đào
3​
Thánh Dao
4​
Thạnh Đạo
5​
Thảnh Dao
6​
….
7​
8​
9​
10​
11​
12​
13​
 

File đính kèm

  • tìm tên.xlsx
    9.5 KB · Đọc: 5

Hoàng Tuấn 868

Thành viên mới
Tham gia ngày
9 Tháng mười một 2019
Bài viết
1,692
Được thích
1,306
Điểm
668
xin chào mọi người,
mình có 1 cái tên viết không dấu, mình muốn tìm tất cả các tên trong tiếng việt có đầu đủ dấu để thành 1 cái tên có nghĩa:
MẪU TÊN:THANH DAO
1​
Thanh Đao
2​
Thanh Đào
3​
Thánh Dao
4​
Thạnh Đạo
5​
Thảnh Dao
6​
….
7​
8​
9​
10​
11​
12​
13​
Nếu muốn tìm thì cứ tìm tự nhiên thôi bạn.
 

batman1

Thành viên gạo cội
Tham gia ngày
8 Tháng chín 2014
Bài viết
4,133
Được thích
6,576
Điểm
2,568
Có 6 dấu thanh kể cả không dấu. Có D, Đ, tức 2 khả năng từ D. Vậy từ DAO có 6*2 = 12 từ khác nhau. Từ THANH có 6 từ khác nhau.. Từ THANH DAO có 6*12 = 72 tên khác nhau. Tạo 72 tên để làm cái gì? Để giải buồn?

Nếu là DON thì từ O có O, Ơ, Ô, tức 3 khả năng, nên từ DON có 6*2*3 = 36 từ. Từ THANH DON có 6*36 = 216 tên khác nhau.

Nếu có bài toán khác: Có trong CSDL 1000 tên nhân viên của công ty. Có một bản ghi gì đó mà người ta viết tên không có dấu. Hãy tìm xem tên được ghi khớp với những tên nào trong CSDL.

Bài toán trên thực tế hơn, và cách giải qyết cũng khác, và đơn giản hơn. Code sẽ tạo 1000 tên không dấu từ 1000 tên trong CSDL. Sau đó tìm tên cho trước từ 1000 tên không dấu. Tìm thấy ở những vị trí nào thì đọc từ gốc tên có dấu. Thế thôi.
 

VetMini

Chuyên gia GPE
Tham gia ngày
21 Tháng mười hai 2012
Bài viết
11,602
Được thích
14,587
Điểm
4,868
Có 6 dấu thanh kể cả không dấu. Có D, Đ, tức 2 khả năng từ D. Vậy từ DAO có 6*2 = 12 từ khác nhau. Từ THANH có 6 từ khác nhau.. Từ THANH DAO có 6*12 = 72 tên khác nhau. Tạo 72 tên để làm cái gì? Để giải buồn?
...
72 cái tên ấy bạn tìm chứ có phải thớt tìm đâu. Người ta chỉ "sáng kiến" thôi. Được rồi làm cái gì tính sau.

Chú: có nhiều từ tuy có âm nhưng không có dụng (không bao giờ dùng tới). Điển hình: doẻn, họn, ...
 

Masu1991

Thành viên mới
Tham gia ngày
21 Tháng ba 2020
Bài viết
28
Được thích
8
Điểm
103
Tuổi
29
Nếu muốn tìm thì cứ tìm tự nhiên thôi bạn.
từ một trò chơi đoán tên của một người bạn, e muốn tìm tất cả tên trên excel xem thế nào á anh.
Bài đã được tự động gộp:

Có 6 dấu thanh kể cả không dấu. Có D, Đ, tức 2 khả năng từ D. Vậy từ DAO có 6*2 = 12 từ khác nhau. Từ THANH có 6 từ khác nhau.. Từ THANH DAO có 6*12 = 72 tên khác nhau. Tạo 72 tên để làm cái gì? Để giải buồn?

Nếu là DON thì từ O có O, Ơ, Ô, tức 3 khả năng, nên từ DON có 6*2*3 = 36 từ. Từ THANH DON có 6*36 = 216 tên khác nhau.

Nếu có bài toán khác: Có trong CSDL 1000 tên nhân viên của công ty. Có một bản ghi gì đó mà người ta viết tên không có dấu. Hãy tìm xem tên được ghi khớp với những tên nào trong CSDL.

Bài toán trên thực tế hơn, và cách giải qyết cũng khác, và đơn giản hơn. Code sẽ tạo 1000 tên không dấu từ 1000 tên trong CSDL. Sau đó tìm tên cho trước từ 1000 tên không dấu. Tìm thấy ở những vị trí nào thì đọc từ gốc tên có dấu. Thế thôi.
vậy có cách nào để tìm ra tất cả các trường hợp để tạo thành 1 từ hay 1 cụm từ họ tên có nghĩa bằng excel không anh.
 

HieuCD

Chuyên gia GPE
Tham gia ngày
14 Tháng chín 2010
Bài viết
8,005
Được thích
16,258
Điểm
4,668
từ một trò chơi đoán tên của một người bạn, e muốn tìm tất cả tên trên excel xem thế nào á anh.
Bài đã được tự động gộp:


vậy có cách nào để tìm ra tất cả các trường hợp để tạo thành 1 từ hay 1 cụm từ họ tên có nghĩa bằng excel không anh.
Không có cách nào tìm từ họ tên "có nghĩa" vì họ tên nhiều khi được đặt "không có nghĩa thông thường"
 

HeSanbi

Thành viên gắn bó
Tham gia ngày
24 Tháng hai 2013
Bài viết
1,703
Được thích
2,056
Điểm
1,368

@Masu1991


Bạn dùng toán tử Like trong VBA, với cú pháp chứa các ký tự Unicode tiếng Việt
Hoặc Unicode trong Regular Expession, với bảng mã Unicode tiếng Việt
Hoặc Like trong SQL

Ví dụ dưới đây dành cho bảng mã Unicode Dựng sẵn:

"Thanh Đạo" Like "th[aáàãảạ]nh [đd][aáàãảạ]o"
Sử dụng tùy chọn Option Compare Text để so sánh không phân biệt hoa thường

Hoặc:
Regex.IgnoreCase = True
Regex.Pattern = "th[aáàãảạ]nh [đd][aáàãảạ]o"
Regex.test("Thanh Đạo")

Bạn có thể tạo một hàm chuyển đổi thay thế các ký tự đơn là a á à ã ả ạ thành một cấu trúc chung là [aáàãảạ]

aáàãảạ trong VBA thì phải viết code ở dạng Charcode sử dụng Hàm chuyển đổi charcode thành chuỗi là Hàm ChrW


Bạn có thể tham khảo hàm chuyển đổi dưới đây:

Ví dụ:
"Thanh Đạo" Like StandardText ("Thanh dao")


Toán tử Like khi áp dụng với cú pháp càng phức tạp, hàm sẽ càng chậm đi.

PHP:
'Đặt Option Compare Text trên đầu Component (Module, Class Module, Code Form)
Option Compare Text
Function StandardText(ByVal Text$) As String
  Dim z&, t$, s$, k&
  Static a$, e$, i$, o$, u$, y$, d$
  If a = vbNullString Then
    a = "[a" & ChrW(224) & ChrW(225) & ChrW(226) & ChrW(227) & ChrW(259) & ChrW(7841) & ChrW(7843) & ChrW(7845) & ChrW(7847) & ChrW(7849) & ChrW(7851) & ChrW(7853) & ChrW(7855) & ChrW(7857) & ChrW(7859) & ChrW(7861) & ChrW(7863)
    e = "[e" & ChrW(232) & ChrW(233) & ChrW(234) & ChrW(7865) & ChrW(7867) & ChrW(7869) & ChrW(7871) & ChrW(7873) & ChrW(7875) & ChrW(7877) & ChrW(7879)
    i = "[i" & ChrW(236) & ChrW(237) & ChrW(297) & ChrW(7881) & ChrW(7883)
    o = "[o" & ChrW(242) & ChrW(243) & ChrW(244) & ChrW(245) & ChrW(417) & ChrW(7885) & ChrW(7887) & ChrW(7889) & ChrW(7891) & ChrW(7893) & ChrW(7895) & ChrW(7897) & ChrW(7899) & ChrW(7901) & ChrW(7903) & ChrW(7905) & ChrW(7907)
    u = "[u" & ChrW(249) & ChrW(250) & ChrW(361) & ChrW(432) & ChrW(7909) & ChrW(7911) & ChrW(7913) & ChrW(7915) & ChrW(7917) & ChrW(7919) & ChrW(7921)
    y = "[y" & ChrW(253) & ChrW(7923) & ChrW(7925) & ChrW(7927) & ChrW(7929)
    d = "[d" & ChrW(273)
    If "a" <> "A" Then
      a = a & "A" & ChrW(65) & ChrW(192) & ChrW(193) & ChrW(194) & ChrW(195) & ChrW(258) & ChrW(7840) & ChrW(7842) & ChrW(7844) & ChrW(7846) & ChrW(7848) & ChrW(7850) & ChrW(7852) & ChrW(7854) & ChrW(7856) & ChrW(7858) & ChrW(7860) & ChrW(7862)
      e = e & "E" & ChrW(200) & ChrW(201) & ChrW(202) & ChrW(7864) & ChrW(7866) & ChrW(7868) & ChrW(7870) & ChrW(7872) & ChrW(7874) & ChrW(7876) & ChrW(7878)
      i = i & "I" & ChrW(204) & ChrW(205) & ChrW(296) & ChrW(7880) & ChrW(7882)
      o = o & "O" & ChrW(210) & ChrW(211) & ChrW(212) & ChrW(213) & ChrW(416) & ChrW(7884) & ChrW(7886) & ChrW(7888) & ChrW(7890) & ChrW(7892) & ChrW(7894) & ChrW(7896) & ChrW(7898) & ChrW(7900) & ChrW(7902) & ChrW(7904) & ChrW(7906)
      u = u & "U" & ChrW(217) & ChrW(218) & ChrW(360) & ChrW(431) & ChrW(7908) & ChrW(7910) & ChrW(7912) & ChrW(7914) & ChrW(7916) & ChrW(7918) & ChrW(7920)
      y = y & "Y" & ChrW(221) & ChrW(7922) & ChrW(7924) & ChrW(7926) & ChrW(7928)
      d = d & "D" & ChrW(272)
    End If
    a = a & "]": e = e & "]": i = i & "]": o = o & "]": u = u & "]": y = y & "]": d = d & "]"
  End If
  For k = 1 To Len(Text)
    t = VBA.Strings.Mid$(Text, k, 1): z = AscW(t)
    Select Case z
    Case 97, 224, 225, 226, 227, 259, 7841, 7843, 7845, 7847, 7849, 7851, 7853, 7855, 7857, 7859, 7861, 7863, 65, 192, 193, 194, 195, 258, 7840, 7842, 7844, 7846, 7848, 7850, 7852, 7854, 7856, 7858, 7860, 7862:
      s = s & a
    Case 101, 232, 233, 234, 7865, 7867, 7869, 7871, 7873, 7875, 7877, 7879, 69, 200, 201, 202, 7864, 7866, 7868, 7870, 7872, 7874, 7876, 7878:
      s = s & e
    Case 105, 236, 237, 297, 7881, 7883, 73, 204, 205, 296, 7880, 7882:
      s = s & i
    Case 111, 242, 243, 244, 245, 417, 7885, 7887, 7889, 7891, 7893, 7895, 7897, 7899, 7901, 7903, 7905, 7907, 79, 210, 211, 212, 213, 416, 7884, 7886, 7888, 7890, 7892, 7894, 7896, 7898, 7900, 7902, 7904, 7906
      s = s & o
    Case 117, 249, 250, 361, 432, 7909, 7911, 7913, 7915, 7917, 7919, 7921, 85, 217, 218, 360, 431, 7908, 7910, 7912, 7914, 7916, 7918, 7920:
      s = s & u
    Case 121, 253, 7923, 7925, 7927, 7929, 89, 221, 7922, 7924, 7926, 7928
      s = s & y
    Case 68, 272, 100, 273:
      s = s & d
    Case 91, 93, 42, 63, 35:
      s = s & "[" & t & "]"
    Case Else:
      If LCase(t) <> UCase(t) Then
        s = s & "[" & LCase(t) & UCase(t) & "]"
      Else
        s = s & t
      End If
    End Select
  Next
  StandardText = s
End Function
Hàm rút gọn:
PHP:
Function StandardText(ByVal Text$) As String
  Dim t$, s$, k&
  Static a$, e$, i$, o$, u$, y$, d$
  If a = vbNullString Then
    a = "[a" & ChrW(224) & ChrW(225) & ChrW(226) & ChrW(227) & ChrW(259) & ChrW(7841) & ChrW(7843) & ChrW(7845) & ChrW(7847) & ChrW(7849) & ChrW(7851) & ChrW(7853) & ChrW(7855) & ChrW(7857) & ChrW(7859) & ChrW(7861) & ChrW(7863)
    e = "[e" & ChrW(232) & ChrW(233) & ChrW(234) & ChrW(7865) & ChrW(7867) & ChrW(7869) & ChrW(7871) & ChrW(7873) & ChrW(7875) & ChrW(7877) & ChrW(7879)
    i = "[i" & ChrW(236) & ChrW(237) & ChrW(297) & ChrW(7881) & ChrW(7883)
    o = "[o" & ChrW(242) & ChrW(243) & ChrW(244) & ChrW(245) & ChrW(417) & ChrW(7885) & ChrW(7887) & ChrW(7889) & ChrW(7891) & ChrW(7893) & ChrW(7895) & ChrW(7897) & ChrW(7899) & ChrW(7901) & ChrW(7903) & ChrW(7905) & ChrW(7907)
    u = "[u" & ChrW(249) & ChrW(250) & ChrW(361) & ChrW(432) & ChrW(7909) & ChrW(7911) & ChrW(7913) & ChrW(7915) & ChrW(7917) & ChrW(7919) & ChrW(7921)
    y = "[y" & ChrW(253) & ChrW(7923) & ChrW(7925) & ChrW(7927) & ChrW(7929)
    d = "[d" & ChrW(273)
    If "a" <> "A" Then
      a = a & "A" & ChrW(65) & ChrW(192) & ChrW(193) & ChrW(194) & ChrW(195) & ChrW(258) & ChrW(7840) & ChrW(7842) & ChrW(7844) & ChrW(7846) & ChrW(7848) & ChrW(7850) & ChrW(7852) & ChrW(7854) & ChrW(7856) & ChrW(7858) & ChrW(7860) & ChrW(7862)
      e = e & "E" & ChrW(200) & ChrW(201) & ChrW(202) & ChrW(7864) & ChrW(7866) & ChrW(7868) & ChrW(7870) & ChrW(7872) & ChrW(7874) & ChrW(7876) & ChrW(7878)
      i = i & "I" & ChrW(204) & ChrW(205) & ChrW(296) & ChrW(7880) & ChrW(7882)
      o = o & "O" & ChrW(210) & ChrW(211) & ChrW(212) & ChrW(213) & ChrW(416) & ChrW(7884) & ChrW(7886) & ChrW(7888) & ChrW(7890) & ChrW(7892) & ChrW(7894) & ChrW(7896) & ChrW(7898) & ChrW(7900) & ChrW(7902) & ChrW(7904) & ChrW(7906)
      u = u & "U" & ChrW(217) & ChrW(218) & ChrW(360) & ChrW(431) & ChrW(7908) & ChrW(7910) & ChrW(7912) & ChrW(7914) & ChrW(7916) & ChrW(7918) & ChrW(7920)
      y = y & "Y" & ChrW(221) & ChrW(7922) & ChrW(7924) & ChrW(7926) & ChrW(7928)
      d = d & "D" & ChrW(272)
    End If
    a = a & "]": e = e & "]": i = i & "]": o = o & "]": u = u & "]": y = y & "]": d = d & "]"
  End If
  For k = 1 To Len(Text)
    t = VBA.Strings.Mid$(Text, k, 1)
    Select Case True
    Case t Like a: s = s & a
    Case t Like e: s = s & e
    Case t Like i: s = s & i
    Case t Like o: s = s & o
    Case t Like u: s = s & u
    Case t Like y: s = s & y
    Case t Like d: s = s & d
    Case t Like "[]]", t Like "[[#*?]": s = s & "[" & t & "]"
    Case Else:
      If LCase(t) <> UCase(t) Then
        s = s & "[" & LCase(t) & UCase(t) & "]"
      Else
        s = s & t
      End If
    End Select
  Next
  StandardText = s
End Function
 
Lần chỉnh sửa cuối:

batman1

Thành viên gạo cội
Tham gia ngày
8 Tháng chín 2014
Bài viết
4,133
Được thích
6,576
Điểm
2,568

@Masu1991


Bạn dùng toán tử Like trong VBA, với cú pháp chứa các ký tự Unicode tiếng Việt
Hoặc Unicode trong Regular Expession, với bảng mã Unicode tiếng Việt
Hoặc Like trong SQL

Ví dụ dưới đây dành cho bảng mã Unicode Dựng sẵn:

"Thanh Đạo" Like "th[aáàãảạ]nh [đd][aáàãảạ]o"
Sử dụng tùy chọn Option Compare Text để so sánh không phân biệt hoa thường
1. Đây có lẽ là code có tham vọng giải bài toán của tôi. Tức có các tên trong CSDL (vd. Thanh Đạo) và cần phải kiểm tra xem chúng có khớp với tên không dấu cho trước (Thanh Dao) hay không

Bài toán của chủ thớt "ngược lại". Cho trước tên không dấu "Thanh Dao". Hãy tìm TẤT CẢ các tên có ý nghĩa trong tiếng Việt mà khớp với "Thanh Dao". Với code biểu diễn và với "Thanh Dao" cho trước thì TẤT CẢ các tên khớp liệt kê ra bằng cách nào? Rõ ràng hàm StandardText không trả về mảng TẤT CẢ các tên khớp.

2. Về lý thuyết thì làm được nhưng làm theo cách bài #8 thì vẫn chưa được.
- rõ ràng "Thanh Được" khớp với "Thanh Duoc", nhưng "Thanh Được" Like StandardText ("Thanh Duoc") trả về FALSE.

- rõ ràng "Diệu Anh" khớp với "Dieu Anh", nhưng "Diệu Anh" Like StandardText("Dieu Anh") trả về FALSE.

Còn nhiều lắm.

Theo tôi để làm bài của tôi thì cứ biến các tên trong CSDL sang không dấu, rồi kiểm tra xem chúng có y như (=) tên không dấu cho trước hay không. Chả LIKE gi cả.

Để biến văn bản có dấu thành không dấu thì tôi cũng có code trên GPE 7, 8 năm nay rồi.
 
Lần chỉnh sửa cuối:

HeSanbi

Thành viên gắn bó
Tham gia ngày
24 Tháng hai 2013
Bài viết
1,703
Được thích
2,056
Điểm
1,368

@batman1

Lỗi do quá trình chỉnh sửa code bị sai sót. Bác tải lại để test. Và code chỉ để test.
Giải bài này cũng đơn giản, nếu chịu khó, và có quyết tâm.

Đau đầu nếu từ không phải tiếng Việt mà code vẫn cho kết quả thì cười ra nước mắt thôi.
 
Lần chỉnh sửa cuối:

batman1

Thành viên gạo cội
Tham gia ngày
8 Tháng chín 2014
Bài viết
4,133
Được thích
6,576
Điểm
2,568

Giải bài này cũng đơn giản, nếu chịu khó, và có quyết tâm.​

Không có chỗ nào tôi nói là khó. :D

Dù thế nào thì code mới chỉ giải bài toán mà tôi đề nghị, chứ không giải bài toán của chủ thớt.
 
Top Bottom