ledangvan > 15-08-21, 10:24 PM
paulsteigel > 21-08-21, 06:56 PM
Sub Convert()
' Thủ tục mở bảng ra và chuyển dữ liệu với các trường có kiểu là text
Dim Sql As String, tblArr As Variant, i As Long, j As Long
Dim tblRcs As New Recordset, Con As New Connection, FldStr As String
Set Con = CurrentProject.Connection
' tao mot danh sach cac bang can convert
tblArr = Array("bang1", "bang2", "bang3")
' Doan sau day se tu mo bang ra va tim cac truong co kieu Text de convert
For i = 0 To UBound(tblArr)
tblRcs.Open tblArr(i), Con
For j = 0 To tblRcs.Fields.Count - 1
If InStr("129,130,202,200,203,201", tblRcs.Fields(j).Type) > 0 Then ' đoạn này để kiểm tra kiểu trường theo danh mục mình tạo sẵn cho nhanh, đỡ phải làm nhiều lệnh if or ...vv
' text field, need conversion
' Chu y cu phap ham Convertext, tham so 0,1,2,3,4...)
FldStr = FldStr & ", a.[" & tblRcs.Fields(j).name & "] = ConvertText(a.[" & tblRcs.Fields(j).name & "],0)"
End If
Next
FldStr = Mid(FldStr, 2) ' loai bo dau phay ","
tblRcs.Close
Sql = "UPDATE " & tblArr(i) & " AS a SET " & FldStr & ";"
' run querry....
CurrentDb.Execute Sql
Next
End Sub
Function VowelsToArray(CharVowels As String, Optional MuliChartype As Boolean = True) As Variant
' Put the multichar Vowels to an array
On Error GoTo errmsg
Dim i As Integer, j As Integer, mText As String '
Dim mTmpArr As Variant
' Send the text into an Array of 134 items
mText = CharVowels
If MuliChartype = True Then ' this is a multchar list
mTmpArr = Split(CharVowels, "/")
Else ' this is a single char
mTmpArr = Array(133)
For i = 1 To Len(mText)
' now extracting the list
mTmpArr(i - 1) = Mid(mText, i, 1) & CStr(i)
Next
End If
VowelsToArray = mTmpArr
Exit Function
errmsg:
MsgBox Err.Description & " " & j & Len(mText) & "//" & mText & "//"
End Function
Function GetUnicodeString() As String
' This function is no longer kept but I still would like it to be here for some folks if they want to diggest
Dim iUnicode As Variant ' array to keep unicode char set
Dim i As Long, iStr As String
iUnicode = Array(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, 192, _
7842, 195, 7840, 258, 7854, 7856, 7858, 7860, 7862, 194, 7844, 7846, 7848, 7850, 7852, 201, 200, 7866, _
7868, 7864, 202, 7870, 7872, 7874, 7876, 7878, 205, 204, 7880, 296, 7882, 211, 210, 7886, 213, 7884, _
212, 7888, 7890, 7892, 7894, 7896, 416, 7898, 7900, 7902, 7904, 7906, 218, 217, 7910, 360, 7908, 431, _
7912, 7914, 7916, 7918, 7920, 221, 7922, 7926, 7928, 7924, 272)
For i = 0 To UBound(iUnicode)
iStr = iStr & "/" & ChrW(iUnicode(i))
Next
GetUnicodeString = Mid(iStr, 2)
End Function
Private Function GetStringFromNumber(Arr As Variant) As Variant
Dim i As Long, tmpArr() As String
ReDim tmpArr(UBound(Arr))
For i = 0 To UBound(Arr)
tmpArr(i) = AscW(Arr(i))
Next
GetStringFromNumber = tmpArr
End Function
Function ConvertText(txtString As String, Optional CodePage As Long = 0) As String
' This function will do the conversion of text string into unicode
Dim iStr As String, ProcStr As String, RevList As String
Dim i As Long, ElmNum As Long
Dim iUnicode As Variant ' array to keep unicode char set
Dim iTCVN As Variant ' array to keep TCVN char set
Dim ProcList As Variant, ProcVar As Variant, SeedVar As Variant ' array to keep what to convert
Dim RevArr As Variant ' keep resersed list for later work
Dim MultiChar As Boolean
'parse the parameter into this local variable
iStr = txtString
mText = txtString
iUnicode = VowelsToArray(GetUnicodeString())
' Day la de doan code dau vao cua VNI, neu muon voi TCVN thi comment lai doan nay và bo comment doan itcvn duoi day nhe
iVNI = VowelsToArray("aù/aø/aû/aõ/aï/aê/aé/aè/aú/aü/aë/aâ/aá/aà/aå/aã/aä/eù/eø/eû/eõ/eï/eâ/eá/eà/eå/" & _
"eã/eä/í/ì/æ/ó/ò/où/oø/oû/oõ/oï/oâ/oá/oà/oå/oã/oä/ô/ôù/ôø/ôû/ôõ/ôï/uù/uø/uû/uõ/uï/ö/" & _
"öù/öø/öû/öõ/öï/yù/yø/yû/yõ/î/ñ/AÙ/AØ/AÛ/AÕ/AÏ/AÊ/AÉ/AÈ/AÚ/AÜ/AË/AÂ/AÁ/AÀ/AÅ/AÃ/AÄ/EÙ/EØ/" & _
"EÛ/EÕ/EÏ/EÂ/EÁ/EÀ/EÅ/EÃ/EÄ/Í/Ì/Æ/Ó/Ò/OÙ/OØ/OÛ/OÕ/OÏ/OÂ/OÁ/OÀ/OÅ/OÃ/OÄ/Ô/ÔÙ/ÔØ/ÔÛ/ÔÕ/ÔÏ/" & _
"UÙ/UØ/UÛ/UÕ/UÏ/Ö/ÖÙ/ÖØ/ÖÛ/ÖÕ/ÖÏ/YÙ/YØ/YÛ/YÕ/Î/Ñ")
iTCVN = VowelsToArray("¸/µ/¶/·/¹/¨/¾/»/¼/½/Æ/©/Ê/Ç/È/É/Ë/Ð/Ì/Î/Ï/Ñ/ª/Õ/Ò/Ó/Ô/Ö/Ý/×/Ø/Ü/Þ/ã/ß/" & _
"á/â/ä/«/è/å/æ/ç/é/¬/í/ê/ë/ì/î/ó/ï/ñ/ò/ô//ø/õ/ö/÷/ù/ý/ú/û/ü/þ/®/¸/µ/¶/·/¹/¡/¾/»/¼/½/Æ/¢/Ê/" & _
"Ç/È/É/Ë/Ð/Ì/Î/Ï/Ñ/£/Õ/Ò/Ó/Ô/Ö/Ý/×/Ø/Ü/Þ/ã/ß/á/â/ä/¤/è/å/æ/ç/é/¥/í/ê/ë/ì/î/ó/ï/ñ/ò/ô/¦/ø/õ/ö" & _
"/÷/ù/ý/ú/û/ü/þ/§")
Select Case CodePage
Case 0: 'From TCVN to Unicode
SeedVar = iTCVN
ProcVar = iUnicode
Case 1: 'From VNI to Unicode
SeedVar = iVNI
ProcVar = iUnicode
Case 2: 'From Unicode to TCVN
SeedVar = iUnicode
ProcVar = iTCVN
Case 3: 'From Unicode to VNI
SeedVar = iUnicode
ProcVar = iVNI
Case 4: 'From VNI to TCVN
SeedVar = iVNI
ProcVar = iTCVN
Case 5: 'From TCVN to VNI
SeedVar = iTCVN
ProcVar = iVNI
End Select
MultiChar = IIf(Len(SeedVar(i)) > 1, True, False)
' First forward conversion to a medium string
For i = 0 To UBound(SeedVar)
If MultiChar And Len(SeedVar(i)) = 1 Then
' skip for now and move to the next multichar item in the list but remember it!
' Chỗ này xử lý các chuỗi đơn trong bảng mã 2byte, phải làm sau vì bảng mã 2byte có các chuỗi 1byte nằm trong list và dễ gây nhầm lẫn khi chuyển đổi giữ chuỗi gốc (cần chuyển) và chuỗi đích
RevList = RevList & "," & i
Else
If InStr(iStr, SeedVar(i)) > 0 Then
'only convert if found a match
iStr = Replace(iStr, SeedVar(i), "[[" & i & "]]")
ProcStr = ProcStr & ",[[" & i & "]]"
End If
End If
Next
' now for the remaining code page
RevArr = Split(RevList, ",")
For i = 0 To UBound(RevArr)
ElmNum = Val(RevArr(i))
If InStr(iStr, SeedVar(ElmNum)) > 0 Then
'only convert if found a match
iStr = Replace(iStr, SeedVar(ElmNum), "[[" & ElmNum & "]]")
ProcStr = ProcStr & ",[[" & ElmNum & "]]"
End If
Next
ProcList = Split(ProcStr, ",")
' Now convertback
For i = 0 To UBound(ProcList)
If ProcList(i) <> "" Then
ElmNum = Val(Mid(ProcList(i), 3))
iStr = Replace(iStr, ProcList(i), ProcVar(ElmNum))
End If
Next
ConvertText= iStr
End Function
ongke0711 > 21-08-21, 09:45 PM
(21-08-21, 06:56 PM)paulsteigel Đã viết: ...
Mã PHP:Sub Convert()
' Thủ tục mở bảng ra và chuyển dữ liệu với các trường có kiểu là text
Dim Sql As String, tblArr As Variant, i As Long, j As Long
Dim tblRcs As New Recordset, Con As New Connection, FldStr As String
Set Con = CurrentProject.Connection
' tao mot danh sach cac bang can convert
tblArr = Array("bang1", "bang2", "bang3")
' Doan sau day se tu mo bang ra va tim cac truong co kieu Text de convert
For i = 0 To UBound(tblArr)
tblRcs.Open tblArr(i), Con
For j = 0 To tblRcs.Fields.Count - 1
If InStr("129,130,202,200,203,201", tblRcs.Fields(j).Type) > 0 Then ' đoạn này để kiểm tra kiểu trường theo danh mục mình tạo sẵn cho nhanh, đỡ phải làm nhiều lệnh if or ...vv
' text field, need conversion
' Chu y cu phap ham Convertext, tham so 0,1,2,3,4...)
FldStr = FldStr & ", a.[" & tblRcs.Fields(j).name & "] = ConvertText(a.[" & tblRcs.Fields(j).name & "],0)"
End If
Next
FldStr = Mid(FldStr, 2) ' loai bo dau phay ","
tblRcs.Close
Sql = "UPDATE " & tblArr(i) & " AS a SET " & FldStr & ";"
' run querry....
CurrentDb.Execute Sql
Next
End Sub
paulsteigel > 21-08-21, 09:58 PM
(21-08-21, 09:45 PM)ongke0711 Đã viết:(21-08-21, 06:56 PM)paulsteigel Đã viết: ...
Mã PHP:Sub Convert()
' Thủ tục mở bảng ra và chuyển dữ liệu với các trường có kiểu là text
Dim Sql As String, tblArr As Variant, i As Long, j As Long
Dim tblRcs As New Recordset, Con As New Connection, FldStr As String
Set Con = CurrentProject.Connection
' tao mot danh sach cac bang can convert
tblArr = Array("bang1", "bang2", "bang3")
' Doan sau day se tu mo bang ra va tim cac truong co kieu Text de convert
For i = 0 To UBound(tblArr)
tblRcs.Open tblArr(i), Con
For j = 0 To tblRcs.Fields.Count - 1
If InStr("129,130,202,200,203,201", tblRcs.Fields(j).Type) > 0 Then ' đoạn này để kiểm tra kiểu trường theo danh mục mình tạo sẵn cho nhanh, đỡ phải làm nhiều lệnh if or ...vv
' text field, need conversion
' Chu y cu phap ham Convertext, tham so 0,1,2,3,4...)
FldStr = FldStr & ", a.[" & tblRcs.Fields(j).name & "] = ConvertText(a.[" & tblRcs.Fields(j).name & "],0)"
End If
Next
FldStr = Mid(FldStr, 2) ' loai bo dau phay ","
tblRcs.Close
Sql = "UPDATE " & tblArr(i) & " AS a SET " & FldStr & ";"
' run querry....
CurrentDb.Execute Sql
Next
End Sub
Hôm trước cũng có làm cái vụ chuyển đổi này, cách làm thì cũng gần giống như cách anh hướng dẫn ở trên.
- File demo này dùng DAO Recordset và chỉ convert mỗi font TCVN3 (chưa tích hợp VNI vô).
- Chỉ chọn Field dạng TEXT và bỏ qua các field dùng làm INDEX, PK.
* Cái hàm ConvertText của anh chuyển font TCVN3 bị lỗi chữ: ố, ửi. Cũng đã test nhiều bộ code chuyển đổi khác đều bị như vậy, cuối cùng cũng tìm ra một code bên CaulacboVB chuyển đổi tốt. Anh Văn cũng có chuyển cho một bộ code chạy tốt vụ đổi TCVN3.
Link file cho các bạn nào cần chuyển đổi.
Link: https://www.mediafire.com/file/11fjmaarn...accdb/file
paulsteigel > 21-08-21, 10:00 PM
(21-08-21, 09:45 PM)ongke0711 Đã viết:hehe ông kẹ ơi,(21-08-21, 06:56 PM)paulsteigel Đã viết: ...
Mã PHP:Sub Convert()
' Thủ tục mở bảng ra và chuyển dữ liệu với các trường có kiểu là text
Dim Sql As String, tblArr As Variant, i As Long, j As Long
Dim tblRcs As New Recordset, Con As New Connection, FldStr As String
Set Con = CurrentProject.Connection
' tao mot danh sach cac bang can convert
tblArr = Array("bang1", "bang2", "bang3")
' Doan sau day se tu mo bang ra va tim cac truong co kieu Text de convert
For i = 0 To UBound(tblArr)
tblRcs.Open tblArr(i), Con
For j = 0 To tblRcs.Fields.Count - 1
If InStr("129,130,202,200,203,201", tblRcs.Fields(j).Type) > 0 Then ' đoạn này để kiểm tra kiểu trường theo danh mục mình tạo sẵn cho nhanh, đỡ phải làm nhiều lệnh if or ...vv
' text field, need conversion
' Chu y cu phap ham Convertext, tham so 0,1,2,3,4...)
FldStr = FldStr & ", a.[" & tblRcs.Fields(j).name & "] = ConvertText(a.[" & tblRcs.Fields(j).name & "],0)"
End If
Next
FldStr = Mid(FldStr, 2) ' loai bo dau phay ","
tblRcs.Close
Sql = "UPDATE " & tblArr(i) & " AS a SET " & FldStr & ";"
' run querry....
CurrentDb.Execute Sql
Next
End Sub
Hôm trước cũng có làm cái vụ chuyển đổi này, cách làm thì cũng gần giống như cách anh hướng dẫn ở trên.
- File demo này dùng DAO Recordset và chỉ convert mỗi font TCVN3 (chưa tích hợp VNI vô).
- Chỉ chọn Field dạng TEXT và bỏ qua các field dùng làm INDEX, PK.
* Cái hàm ConvertText của anh chuyển font TCVN3 bị lỗi chữ: ố, ửi. Cũng đã test nhiều bộ code chuyển đổi khác đều bị như vậy, cuối cùng cũng tìm ra một code bên CaulacboVB chuyển đổi tốt. Anh Văn cũng có chuyển cho một bộ code chạy tốt vụ đổi TCVN3.
Link file cho các bạn nào cần chuyển đổi.
Link: https://www.mediafire.com/file/11fjmaarn...accdb/file
tranthanhan1962 > 21-08-21, 10:06 PM
paulsteigel > 21-08-21, 10:14 PM
paulsteigel > 21-08-21, 10:20 PM
(21-08-21, 10:06 PM)tranthanhan1962 Đã viết: Cái quan trọng của Font chữ Việt không phải là phần mềm mà là phần cứng. Cần phải tự sản xuất 1 loại bàn phím giống như bàn phím máy chữ ngày xưa. Chứ không phải nhập bàn phím về viết hàng đống mã keyboard.
ongke0711 > 21-08-21, 10:51 PM
(21-08-21, 10:00 PM)paulsteigel Đã viết: hehe ông kẹ ơi,
xem code ông kẹ gửi thì nó là của mình viết 12 năm trước rùi ợ! Logic làm là
Duyệt mã đoạn chuỗi >> ánh xã về ký tự trung gian >> chuyển ngược lại! Đây là một phần bài viết về chuyển mã mình đăng trên PCworld hồi 2002. Sau này có nhiều code mới của các bạn khác hay hơn nhiều!
paulsteigel > 21-08-21, 11:37 PM
(21-08-21, 10:51 PM)ongke0711 Đã viết: ....Ông Kẹ ơi, Đó là do chế độ hiển thị font trong grid của Access 2003 nó không hỗ trợ mỗi cột một font. Hãy thiết kế 1 form thì em sẽ thấy nó ok. Em xem hình nhé