paulsteigel
Nhi bất hoặc!
- Tham gia
- 25/8/08
- Bài viết
- 306
- Được thích
- 684
- Giới tính
- Nam
- Nghề nghiệp
- Governance & Public policy consultant
[FONT=&]1[/FONT]Công cụ chuyển mã trong Excel
Dân văn phòng chúng ta hẳn ai cũng đều không phủ nhận các tính năng tuyệt vời của Unikey của bác Phạm Kim Long. Công cụ này đặc biệt mạnh thao tác với văn bản tiếng Việt sử dụng Unicode bên cạnh các công cụ bộ sung mà đến bây giờ chắc nhiều bạn cũng như tôi khó có thể tìm được phần mềm miễn phí nào tốt như vậy.
Với các phần mềm soạn thảo văn bản khác thì không chê vào đâu được nhưng với Excel thì có lẽ còn nhiều vấn đề phải bàn do đặc tính tương tác của Unikey đối với hệ thống. Chính vì lẽ đó mà bộ chuyển mã của Unikey không còn hữu dụng lắm khi trong bảng Excel của ta có nhiều bộ mã khác nhau và chưa kể đến việc văn bản có nhiều định dạng phức tạp.
Đây cũng là lý do nhiều chuyên gia Excel đang phát triển (theo nhóm hoặc đa số là tự phát triển) các công cụ riêng của mình để giải quyết vấn đề chuyển mã.
Là người dùng Excel, tôi thấy tiêng tiếc thế nào ý vì nếu tất cả cùng ngồi lại với nhau và bàn để cùng xây dựng ra một công cụ chung thì hay biết mấy. Cách này, không những vừa tiết kiệm công sức của nhiều người mà còn có thể hoàn thiện được một công cụ hay, hữu dụng, thân thiện và hiệu quả đối với nhiều người.
Vì lý do đấy, tôi mạn phép xin được đi trước bằng việc giải thích đôi chút cách tiếp cận của tôi về công cụ chuyển mã tích hợp. Nếu sau này có anh, chị nào quan tâm, tôi rất mong là ta sẽ hình thành được một đội phát triển để hoàn thiện hơn nữa công cụ này.
[FONT=&]1[/FONT]Nguyên tắc thiết kế
Cách tiếp cận tôi sử dụng đối với công cụ chuyển mã là:
+ Tạo ra bộ tương tác mở không hạn chế với bảng mã nào cả: Cho phép người dùng thêm bảng mã mới theo quy tắc nhất định. Các thuật toán chuyển đổi làm việc theo một nguyên tắc chung.
+ Xây dựng các nguyên tắc chuẩn trong tiếp cận lập trình sao cho có thể sử dụng lại qua các phiên bản Office Excel mà không phải điều chỉnh lại mã nguồn quá nhiều.
+ Cô lập các công cụ khác nhau vào các module khác nhau để tiện theo dõi.
[FONT=&]1[/FONT]Cách tiếp cận thuật toán.
Tôi phân lập rõ ràng các thuật toán có chức năng khác nhau và chúng chỉ thực hiện một thao tác cụ thể nào đó, tránh lồng ghép quá nhiều tính năng hoặc phân tách quá nhiều thuật toán có cùng nguyên tắc xử lý.
Trong chương trình, tôi hạn chế tối đa việc sử dụng các vòng lặp thừa và chỉ tải thông tin vào bộ nhớ khi không có cách nào tránh khỏi.
[FONT=&]1[/FONT]Cách tổ chức các môđun
Toàn bộ chương trình được thiết kế theo 2 nhóm thành phần cơ bản
+ Module chứa dữ liệu: thường có tên mdlResources hoặc frmResources
+ Module thuật toán: được đặt tên riêng rẽ ví dụ mdlConvert, mdlCommandbar ...vv
1. Mô đun khởi tạo thực đơn: mdlCommandBar
Đây là module được thiết kế để khởi tạo các trình đơn và cũng được phân lập thành:
+ Khối dữ liệu chứa các thông tin về thực đơn trong thủ tục InvokeMenuArray(). Hiện tại tôi cũng chưa hài lòng lắm về cách xây dựng mảng chứa thông tin về thực đơn. Có lẽ sau này tôi sẽ đưa chúng vào frmResource để tiện quản lý.
Tôi định nghĩa một Biến kiểu để chứa các thông tin về thực đơn để tiện truy vấn sau này
Các thông tin cho thực đơn được tổ chức dưới dạng các biến Ký tự có phân cách dạng _ để tiện chuyển thành mảng dữ liệu, chẳng hạn:
Biến mnuHotKey để giữ các ký hiệu phím nóng cho thực đơn
Thực ra cách làm này có vẻ không ổn lắm vì khó theo dõi cho dân lập trình, vì thế chắc là nên tổ chức lại cho đẹp và dễ theo dõi.
Tất cả các biến này sau đó được lưu vào mảng chứa kiểu dữ liệu đã định nghĩa ở trên thông qua vòng lặp:
+ Các thuật toán khởi tạo thực đơn CreateMenu()
Các thuật toán này làm việc không phụ thuộc vào kiểu thực đơn nào cả mà đơn giản là chỉ đọc dữ liệu từ mảng thực đơn sau đó là khởi tạo thực đơn theo các tham số này thôi.
+ Tất nhiên, trong module này còn có nhiều thuật toán con khác phục vụ cho việc kiểm tra thực đơn...vv
Nếu các bạn quan tâm, xin mời xem trong mã nguồn tập tin đính kèm nhé.
2. Module hỗ trợ truy vấn và ghi đăng bạ (Registry) - mdlRegistry
Module này được xây dựng để ghi lại các thông tin cấu hình vào bộ đăng bạ của Windows.
Các thủ tục cụ thể chắc không cần phải bàn nhiều vì không liên quan mấy đến chuyển mã.
3. Module chứa dữ liệu phục vụ chuyển mã - mdlResources
Đây có lẽ sẽ là điều phải bàn nhiều nhất. Tôi xem hầu như gần hết các công cụ của các thành viên GPE như TVEXCEL của bác Long, OverAC Addin của bạn Bình, của Ndu, Dos.net ...vv nhưng đều thấy một điểm giống nhau là: Các bác đều đặc định hóa tính năng chuyển mã (Mỗi kiểu chuyển mã thì làm riêng 1 hàm).
Điều này sẽ gây nhiều trở ngại khi muốn mở rộng tính năng bên cạnh việc có thể làm chậm đáng kể công cuộc chuyển mã.
Thực ra, chúng ta có thể thấy rõ, chuyển mã đơn giản chỉ là việc ánh xạ lại bảng mã từ bảng mã này sang bảng mã khác theo chuỗi thứ tự đã được xác lập. Vì vậy, điểm chung ở đây cần chú ý đó là:
+ Bảng mã nguồn và bảng mã đích với thứ tự các chuỗi giống nhau, còn lại là thủ tục đổi chỗ.
+ Nếu ngon hơn thì thiết kế thêm các tính năng khác như chuyển chữ hoa (Upper case), thường, đổi phông chữ cho đẹp.
Ngay cả khi bỏ dấu thì nguyên tắc cũng đơn giản chỉ là ánh xạ thôi.
Cách tổ chức bảng mã dữ liệu của tôi là lập danh sách chuỗi theo thứ tự. Các bạn có thể lấy được danh sách chuỗi này bằng cách gõ vào một ô trong bảng tính hàm =GetUnicodeString() (Hiện giờ, hàm này không còn được sử dụng nhưng tôi vẫn để lại trong chương trình để các bạn tiện tham khảo khi có nhu cầu muốn làm bảng mã mới).
Các bảng mã khác ta cũng làm tương tự như: VNI, TCVN-ABC ...vv
(Lý do sử dụng dấu "/" là để chuyển thành mảng một cách nhanh nhất với hàm Split)
Tiếp theo là đưa dãy ký tự này để lưu vào mảng hoặc đối tượng nào có thể lưu được (Code Module hoặc trên bảng tính hay trong form). Trước đây, tôi lưu thẳng vào Code Module (Vì thế trông code đến khiếp) nhưng sau này tôi đưa vào một điều khiển nhãn (Label) và để trong Form frmResource.
Sau đó là việc tạo hàm truy vấn dãy dữ liệu này trong module mdlResources. (xem hàm GetCodetable).
4. Module chứa các thủ tục chuyển mã - mdlConvert
Module này khá quan trọng, cốt lõi của module là dãy các biến toàn cục, thủ tục ConvertRange để xử lý ban đầu đối với vùng chọn trước khi chuyển đổi và hàm ConvertText để thực hiện ánh xạ.
4.1 Thủ tục ConvertRange
Thủ tục này sẽ thực hiện toàn bộ các việc như:
+ Xử lý điều kiện và nạp biến nhớ;
+ Định hướng việc chuyển đổi bảng mã, nạp lại các bảng mã mới khi cần thiết;
+ Chuyển đổi phông chữ;
+ Xác định bảng mã nguồn ...vv
Đây là trái tim của toàn bộ công việc chuyển đổi vì thế trong tương lai tôi sẽ còn sửa đồi nhiều để việc chuyển mã diễn ra tốt nhất.
Có một số thủ tục/ hàm liên quan đến thủ tục này là:
4.2 Hàm ConvertText
Hàm này chỉ nhằm mục đích xử lý ánh xạ bảng mã từ đầu vào và chuyển mã.
Trong hàm này, chúng ta cần chú ý về cách dùng hàm thay thế (Replace). Thay vì thay thế thẳng thừng, tôi làm việc thay thế bằng một chuỗi trung gian. Điều này giúp loại bỏ những nhầm lẫn khi xảy ra việc sử dụng chung một số ký tự trong các bảng mã khác nhau (Rất hay xảy ra).
Ngoài ra còn chú ý khác là thứ tự xử lý thay thế. Trong bảng mã VNI có một số điểm cần chú ý chẳng hạn 2 ký tự: [ô/ôù/] nằm liền nhau để hiển thị chữ [ơ/ớ/], nếu thay thế ngay các ký tự ô thì ký tự tiếp theo sẽ bị đổi thành ơù và dẫn đến việc chuyển đổi sai. Vì thế các chuỗi ký tự đa bytes sẽ được chuyển đổi trước sau đó đến chuỗi ngắn hơn và ngắn nhất.
Công việc còn lại chỉ là thêm thắt các tính năng để sao cho thuận tiện và đạt kết quả cao nhất mà thôi.
Tóm lại tôi đã giới thiệu xong cách tiếp cận. Bên cạnh tính năng chuyển mã, hiện có nhiều công cụ khác như đổi số sang chữ, in lịch âm dương, tra từ điển trực tuyến trong Excel... nhưng nói chung chúng không quan trọng lắm.
Trong thời gian tới, nếu có thời gian, tôi sẽ bổ sung thêm các công cụ khác.
Hy vọng các thành viên của diễn đàn có quan tâm cùng tham gia và nếu có thể, cùng bắt tay vào Chiến đấu.
Các bạn quan tâm, xin cùng chia sẻ qua email (ngocdd@sfdp.net) hoặc qua diễn đàn nhé.
Chúc các bạn vui vẻ và thành thật xin lỗi nếu có gì phiền toái.
Dân văn phòng chúng ta hẳn ai cũng đều không phủ nhận các tính năng tuyệt vời của Unikey của bác Phạm Kim Long. Công cụ này đặc biệt mạnh thao tác với văn bản tiếng Việt sử dụng Unicode bên cạnh các công cụ bộ sung mà đến bây giờ chắc nhiều bạn cũng như tôi khó có thể tìm được phần mềm miễn phí nào tốt như vậy.
Với các phần mềm soạn thảo văn bản khác thì không chê vào đâu được nhưng với Excel thì có lẽ còn nhiều vấn đề phải bàn do đặc tính tương tác của Unikey đối với hệ thống. Chính vì lẽ đó mà bộ chuyển mã của Unikey không còn hữu dụng lắm khi trong bảng Excel của ta có nhiều bộ mã khác nhau và chưa kể đến việc văn bản có nhiều định dạng phức tạp.
Đây cũng là lý do nhiều chuyên gia Excel đang phát triển (theo nhóm hoặc đa số là tự phát triển) các công cụ riêng của mình để giải quyết vấn đề chuyển mã.
Là người dùng Excel, tôi thấy tiêng tiếc thế nào ý vì nếu tất cả cùng ngồi lại với nhau và bàn để cùng xây dựng ra một công cụ chung thì hay biết mấy. Cách này, không những vừa tiết kiệm công sức của nhiều người mà còn có thể hoàn thiện được một công cụ hay, hữu dụng, thân thiện và hiệu quả đối với nhiều người.
Vì lý do đấy, tôi mạn phép xin được đi trước bằng việc giải thích đôi chút cách tiếp cận của tôi về công cụ chuyển mã tích hợp. Nếu sau này có anh, chị nào quan tâm, tôi rất mong là ta sẽ hình thành được một đội phát triển để hoàn thiện hơn nữa công cụ này.
[FONT=&]1[/FONT]Nguyên tắc thiết kế
Cách tiếp cận tôi sử dụng đối với công cụ chuyển mã là:
+ Tạo ra bộ tương tác mở không hạn chế với bảng mã nào cả: Cho phép người dùng thêm bảng mã mới theo quy tắc nhất định. Các thuật toán chuyển đổi làm việc theo một nguyên tắc chung.
+ Xây dựng các nguyên tắc chuẩn trong tiếp cận lập trình sao cho có thể sử dụng lại qua các phiên bản Office Excel mà không phải điều chỉnh lại mã nguồn quá nhiều.
+ Cô lập các công cụ khác nhau vào các module khác nhau để tiện theo dõi.
[FONT=&]1[/FONT]Cách tiếp cận thuật toán.
Tôi phân lập rõ ràng các thuật toán có chức năng khác nhau và chúng chỉ thực hiện một thao tác cụ thể nào đó, tránh lồng ghép quá nhiều tính năng hoặc phân tách quá nhiều thuật toán có cùng nguyên tắc xử lý.
Trong chương trình, tôi hạn chế tối đa việc sử dụng các vòng lặp thừa và chỉ tải thông tin vào bộ nhớ khi không có cách nào tránh khỏi.
[FONT=&]1[/FONT]Cách tổ chức các môđun
Toàn bộ chương trình được thiết kế theo 2 nhóm thành phần cơ bản
+ Module chứa dữ liệu: thường có tên mdlResources hoặc frmResources
+ Module thuật toán: được đặt tên riêng rẽ ví dụ mdlConvert, mdlCommandbar ...vv
1. Mô đun khởi tạo thực đơn: mdlCommandBar
Đây là module được thiết kế để khởi tạo các trình đơn và cũng được phân lập thành:
+ Khối dữ liệu chứa các thông tin về thực đơn trong thủ tục InvokeMenuArray(). Hiện tại tôi cũng chưa hài lòng lắm về cách xây dựng mảng chứa thông tin về thực đơn. Có lẽ sau này tôi sẽ đưa chúng vào frmResource để tiện quản lý.
Tôi định nghĩa một Biến kiểu để chứa các thông tin về thực đơn để tiện truy vấn sau này
PHP:
Private Type MenuItem
MenuId As Long
ParrentID As Long
Caption As String
Action As String
FaceID As Long
Tag As String
IsGroup As Boolean
Image As String
HotKey As String
End Type
PHP:
mnuParrentID = "0_1_1_1_1_1_1_1_1_1_1_1_1"
PHP:
mnuHotKey = "N/A_^+c_^+d_^%h_^%t_^+b_^+l_N/A_N/A_N/A_N/A_N/A_^%a"
Tất cả các biến này sau đó được lưu vào mảng chứa kiểu dữ liệu đã định nghĩa ở trên thông qua vòng lặp:
PHP:
For i = 0 To UBound(MenuArray)
With MenuArray(i)
.ParrentID = ParrentID(i)
.Caption = Caption(i)
.Action = Action(i)
.FaceID = FaceID(i)
'.Tag = Tag(i)
.IsGroup = IsGroup(i)
.Image = Image(i)
.HotKey = HotKey(i)
End With
Next
Các thuật toán này làm việc không phụ thuộc vào kiểu thực đơn nào cả mà đơn giản là chỉ đọc dữ liệu từ mảng thực đơn sau đó là khởi tạo thực đơn theo các tham số này thôi.
+ Tất nhiên, trong module này còn có nhiều thuật toán con khác phục vụ cho việc kiểm tra thực đơn...vv
Nếu các bạn quan tâm, xin mời xem trong mã nguồn tập tin đính kèm nhé.
2. Module hỗ trợ truy vấn và ghi đăng bạ (Registry) - mdlRegistry
Module này được xây dựng để ghi lại các thông tin cấu hình vào bộ đăng bạ của Windows.
Các thủ tục cụ thể chắc không cần phải bàn nhiều vì không liên quan mấy đến chuyển mã.
3. Module chứa dữ liệu phục vụ chuyển mã - mdlResources
Đây có lẽ sẽ là điều phải bàn nhiều nhất. Tôi xem hầu như gần hết các công cụ của các thành viên GPE như TVEXCEL của bác Long, OverAC Addin của bạn Bình, của Ndu, Dos.net ...vv nhưng đều thấy một điểm giống nhau là: Các bác đều đặc định hóa tính năng chuyển mã (Mỗi kiểu chuyển mã thì làm riêng 1 hàm).
Điều này sẽ gây nhiều trở ngại khi muốn mở rộng tính năng bên cạnh việc có thể làm chậm đáng kể công cuộc chuyển mã.
Thực ra, chúng ta có thể thấy rõ, chuyển mã đơn giản chỉ là việc ánh xạ lại bảng mã từ bảng mã này sang bảng mã khác theo chuỗi thứ tự đã được xác lập. Vì vậy, điểm chung ở đây cần chú ý đó là:
+ Bảng mã nguồn và bảng mã đích với thứ tự các chuỗi giống nhau, còn lại là thủ tục đổi chỗ.
+ Nếu ngon hơn thì thiết kế thêm các tính năng khác như chuyển chữ hoa (Upper case), thường, đổi phông chữ cho đẹp.
Ngay cả khi bỏ dấu thì nguyên tắc cũng đơn giản chỉ là ánh xạ thôi.
Cách tổ chức bảng mã dữ liệu của tôi là lập danh sách chuỗi theo thứ tự. Các bạn có thể lấy được danh sách chuỗi này bằng cách gõ vào một ô trong bảng tính hàm =GetUnicodeString() (Hiện giờ, hàm này không còn được sử dụng nhưng tôi vẫn để lại trong chương trình để các bạn tiện tham khảo khi có nhu cầu muốn làm bảng mã mới).
PHP:
á/à/ả/ã/ạ/ă/ắ/ằ/ẳ/ẵ/ặ/â/ấ/ầ/ẩ/ẫ/ậ/é/è/ẻ/ẽ/ẹ/ê/ế/ề/ể/ễ/ệ/í/ì/ỉ/ĩ/ị/ó/ò/ỏ/õ/ọ/ô/ố/ồ/ổ/ỗ/ộ/ơ/ớ/ờ/ở/ỡ/ợ/ú/ù/ủ/ũ/ụ/ư/ứ/ừ/ử/ữ/ự/ý/ỳ/ỷ/ỹ/ỵ/đ/Á/À/Ả/Ã/Ạ/Ă/Ắ/Ằ/Ẳ/Ẵ/Ặ/Â/Ấ/Ầ/Ẩ/Ẫ/Ậ/É/È/Ẻ/Ẽ/Ẹ/Ê/Ế/Ề/Ể/Ễ/Ệ/Í/Ì/Ỉ/Ĩ/Ị/Ó/Ò/Ỏ/Õ/Ọ/Ô/Ố/Ồ/Ổ/Ỗ/Ộ/Ơ/Ớ/Ờ/Ở/Ỡ/Ợ/Ú/Ù/Ủ/Ũ/Ụ/Ư/Ứ/Ừ/Ử/Ữ/Ự/Ý/Ỳ/Ỷ/Ỹ/Ỵ/Đ
PHP:
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Õ/Î/Đ
Tiếp theo là đưa dãy ký tự này để lưu vào mảng hoặc đối tượng nào có thể lưu được (Code Module hoặc trên bảng tính hay trong form). Trước đây, tôi lưu thẳng vào Code Module (Vì thế trông code đến khiếp) nhưng sau này tôi đưa vào một điều khiển nhãn (Label) và để trong Form frmResource.
Sau đó là việc tạo hàm truy vấn dãy dữ liệu này trong module mdlResources. (xem hàm GetCodetable).
4. Module chứa các thủ tục chuyển mã - mdlConvert
Module này khá quan trọng, cốt lõi của module là dãy các biến toàn cục, thủ tục ConvertRange để xử lý ban đầu đối với vùng chọn trước khi chuyển đổi và hàm ConvertText để thực hiện ánh xạ.
4.1 Thủ tục ConvertRange
Thủ tục này sẽ thực hiện toàn bộ các việc như:
+ Xử lý điều kiện và nạp biến nhớ;
+ Định hướng việc chuyển đổi bảng mã, nạp lại các bảng mã mới khi cần thiết;
+ Chuyển đổi phông chữ;
+ Xác định bảng mã nguồn ...vv
Đây là trái tim của toàn bộ công việc chuyển đổi vì thế trong tương lai tôi sẽ còn sửa đồi nhiều để việc chuyển mã diễn ra tốt nhất.
Có một số thủ tục/ hàm liên quan đến thủ tục này là:
PHP:
InitDestination: Nạp các biến nhớ và khải tạo mảng chứa bảng mã đích;
InitSource: Nạp biến nhớ của bảng mã nguồn
GetSourceCodeTable: Lấy bảng mã tương ứng từ module dữ liệu
GetFontAddUp: Lấy chuỗi chứa tên Font tương đương để xử lý
SetCellFont: Ấn định phông chữ cho ô xử lý.
4.2 Hàm ConvertText
Hàm này chỉ nhằm mục đích xử lý ánh xạ bảng mã từ đầu vào và chuyển mã.
PHP:
Private Function ConvertText( _
TextToConvert As String, _
FrObj As Variant, _
ToObj As Variant, _
mFrType As Boolean, _
mToType As Boolean) As String
'Routine for getting the vowel list of the selected text
Dim i, j, k, ProcessedList() As String, ReserveList() As String
Dim RptText As String
ReDim ProcessedList(133)
ReDim ReserveList(133)
If mFrType Then
For i = 0 To UBound(FrObj)
If Len(FrObj(i)) = 1 Then
' process it later or it may cause wrong conversion
ReserveList(k) = i
k = k + 1
Else
If InStr(TextToConvert, FrObj(i)) <> 0 Then
' Replace the occurence of search string with number
ProcessedList(j) = i
TextToConvert = Replace(TextToConvert, FrObj(i), "[[" & ProcessedList(j) & "]]")
j = j + 1
End If
End If
Next
If k > 0 Then
ReDim Preserve ReserveList(k - 1)
For i = 0 To UBound(ReserveList)
If InStr(TextToConvert, FrObj(ReserveList(i))) <> 0 Then
' Replace the occurence of search string with number
ProcessedList(j) = ReserveList(i)
TextToConvert = Replace(TextToConvert, FrObj(ReserveList(i)), "[[" & ProcessedList(j) & "]]")
j = j + 1
End If
Next
End If
Else
For i = 0 To UBound(FrObj)
If InStr(TextToConvert, FrObj(i)) <> 0 Then
' Replace the occurence of search string with number
ProcessedList(j) = i
TextToConvert = Replace(TextToConvert, FrObj(i), "[[" & ProcessedList(j) & "]]")
j = j + 1
End If
Next
End If
On Error GoTo errHandle
ReDim Preserve ProcessedList(j - 1)
' now just simple replace all stuff
For i = 0 To UBound(ProcessedList)
TextToConvert = Replace(TextToConvert, "[[" & ProcessedList(i) & "]]", ToObj(ProcessedList(i)))
Next
ConvertText = TextToConvert
Exit Function
errHandle:
If IsEmpty(j) Or IsNull(j) Then
' nothing to do with this text
ConvertText = TextToConvert
End If
End Function
PHP:
TextToConvert = Replace(TextToConvert, FrObj(ReserveList(i)), "[[" & ProcessedList(j) & "]]")
PHP:
If Len(FrObj(i)) = 1 Then
' Nhớ lại và xử lý sau để tránh ánh xạ sai
ReserveList(k) = i
k = k + 1
Else
If InStr(TextToConvert, FrObj(i)) <> 0 Then
' Thay thế từ khóa tìm thấy với số hiệu được đặt trong dấu [[số hiệu]]
ProcessedList(j) = i
TextToConvert = Replace(TextToConvert, FrObj(i), "[[" & ProcessedList(j) & "]]")
j = j + 1
End If
End If
Tóm lại tôi đã giới thiệu xong cách tiếp cận. Bên cạnh tính năng chuyển mã, hiện có nhiều công cụ khác như đổi số sang chữ, in lịch âm dương, tra từ điển trực tuyến trong Excel... nhưng nói chung chúng không quan trọng lắm.
Trong thời gian tới, nếu có thời gian, tôi sẽ bổ sung thêm các công cụ khác.
Hy vọng các thành viên của diễn đàn có quan tâm cùng tham gia và nếu có thể, cùng bắt tay vào Chiến đấu.
Các bạn quan tâm, xin cùng chia sẻ qua email (ngocdd@sfdp.net) hoặc qua diễn đàn nhé.
Chúc các bạn vui vẻ và thành thật xin lỗi nếu có gì phiền toái.
File đính kèm
Lần chỉnh sửa cuối: