Code ứng dụng: Gõ TCVN3 sheet này, tự động cập nhật Unicode sheet kia. (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

ptm0412

Bad Excel Member
Thành viên BQT
Administrator
Tham gia
4/11/07
Bài viết
14,665
Được thích
37,360
Donate (Momo)
Donate
Giới tính
Nam
Nghề nghiệp
Consultant
Có 1 bạn nhờ tôi làm chuyện như vầy:
Đánh bằng font TCVN3 trên sheet này, thì cùng ô có địa chỉ đó ở sheet khác sẽ tự động có cùng nội dung nhưng là Font Unicode.
Tôi đã làm xong (chẳng dễ xơi), vì phải lường trước những trường hợp sửa, xóa, fill giá trị, fill công thức, chữ thường chữ in, ... làm từng ô hay làm hàng loạt. Nhưng thấy dài dòng quá.

Nhờ các cao thủ tối ưu code hộ, xem có thể ngắn gọn hơn hoặc chạy nhanh hơn không. Và xem có sót lỗi nào chưa bẫy không.
 

File đính kèm

Lần chỉnh sửa cuối:
Xin lỗi ndu, tôi không bàn ra nhưng thấy bài toán không khả thi.
Hiện trên diễn đàn có biết bao code để chuyển từ font chữ này sang font chữ khác.
(Bạn phamduylong,....).Rồi bộ gõ unikey cũng cho phép ta làm được việc này.

Lâu lắm, tôi mới thấy ptm0412 làm những việc vô công như thế. Nhiều đề tài cần giúp thì không giúp, còn đề tài này có thiết thực đâu?

Bạn không tin, thử bỏ phiếu bầu chọn đề tài này xem? Có được bao nhiêu người đồng tình với bạn.

Bạn không đến độ nhàn rỗi làm những việc không thực tế tí nào.

Nếu bạn không cần thiết thì cũng chẳng vào topic này mà phản đối công việc của người khác làm gì, sao lại phải thế chứ? Không cần với người này nhưng cần với người khác - ít nhất là với tôi.
Nói thật bạn đừng buồn nhé! Bạn mới là người vô công đấy!


Dear Bác PTM0412,
Tôi đang định hỏi về vấn đề này, may mà có sẵn từ Bác,
Vì tôi kiểm soát & chủ đầu tư các hạng mục, các dự án. Các đối tác hay nhà thầu thường gửi cho tôi các bảng tính bằng excel với nhiều kiểu font, bảng mã khác nhau. (ví dụ ngoài Bắc hay dùng TCVN, trong Nam lại hay dùng VNI hay UNI) nên lúc tôi cho mấy em tổng hợp thì rất không đồng nhất rất khó coi trong các bảng báo cáo, nên tôi cần 1 kiểu như thế này (nếu mở rộng ra được VNI nữa thì hay, hoặc dùng đa chiều VNI <-> UNI, TCNV<->UNI,..thì hay hơn nữa..), với lại tôi cũng đang học tập, nghiên cứu thêm ứng dụng trong Excel - có gì Bác và mọi người cứ chỉ giáo.

Note: Đừng vì những lời vô bổ mà đánh mất tâm huyết cũng như mục tiêu nghiên cứu của riêng mình!
Trân trọng,
 
Lần chỉnh sửa cuối:
Upvote 0
Cái việc tự động chuyển có thể xét đến việc nên làm hay không nên làm, vì code rất đơn giản. Cái chính là việc chuyển font như thế đã viết thành 1 UDF và có thể dùng không việc này thì việc khác. Có lẽ số người cần dùng UDF dạng này nhiều hơn mọi người tưởng.

Thứ hai, qua việc thực hiện cái "vô bổ" này, tôi đã tự rút ra những bài học cho riêng tôi trong khi mày mò thuật toán, trong khi hì hục sửa lỗi, ... Theo tôi đó là 1 cách học.

Thứ ba, tôi muốn học nhiều hơn nữa bằng cách nhờ các cao thủ sửa những lỗi tôi không nhìn thấy.

Thứ tư, tôi rất muốn trả lời cho rất nhiều những câu hỏi hoặc những bài trao đổi trên diễn đàn, nhưng trả lời tất cả những vấn đề mà chưa ai trả lời ư? Chuyện mơ. Lý do như sau:

- Tôi không có cái nghĩa vụ phải làm chuyện đó, nếu gọi là giúp, tôi sẽ giúp người cần và giúp người tôi thích. Nếu chỉ giúp người mình thích là đồ chết tiệt, thì đúng, tôi là đồ chết tiệt.
- Không phải tôi có thể trả lời tất cả mọi vấn đề, tôi không phải là thánh.
- Ai là người có thời gian 1 ngày 16 tiếng miệt mài với GPE chỉ để trả lời? Ăn và sống bằng không khí à?


Tóm lại, tôi cũng vẫn xin các cao thủ sửa dùm tôi đoạn code trong bài này. Xin cám ơn.
 
Upvote 0
Gởi Datbutmuc:
Sau khi UDF này sửa hoàn chỉnh, tôi có thể phát triển ứng dụng thành 1 hàm duy nhất chuyển cả Font .Vnxxx và VNI-xxx thành Unicode.
 
Upvote 0
Gửi bạn ptm0412
Thực ra nếu bạn chịu khó một chút tìm kiếm trong diễn đàn thì đã có ít nhất đến vài trăm người bàn về vấn đề chuyển mã và cũng đã có kha khá bài viết với đủ các loại thuật toán.
Về ví dụ mà bạn yêu cầu, tiếp cận sử dụng Udf là đúng và phù hợp. Tôi đọc qua code của bạn dùng thì thấy nhìn chung là ổn nhưng có lẽ nên ngắn gọn hơn. Và để phục vụ mục đích là nâng cao thì có nhiều thuật toán ngắn gọn nhưng dễ dùng hơn.
Xin gửi bạn 1 đoạn UDF tôi dùng để chuyển đổi từ Unicode-TCVN ABC và ngược lại và từ Unicode sang dạng Iso-1252. Nếu bạn muốn viết với các bảng mã khác, ta cũng có thể sử dụng cách tiếp cận tương tự.
PHP:
Function ToUnicode(txtString As String, Optional isReversed As Boolean = False, Optional isISO As Boolean = False) As String
    ' This function will do the conversion of text string into unicode
    Dim iStr As String, repTxt As String, mText As String
    Dim i As Long, j As Long
    Dim iUnicode As Variant ' array to keep unicode char set
    Dim iTCVN As Variant ' array to keep TCVN char set
    Dim iProcList() As String ' array to keep what to convert
    
    'parse the parameter into this local variable
    iStr = txtString
    mText = txtString
    
    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, 195, _
        258, 194, 212, 416, 431, 272)
    
    iTCVN = Array(184, 181, 182, 183, 185, 168, 190, 187, 188, 189, 198, 169, 202, 199, 200, _
        201, 203, 208, 204, 206, 207, 209, 170, 213, 210, 211, 212, 214, 221, 215, 216, 220, _
        222, 227, 223, 225, 226, 228, 171, 232, 229, 230, 231, 233, 172, 237, 234, 235, 236, _
        238, 243, 239, 241, 242, 244, 173, 248, 245, 246, 247, 249, 253, 250, 251, 252, 254, _
        174, 193, 192, 195, 161, 162, 164, 165, 166, 167)
    
    ' Reenlarge the array
    ReDim iProcList(1, 133)
    ' process the vowel only and covert to asc code
    For i = 1 To Len(mText)
        repTxt = Mid(mText, i, 1)
        If AscW(repTxt) > 122 Then
            iStr = Replace(iStr, repTxt, "[" & AscW(repTxt) & "]")
            mText = Replace(mText, repTxt, " ")
            ' write the processed list
            iProcList(1, j) = "[" & AscW(repTxt) & "]"
            If isISO Then
                iProcList(0, j) = GetElementNo(AscW(repTxt), iUnicode)
            Else
                If isReversed Then
                    iProcList(0, j) = GetElementNo(AscW(repTxt), iUnicode)
                Else
                    iProcList(0, j) = GetElementNo(AscW(repTxt), iTCVN)
                End If
            End If
            j = j + 1
        End If
    Next
    If j = 0 Then
        ToUnicode = txtString
        Exit Function
    End If
    ReDim Preserve iProcList(1, j - 1)
    ' now convert to unicode
    For i = 0 To UBound(iProcList, 2)
        If isReversed Then
            iStr = Replace(iStr, iProcList(1, i), ChrW(iTCVN(Val(iProcList(0, i)))))
        Else
            If isISO Then
                iStr = Replace(iStr, iProcList(1, i), "&#" & iUnicode(Val(iProcList(0, i))) & ";")
            Else
                iStr = Replace(iStr, iProcList(1, i), ChrW(iUnicode(Val(iProcList(0, i)))))
            End If
        End If
    Next
