Chuyển các dấu trong tiếng việt thành số

Liên hệ QC

BinhTam

Thành viên thường trực
Tham gia
2/12/06
Bài viết
238
Được thích
30
Chào các bạn,

Mình muốn chuyển các dấu sắc, huyền, hỏi, ngã, nặng trong chuỗi thành các số (Sắc:1, Huyền:2,Hỏi:3,Ngã:4, nặng:5)

ví dụ: ô A1="Nguyễn Thanh Hùng"=>ô B2=Nguyên4 Thanh Hung2
ô A2="Trần Sắc"=>ô B2=Trân2 Săc1
v.v...,

Rất mong nhận được code hỗ trợ của các bạn.

Thanks,
Tâm
 

File đính kèm

  • chuyendauthanhso.zip
    5.9 KB · Đọc: 10
Bạn có thể cho biết mục đích của bạn không?
 
Chào bạn,

Chào bạn,

Thật sự mình muốn gán giá trị cho ký tự để tính điểm cho chuỗi họ tên
nhưng đến khi gặp phần dấu trong tiếng việt trong đường link bên dưới

http://www.giaiphapexcel.com/forum/showthread.php?83187-Chia-Đôi-chuỗi-họ-tên

không biết làm cách nào nên mình nghĩ chỉ cần chuyển các dấu "sắc, huyền, hỏi, ngã và nặng" trong chuỗi họ tên thành số là hàm vlookup sẽ dò tìm được giá trị trong danh sách

Rất mong nhận được thông tin trợ giúp từ bạn.

Thanks,
Tâm




Bạn có thể cho biết mục đích của bạn không?
 
Chào bạn,

Chào bạn,

Thật sự mình muốn gán giá trị cho ký tự để tính điểm cho chuỗi họ tên
nhưng đến khi gặp phần dấu trong tiếng việt trong đường link bên dưới

http://www.giaiphapexcel.com/forum/showthread.php?83187-Chia-Đôi-chuỗi-họ-tên

không biết làm cách nào nên mình nghĩ chỉ cần chuyển các dấu "sắc, huyền, hỏi, ngã và nặng" trong chuỗi họ tên thành số là hàm vlookup sẽ dò tìm được giá trị trong danh sách

Rất mong nhận được thông tin trợ giúp từ bạn.

Thanks,
Tâm

Vậy thì người ta làm luôn 1 lần đi
Trong đường link ở trên bạn quy định:
- Chữ â = 3
- Dấu sắc = 30
Vậy thì ta tính luôn thành 33 đi cho xong (cần gì phải qua công đoạn chuyển dấu thành số cho mất công)
 
Lúc cần mở chủ đề mới thì bạn lại không mở, lúc không cần thì bạn lại mở. Lẽ ra cái bài Gán giá trị cho chuỗi tên bạn phải mở topic mới chứ không nên hỏi trong chủ đề Chia đôi chuỗi họ tên, và bài này đáng lẽ phải hỏi chung với phần Gán giá trị cho chuỗi tên
 
Nếu vậy danh sách dò tìm sẽ sữa lại mới và sẽ rất nhiều.
ví dụ: a có 5 dấu, phải thêm vào danh sách a,á,ả,ạ,ầ,è,é,ẹ,v.v,..
Cảm ơn ý tưởng mới của bạn.

Nếu có được code chuyển thì thật tuyệt vì lúc đó mình chỉ cần sữa lại danh sách dò tìm 5 dấu này(sắc,huyền,hỏi,ngã và nặng) thành 5 số 1,2,3,4,5
 
Lần chỉnh sửa cuối:
Cảm ơn bạn đã thông báo.
 
Nếu vậy danh sách dò tìm sẽ sữa lại mới và sẽ rất nhiều.
ví dụ: a có 5 dấu, phải thêm vào danh sách a,á,ầ,è,é,ẹ,v.v,..
Cảm ơn ý tưởng mới của bạn.

Nếu có được code chuyển thì thật tuyệt.

Liệt kê toàn bộ các ký tự, kể cả ký tự có dấu ta được 93 trường hợp
Vậy việc của bạn là: Tạo 1 bảng tra cứu (từ ký tự ra số) rồi mọi người sẽ giúp bạn phần code
Lưu ý: Khoảng trắng chưa thấy bạn đề cập
 
Lần chỉnh sửa cuối:
Nếu vậy danh sách sẽ lên 92
Mình không tính khoảng trắng
 

File đính kèm

  • kytu.zip
    8.4 KB · Đọc: 4
Nếu vậy danh sách sẽ lên 92
Mình không tính khoảng trắng
Theo bảng tra thì:
- Chữ i = 12
- Chữ e = 8
- Dấu sắc = 30
- Dấu nặng = 34
Vậy
- Chữ í sẽ = 12 + 30 = 42
- Chữ sẽ = 8 + 34 = 42
Tức chữ í sẽ bằng chữ hả bạn?
 
Của bạn chưa đề cập chữ thường và chữ hoa
 
eNéu xét cả chữ thường và chữ hoa thì có trên 200 các ký tự tiếng Việt. Trước hết,mình tham gia 2 hàm UDF tham khảo cách sử lý chuỗi của thày Phạm Duy Long như sau:
1/Khai báo 2 chuỗi mã ký tự Unicode
Mã:
Option Explicit
Const UniCode1 = "97   98   99   100  101  102  103  104  105  106  107  108  109  110  111  112  113  114  115  116  117  118  119  120  121  122  65   66   67   68   69   70   71   72   73   74   75   76   77   78   79   80   81   82   83   84   85   86   87   88   89   90   "
Const UniCode2 = "225  224  7843 227  7841 259  7855 7857 7859 7861 7863 226  7845 7847 7849 7851 7853 233  232  7867 7869 7865 234  7871 7873 7875 7877 7879 237  236  7881 297  7883 243  242  7887 245  7885 244  7889 7891 7893 7895 7897 417  7899 7901 7903 7905 7907 250  249  7911 361  7909 432  7913 7915 7917 7919 7921 253  7923 7927 7929 7925 273  193  193  192  192  7842 7842 195  195  7840 7840 258  258  7854 7854 7856 7856 7858 7858 7860 7860 7862 7862 194  194  7844 7844 7846 7846 7848 7848 7850 7850 7852 7852 201  201  200  200  7866 7866 7868 7868 7864 7864 202  202  7870 7870 7872 7872 7874 7874 7876 7876 7878 7878 205  204  7880 296  7882 211  211  210  210  7886 7886 213  213  7884 7884 212  212  7888 7888 7890 7890 7892 7892 7894 7894 7896 7896 416  7898 7898 7900 7900 7902 7902 7904 7904 7906 7906 218  218  217  217  7910 7910 360  360  7908 7908 431  7912 7912 7914 7914 7916 7916 7918 7918 7920 7920 221  221  7922 7922 7926 7926 7928 7928 7924 272  "

2/ Chuyển tự ký tự sang số:

Mã:
Public Function StrNum(Ch As String) As String
Dim tmp, Kt, i, j
For i = 1 To Len(Ch)
Kt = Mid(Ch, i, 1)
If InStr(1, UniCode1, Left(AscW(Kt) & Space(5), 5)) > 0 Then _
tmp = tmp & IIf(Len(tmp) = 0, "", ",") & Int((InStr(1, UniCode1, Left(AscW(Kt) & Space(5), 5))) / 5) + 1
If InStr(1, UniCode2, Left(AscW(Kt) & Space(5), 5)) > 0 Then _
tmp = tmp & IIf(Len(tmp) = 0, "", ",") & Int((InStr(1, UniCode2, Left(AscW(Kt) & Space(5), 5))) / 5) + 53
Next
StrNum = tmp
End Function

3/Chuyển từ số thành ký tự:

Mã:
Public Function NumStr(Ch As String) As String
Dim tmp, mStr, i
tmp = Split(Ch, ",")
For i = 0 To UBound(tmp)
If Val(tmp(i)) > 52 Then
mStr = mStr & ChrW(Mid(UniCode2, (Val(tmp(i)) - 52) * 5 - 4, 5))
Else
mStr = mStr & ChrW(Mid(UniCode1, Val(tmp(i)) * 5 - 4, 5))
End If
Next
NumStr = mStr
End Function

Sử dụng như trong file
 

File đính kèm

  • Ky tu.xls
    39 KB · Đọc: 7
Nếu tính lẻ như bạn thì chữ í=ẹ

Bạn có giải pháp mới cho code hay danh sách?

Thanks,
Tâm
 
Lần chỉnh sửa cuối:
Chào bạn Sealand,

Chuỗi họ tên trong trình này không cần phân biệt hoa hay thường

bạn có thể viết lại hàm này sao cho khi gặp chuỗi có dấu "sắc, huyền, hỏi, ngã và nặng" sang số 1,2,3,4,5?

ví dụ: ô A1="Trần"=>ô B2="Trân2"
hoặc ô A1="Nguyễn Thanh Tuấn"=>ô B2="Nguyên4 Thanh Tuân1"
v.v...

Thanks,
Tâm
 
Chào bạn Sealand,

Chuỗi họ tên trong trình này không cần phân biệt hoa hay thường

bạn có thể viết lại hàm này sao cho khi gặp chuỗi có dấu "sắc, huyền, hỏi, ngã và nặng" sang số 1,2,3,4,5?

ví dụ: ô A1="Trần"=>ô B2="Trân2"
hoặc ô A1="Nguyễn Thanh Tuấn"=>ô B2="Nguyên4 Thanh Tuân1"
v.v...

Thanks,
Tâm
Mục đích cuối cùng của bạn là chuyển 1 ký tự, 1 từ hoặc 1 câu thành 1 con số nào đó. Vậy thì cần quái gì qua công đoạn trung gian Trần biến thành Trân2 làm gì cho mất công
------------
Bạn cho tôi 1 bảng mã đầy đủ, tôi làm bài này thậm chí bằng công thức cũng được (khỏi cần VBA luôn)
 
Lần chỉnh sửa cuối:
Vậy thì thế này:

1/ Khai báo 3 chuỗi mã:

Mã:
Option Explicit
Const Ma1 = "225 224 7843227 78417855785778597861786378457847784978517853233 232 78677869786578717873787578777879237 236 7881297 7883243 242 7887245 78857889789178937895789778997901790379057907250 249 7911361 790979137915791779197921253 7923792779297925193 192 7842195 78407854785678587860786278447846784878507852201 200 78667868786478707872787478767878205 204 7880296 7882211 210 7886213 78847888789078927894789678987900790279047906218 217 7910360 790879127914791679187920221 7922792679287924"
Const Ma2 = "97 97 97 97 97 25925925925925922622622622622610110110110110123423423423423410510510510510511111111111111124424424424424441741741741741711711711711711743243243243243212112112112112165 65 65 65 65 25825825825825819419419419419469 69 69 69 69 20220220220220273 73 73 73 73 79 79 79 79 79 21221221221221241641641641641685 85 85 85 85 43143143143143189 89 89 89 89 "
Const Ma3 = "123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345"

2/Viết hàm UDF chuyển như sau:
Mã:
Public Function TvNum(Ch As String) As String
Dim tmp, Kt, i, j, so
Ch = Trim(Ch)
For i = 1 To Len(Ch)
Kt = Mid(Ch, i, 1)
If InStr(1, Ma1, Left(AscW(Kt) & Space(4), 4)) > 0 Then
j = Int(InStr(1, Ma1, Left(AscW(Kt) & Space(4), 4)) / 4) + 1
'so = Mid(Ma3, j, 1)
so = Int(j / 5) + 1
tmp = tmp & ChrW(Mid(Ma2, j * 3 - 2, 3))
Else
If Kt = " " Then
tmp = tmp & so & " "
so = ""
Else
tmp = tmp & Kt
End If
End If
Next
TvNum = tmp & so
End Function

Cú pháp: =TvNum(Tên cần chuyển)
 

File đính kèm

  • Ky tu 2.rar
    8.2 KB · Đọc: 16
Lần chỉnh sửa cuối:
Chào bạn,

Chào bạn,

Thật sự mình muốn gán giá trị cho ký tự để tính điểm cho chuỗi họ tên
nhưng đến khi gặp phần dấu trong tiếng việt trong đường link bên dưới

http://www.giaiphapexcel.com/forum/showthread.php?83187-Chia-Đôi-chuỗi-họ-tên

không biết làm cách nào nên mình nghĩ chỉ cần chuyển các dấu "sắc, huyền, hỏi, ngã và nặng" trong chuỗi họ tên thành số là hàm vlookup sẽ dò tìm được giá trị trong danh sách

Rất mong nhận được thông tin trợ giúp từ bạn.

Thanks,
Tâm

Bạn hãy nói mục đích cuối cùng của bạn. Không phải là "mình muốn gán giá trị cho ký tự để tính điểm cho chuỗi họ tên". Vì nếu bạn có Trần = Tran2 hay Trần = x + y + ... + z = 89 chẳng hạn thì bạn định dùng số 89 để làm gì? Ví dụ cụ thể nhé. Vì nếu biến một từ thành 1 số thì rất có thể 2 từ khác nhau sẽ được gán cho 1 số. Số đó là vô dụng vì nó không thể xác định từ nguồn được.
Hãy nói để người khác hiểu được ý mình.
 
Bạn hãy nói mục đích cuối cùng của bạn. Không phải là "mình muốn gán giá trị cho ký tự để tính điểm cho chuỗi họ tên". Vì nếu bạn có Trần = Tran2 hay Trần = x + y + ... + z = 89 chẳng hạn thì bạn định dùng số 89 để làm gì? Ví dụ cụ thể nhé. Vì nếu biến một từ thành 1 số thì rất có thể 2 từ khác nhau sẽ được gán cho 1 số. Số đó là vô dụng vì nó không thể xác định từ nguồn được.
Hãy nói để người khác hiểu được ý mình.

Mình làm theo yêu cầu thôi, chứ đúng như bác Siwtom nói đấy, Khi cộng thứ tự các ký tự lại nó sẽ cho 1 con số như 89 chẳng hạn. Nhưng không phải 1 phương án ghép ký tự thành số 89 mà có thể nhiều trường hợp cho số 89 và từ số 89 dịch ngược thì bó tay (Cực kỳ phức tạp).
Vậy nếu biết mục đích thì rất có thể anh em đề xuất phương án hợp lý hơn, tránh rơi vào tình huống bế tắc hay phức tạp hoá vấn đề.
 
Chào Sealand,

Cảm ơn bạn
1. Code file đính kèm thì đúng theo yêu cầu: Sắc=1, huyền=2, hỏi=3, ngã=4, nặng=5
Cảm ơn bạn rất nhiều.
2.Mục đích của bài này: mình dùng tính điểm chuỗi tên và ứng dụng trong kinh dịch
nếu dùng code theo của bạn sealand thì danh sách dò tìm của mình vẫn nguyên(chỉ 34 hàng) chỉ cần thay đổi Sắc=1, huyền=2, hỏi=3, ngã=4, nặng=5 thì và áp dụng trong công thức của file mình đính kèm vẫn tính điểm được.

-Cách của bạn ndu96081631 cũng hay tuy nhiên mình phải tạo danh sách dò tìm lên đến 92.

Thanks,
Tâm
 

File đính kèm

  • kytu.zip
    18.1 KB · Đọc: 8
Lần chỉnh sửa cuối:
-Cách của bạn ndu96081631 cũng hay tuy nhiên mình phải tạo danh sách dò tìm lên đến 92.
Bạn tạo bước đầu thôi.. để từ đó người ta có cơ sở để tính toán... Mai này ứng dụng thực tế, có ai bắt bạn phải tạo bảng lần nữa đâu
Làm việc gì cũng phải hợp logic, ý tôi là thế. Còn bạn tính sao thì tùy
 
Web KT
Back
Top Bottom