fExit:
    ToUnicode = iStr
End Function

Private Function GetElementNo(iTxt As Long, iObj As Variant) As String
    Dim i As Long
    For i = 0 To UBound(iObj)
        If iTxt = iObj(i) Then
            GetElementNo = CStr(i)
            Exit For
        End If
    Next
End Function
Chúc bạn vui vẻ
 
Upvote 0
Xin cám ơn Paul!
Vẫn biết trên diễn đàn có nhiều bài, và nhiều thuật toán. Nhưng theo tôi thấy, và cụ thể là Function của bạn nêu ra trên đây, các thuật toán đó:
- Không chuyển chữ hoa Font .VnxxxH thành Unicode hoa
- Hàm có nhiều tham số
- Cỡ tôi đọc hơi khó hiểu
- Mỗi lần dùng hàm chỉ dùng để chuyển đổi 1 loại font.
- Thuật toán đó không áp dụng cho font 2 byte như VNI

Tôi muốn viết 1 hàm code dễ hiểu, thuật toán đơn giản, sử dụng dễ dàng.
Nghĩa là với 1 sheet sử dụng nhiều loại font của cả 2 bảng mã TCVN3 và VNI, và cả Unicode, tôi chỉ dùng 1 hàm với 1 tham số có cấu trúc = AllToUni(A1) và copy cho tất cả các cells, chữ in còn nguyên chữ in, chữ thường ra chữ thường, Font Unicode để nguyên.

Thí dụ như file kèm theo, dù cho vẫn còn khá dài dòng.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Thế là bạn đã gặp phải vấn đề mà nhiều nhiều người đau đầu rồi đấy! Tính năng tự động đoán mã!
Để viết được hàm như vậy, kinh nghiệm xử lý bảng mã và phông chữ là điều rất quan trọng. Trong diễn đàn hiện có vài bộ công cụ có tính năng đoán mã song chưa hoàn chỉnh và cần phải cập nhật nhiều.
Tôi có viết một công cụ tên là Functions.xla gửi trong diễn đàn này, có phần thuật toán đoán mã đấy, nhưng nói chung cần phải có nhiều kinh nghiệm cũng như đầu tư thêm thời gian thì việc này mới ổn được.
Cám ơn bạn đã khơi ra vấn đề này. Trước đây tôi đã định viết một công cụ hoàn chỉnh nhưng phần mắc về thời gian, phần thấy mọi người cũng phân tán nên đành bỏ và chỉ dừng lại ở dạng demo.
Nay nếu bạn cũng quan tâm vấn đề này, có thể chúng ta cùng đi tiếp để hoàn thiện để giúp ích cho những người có nhu cầu chuyển mã trong Excel.
Có gì ta sẽ trao đổi cụ thể thêm.
 
Upvote 0
Cám ơn Paul! Tôi không có cái tham vọng và trình độ để nghiên cứu sâu vào chuyện đoán mã. Tôi làm theo thực tế nhiều người (thí dụ như datbutmuc) gặp phải trên Excel: Đó là phải xử lý 1 file tổng hợp từ nhiều file do nhiều người làm, mỗi người sử dụng 1 bảng mã. Nếu mỗi sheet hoặc mỗi bảng dữ liệu đồng nhất 1 bảng mã thì dùng ngay Unikey là tốt nhất và nhanh nhất, khỏi đau đầu làm gì. Vấn đề là dữ liệu khác bảng mã nằm xen kẽ nhau, chả lẽ dò tìm từng ô hoặc từng vùng rồi chạy Unikey từng lần? Hay dò từng ô rồi chạy cái hàm của Paul với tham số mỗi ô mỗi khác?

Không biết Paul đã xem file đính kèm AllToUni và xem cái hàm trong đó chưa? Hàm đó không đoán mã, mà xác định mã thông qua việc đọc thông tin định dạng font của cell.
Cell định dạng font không đúng mã thì hàm chết ngắc. Nhưng tôi biết rằng, ngay cả khi lấy 1 file của người khác về, thí dụ file đó dùng Font .VnAvant và máy mình không có font này, nhưng định dạng font vẫn là font đó, và hàm chạy đúng.

Dear all:
Cái việc tưởng như vô bổ là gõ font .vn ở sheet này, tự động ra font Unicode ở sheet kia, cũng có nguyên ủy của nó. Bạn cứ tưởng tượng 1 ông sếp dùng quen Font TCVN3 mấy chục năm nay và không thèm thay đổi, nhất quyết không thay đổi. Trong khi đó nhân viên của ông ta biết rằng phải chuyển đổi thành Font Unicode thì gởi mail cho đối tác chẳng hạn, người ta mới chấp nhận. Thì chỉ có cách này mới vẹn cả đôi đường mà thôi. Nhân tiện làm giúp việc này, tôi có dịp để giúp thêm vài người khác cần đến nó.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn không hiểu ý tôi, nhưng dù sao điều đó cũng không quan trọng.
1. Nói đoán mã cho to tát nhưng thực ra việc dựa vào phông chữ sử dụng để hiện thị một ô (như bạn đặt vấn đề) là một trong những dữ kiện quan trọng cho thuật toán đoán mã. Tất nhiên để thuật toán này làm việc tốt thì việc nghiên cứu kỹ Quy luật sử dụng phông chữ hoặc thậm chí là nghiên cứu cả mã ký tự nữa hoặc các biện pháp khác đều rất quan trọng

2. Nếu sử dụng Unikey cho Excel thì tôi e là sẽ có chuyện, đặc biệt với vùng gồm nhiều ô và có định dạng hơi phức tạp một chút.
Bạn thử chọn 1 vùng (Có các ô đã trộn thì càng rõ), nhấn Ctrl+C sau đó nhấn Ctrl+V xem kết quả sẽ như thế nào.
Unikey là công cụ chuyển mã rất tốt, ngày trước khi chưa có Unikey thì tôi còn lọ mọ viết chuyển mã trong Word, nhưng từ khi có Unikey, tôi bỏ hết khái niệm chuyển mã trong word mà chỉ cần nhớ Ctrl+Shift+F9/F6.
Trong Excel thì hiện tại Unikey chưa làm ngon lắm, đó cũng là lý do tại sao nhiều người cố gắng phát triển các công cụ khác.
Ở đây, mọi sự đóng góp, chia sẻ đều là tốt và có ích. Có những việc ta tưởng là vô ích nhưng với ai đó thì lại là có ích, và đó là việc chúng ta có thêm kiến thức qua những trang web thế này.
Và cũng chính vì thế, khi ngâm cứu bài của bạn, tôi thấy tâm đắc và đã định đi tiếp, trao đổi tiếp nữa, nhưng có nhẽ là chưa hợp lý lắm vào lúc này.
Hy vọng công cụ chuyển phông chữ của bạn sẽ ngày càng tốt và giúp đỡ nhiều cho công việc của bạn.
Chúc bạn thành công!
 
Lần chỉnh sửa cuối:
Upvote 0
==================================================================
Các bạn quan tâm xin chuyển sang viết tập trung về chủ đề chuyển mã tại Topic này
http://www.giaiphapexcel.com/forum/showthread.php?t=31933

Đây là địa chỉ bản cập nhật mới nhất của công cụ chuyển bảng mã
http://www.giaiphapexcel.com/forum/...=============================================

Nhằm mục đích bổ sung thêm cho tiếp cận mà chúng ta đã trình bày trong nhóm bài viết này, tôi xin phép được gửi tặng các bạn bộ công cụ tích hợp một số tiện ích.
Thực ra các tiện ích này đã được gửi trong một loạt bài viết về công cụ chuyển mã, nhúng từ điển Bamboo, làm lịch âm dương trong Excel song đó là các bản chưa hoàn toàn hoàn chỉnh.
Để có dẫn chứng phục vụ ý tưởng của ptm0412 trong chuyển đổi bảng mã có khả năng tự động đoán mã, tôi xin gửi lên bộ công cụ tích hợp chuyển đổi mã đã được sửa đổi hoàn chỉnh hơn có hỗ trợ các công cụ:
+ Chuyển mã (hỗ trợ 14 bảng mã khác nhau và có thể sửa đổi được),
+ Chuyển chữ hoa, thường
+ Bỏ dấu
+ Làm lịch âm dương
+ Tra từ điển....
Hướng dẫn sử dụng và cài đặt Addin đã có trong một số bài viết. Các bạn chỉ cần lưu ý những việc này nhé:
1. Khi cài đặt xong, cần thiết lập các cấu hình ban đầu bằng cách nhấn tổ hợp Ctrl+Shilf+B. Thiết lập tính năng tự đoán mã, chọn bảng mã đích và nhấn OK.
2. Sau đó chỉ cần nhấn Ctrl+Shift+C để chuyển đối đối với vùng chọn trong trang tính Excel.
Bẫy lỗi tôi vẫn chưa hoàn chỉnh hết, vì thế chắc sẽ lỗi với Protected Cell, Sheet ...vv. Khi bị lỗi các bạn thoát khỏi Excel và khởi động lại là xong.

Tôi chưa hài lòng lắm với phần tạo thực đơn cũng như các thuật toán sử dụng trong đoán mã và đổi bảng mã, nhưng tạm thời chúng vẫn hoạt động được.
Hiện tại tính năng đổi bảng mã cho các đối tượng hình ảnh, biểu đồ chưa được tích hợp, trong phiên bản tới, tôi sẽ bổ sung:
+ Tính năng làm việc với các đối tượng hình ảnh!
+ Tính năng cập nhập tự động/ thủ công các mô đun chương trình qua Internet (Tính năng này có thể điều chỉnh để tự lấy mã nguồn mới nhất từ trang web của tôi để đưa vào bộ thư viện Addin).

Nếu các bạn có thời gian và mối quan tâm, tôi thành thực rất mong các bạn cho ý kiến để ta cùng sửa đổi và nâng cấp chương trình.
Hy vọng công cụ có thể giúp đỡ phần nào cho mọi người!
 
Lần chỉnh sửa cuối:
Upvote 0
Nghĩa là với 1 sheet sử dụng nhiều loại font của cả 2 bảng mã TCVN3 và VNI, và cả Unicode, tôi chỉ dùng 1 hàm với 1 tham số có cấu trúc = AllToUni(A1) và copy cho tất cả các cells, chữ in còn nguyên chữ in, chữ thường ra chữ thường, Font Unicode để nguyên.
Bạn Mỹ kiểm tra giúp chỗ này tôi thấy chưa đúng :
Gõ chữ unicode ( Tahoma)
Thử format thành .vnTime
Chuyển đổi không được
Thân
 
Upvote 0
Đúng rồi anh ạ. Bài trên cũng có nói đến:
Hàm đó không đoán mã, mà xác định mã thông qua việc đọc thông tin định dạng font của cell.
Cell định dạng font không đúng mã thì hàm chết ngắc. Nhưng tôi biết rằng, ngay cả khi lấy 1 file của người khác về, thí dụ file đó dùng Font .VnAvant và máy mình không có font này, nhưng định dạng font vẫn là font đó, và hàm chạy đúng.

Nghĩa là định dạng font sai, thì hàm chạy sai. Trình độ tôi không làm được việc đoán mã anh ạ.
 
Upvote 0
Xin cám ơn Paul!
Vẫn biết trên diễn đàn có nhiều bài, và nhiều thuật toán. Nhưng theo tôi thấy, và cụ thể là Function của bạn nêu ra trên đây, các thuật toán đó:
- Không chuyển chữ hoa Font .VnxxxH thành Unicode hoa
- Hàm có nhiều tham số
- Cỡ tôi đọc hơi khó hiểu
- Mỗi lần dùng hàm chỉ dùng để chuyển đổi 1 loại font.
- Thuật toán đó không áp dụng cho font 2 byte như VNI

Tôi muốn viết 1 hàm code dễ hiểu, thuật toán đơn giản, sử dụng dễ dàng.
Nghĩa là với 1 sheet sử dụng nhiều loại font của cả 2 bảng mã TCVN3 và VNI, và cả Unicode, tôi chỉ dùng 1 hàm với 1 tham số có cấu trúc = AllToUni(A1) và copy cho tất cả các cells, chữ in còn nguyên chữ in, chữ thường ra chữ thường, Font Unicode để nguyên.

Thí dụ như file kèm theo, dù cho vẫn còn khá dài dòng.
Hôm nay đọc bài viết của thày em thấy Code này của thày hay quá, nhưng em thắc mắc nếu chuyển font chữ cho cả một vùng thì làm thế nào ah? Chả nhẽ phải dùng công thức của từng ô trong cả vùng ah?
 
Upvote 0
Hôm nay đọc bài viết của thày em thấy Code này của thày hay quá, nhưng em thắc mắc nếu chuyển font chữ cho cả một vùng thì làm thế nào ah? Chả nhẽ phải dùng công thức của từng ô trong cả vùng ah?

xem bài 13 http://www.giaiphapexcel.com/forum/...-Roma-vấn-giữ-được-chữ-IN&p=294901#post294901
Tô chọn 1 vùng, hoặc nhiều vùng, rồi chạy code. Sao đang ở bên kia (thấy đã đọc lúc chiều), mà lại nhảy qua đây?
 
Upvote 0
Vâng chiều tình cờ em đọc chủ đề liên quan đến chuyển font, hôm nay em mới biết đến bài của thày. Em cảm ơn thày rất nhiều.
 
Upvote 0
Web KT

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

Back
Top Bottom