Khắc phục [QR-Code] sai do bộ gõ tiếng Việt ?

Liên hệ QC

Hoàng Nhật Phương

Thành viên gắn bó
Tham gia
5/11/15
Bài viết
1,894
Được thích
1,213
Xin chào các bạn.
Có thể sử dụng code để điều khiển ứng dụng Unikey được không ạ?
Ví dụ: Unikey đang ở chế độ gõ tiếng Việt, sau khi chạy code chuyển sang chế độ gõ tiếng Anh. Hoặc Unikey đang mở thì đóng lại ạ.
**********************************
Bài viết của tôi đã được giải quyết,hiện tôi đã đưa vào áp dụng kết quả đã OK đối với tôi.

Trong chủ đề có nhiều hướng giải quyết, nhưng tôi xin phép được trích dẫn link các bài viết tiêu biểu trong chủ đề để các bạn tiện theo dõi:
1.https://www.giaiphapexcel.com/diendan/threads/khắc-phục-qr-code-sai-do-bộ-gõ-tiếng-việt.140358/#post-902152
2.https://www.giaiphapexcel.com/diendan/threads/khắc-phục-qr-code-sai-do-bộ-gõ-tiếng-việt.140358/page-3#post-902364
3.https://www.giaiphapexcel.com/diendan/threads/khắc-phục-qr-code-sai-do-bộ-gõ-tiếng-việt.140358/page-7#post-902900

Xin trân trọng cảm ơn tất cả mọi người đã nhiệt tình giúp đỡ và đóng góp ý kiến, đặc biệt với sự giúp đỡ tận tình của các thành viên: Bác @batman1 (@siwtom ) , Anh @huuthang_bd , Anh @Nguyễn Duy Tuân và Bạn @HeSanbi

Xin trân trọng cảm ơn BQT đã tạo ra và đã mang đến cho tôi và mọi người một nơi thật tuyệt vời, một nơi để mọi người cùng nhau có thể trao đổi/học hỏi và cùng nhau thành công trong sự nghiệp.
 
Lần chỉnh sửa cuối:
Thứ nhất tôi không hỏi về mặc định. Mấy cái thiết lập trong CP thì ai chả biết. Tôi hỏi rất cụ thể: tôi chọn liên tục bàn phím Ba Lan, vietnamese, Anh để viết. Trong thời điểm bất kỳ tôi muốn code của bạn chọn bàn phím Anh bất luận ở thời điểm đó tôi đang có bàn phím nào. Thứ hai là tôi muốn nhờ code Python vì bạn nói có thể làm gọn hơn.
Trong Python rất nhiều thư viện, nhiều gói nên anh chớ bận tâm: locale Python
 
Upvote 0
cái này code sao vậy HeSanbi?
PHP:
Sub test_GetVNkeyPath()
  Dim sPath$, ItsMe As Boolean
  ItsMe = GetVNkeyPath(sPath$)
  Debug.Print ItsMe, sPath$
  Application.Wait Now + TimeSerial(0, 0, 3)
  shell sPath
End Sub
    Function GetVNkeyPath(Optional ByRef sPath$) As Boolean
        Dim objProcess As Object, intError&, dArr()
        dArr = Array("unikeynt.exe", "vietkey.exe", "evkey32.exe", "evkey64.exe")
        For Each objProcess In GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") _
                                                    .ExecQuery("select * from win32_process")
            If InStr(1, vbCr & Join(dArr, vbCr) & vbCr, vbCr & LCase$(objProcess.Name) & vbCr) Then
                On Error Resume Next
                intError = objProcess.Terminate
                If intError = 0 Then
                  sPath$ = objProcess.ExecutablePath 'objProcess.CommandLine
                  GetVNkeyPath = True: Exit For
                End If
            End If
        Next
    End Function


Quay về bài toán của bạn OT thì đây là vấn đề hiểm hóc phết. Tôi nói tình huống có thể đa dạng hơn
Hóc búa thì anh có thể tìm giải pháp: Quét mã vạch / QRCode với C++ và OpenCV và ZBar
Đây là đoạn mã dịch QR Code trong Python:
Python:
from pyzbar.pyzbar import decode
from PIL import Image
decode(Image.open('.../code.png'))

Nói thêm một kỹ thuật gán giữa Python và VBA anh sẽ thấy sự ngắn gọn dễ hiểu của Python:
Python:
ValueM , ValueN= 1 , 2
ValueM , ValueN = ValueN, ValueM
Xử lý Dictionary tốt hơn VBA
VBA:
Dim ValueM , ValueN
ValueM = 1: ValueN = 2
Dim TrungGian
TrungGian = ValueM
ValueM=ValueN : ValueN = TrungGian
 
Lần chỉnh sửa cuối:
Upvote 0
Về giải thuật thì gần như bất kể ngôn ngữc lập trình nào cũng làm được điều này. VBA làm lại còn ngắn gọn hơn. Nhưng vấn đề ở chỗ đã có ai code dự án đó chưa chứ bản thân ngôn ngữ nào cũng chắc chắn không có sẵn những thứ gọi là "thủ thuật" riêng của Excel.
Mấy nội dung em nói ở bài #26 nằm hết trong file đính kèm, anh xem trong đó có gì hay không..
 

File đính kèm

  • xl_dll.zip
    168.4 KB · Đọc: 33
Upvote 0
Bạn thử xem được không.
Hoạt động của bộ gõ tiếng Việt rất phức tạp (ít nhất là đối với Unikey trên máy tôi). Tôi mới chỉ chạy thử khi nhập từ bàn phím với Unikey và máy của tôi thôi, không biết trên máy khác và/hoặc bộ gõ khác và khi scan barcode thì như thế nào.
Code trong file đính kèm hoạt động theo cơ chế nhận Keycode của sự kiện KeyUp, loại bỏ Keycode của Unikey và chuyển Keycode về ký tự.
Cảm ơn anh Hữu Thắng, Code trong form hoạt động tốt ạ,đây là kết quả test ạ bằng thiết vị scanner ạ.
Bây giờ làm thế nào cứ quét xong 1 QR-Code thì thông tin trong textbox sẽ ghi xuống từng ô trên bảng tính giống như quét trực tiếp trên bảng tính vậy anh?
 
Upvote 0
Bây giờ làm thế nào cứ quét xong 1 QR-Code thì thông tin trong textbox sẽ ghi xuống từng ô trên bảng tính giống như quét trực tiếp trên bảng tính
Đơn giản vậy thôi à. Tôi tưởng cơ chế phức tạp hơn:
Khi quét mã xong sẽ Ghi vào Excel. Nếu mã trùng với dữ liệu thì lấy dữ liệu tương ứng cho vào cột sau. Cột tiếp theo,nếu nhập vào Form ghi chú thì ghi chú sẽ nhập ở cột thứ 3 khi bắt Event nghe được ấn Enter.
PHP:
Private Sub TextBox1_Change()
  Dim LastRow&
  LastRow = Range("B" & Rows.Count).End(xlUp).Row
  Range("B" & LastRow + 1) = TextBox1.Value
  'TextBox1.Value = vbNullString
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn anh Hữu Thắng, Code trong form hoạt động tốt ạ,đây là kết quả test ạ bằng thiết vị scanner ạ.
Bây giờ làm thế nào cứ quét xong 1 QR-Code thì thông tin trong textbox sẽ ghi xuống từng ô trên bảng tính giống như quét trực tiếp trên bảng tính vậy anh?
Như bạn có đề cập, tôi làm cho bạn 2 lựa chọn: Ghi trực tiếp xuống sheet hoặc ghi vào listbox sau đó mới ghi xuống sheet 1 lần. Bạn tìm đoạn tôi ghi chú và xóa bớt đoạn code bạn không chọn.
Lưu ý: Bạn nên test kỹ trước khi đưa vào áp dụng vì tôi chỉ code trên những gì tôi nghĩ chứ không có điều kiện thực nghiệm. Bạn hãy thử với tất cả các ký tự bao gồm cả số và các ký tự khác, trong code có khai báo các ký tự được chấp nhận - đó là theo các ký tự trên bàn phím của tôi thực tế có thể có ký tự mà bàn phím của tôi không có.
 

File đính kèm

  • Textbox to scan barcode.xlsm
    27.4 KB · Đọc: 26
Upvote 0
phải cho người khác xem thì người ta mới cho mình xem chứ , ấy là học hỏi lẫn nhau ^^
^
Thì cũng tùy có cái nên cho ... có cái thì ko cho ... chính vì vậy mới phân biệt được cái nọ cái kia ===\.-0-0-0--0-0-0--0-0-0--0-0-0-
mà sao bác bill ko cho hết đi nhỉ ... cất dấu làm chi không biết ????!!!! mà cái thư viên Hàm Đồ sộ đó của Bác Bill vẫn cho xài thoải mái đó chi ???
 
Upvote 0
Như bạn có đề cập, tôi làm cho bạn 2 lựa chọn: Ghi trực tiếp xuống sheet hoặc ghi vào listbox sau đó mới ghi xuống sheet 1 lần. Bạn tìm đoạn tôi ghi chú và xóa bớt đoạn code bạn không chọn.
Lưu ý: Bạn nên test kỹ trước khi đưa vào áp dụng vì tôi chỉ code trên những gì tôi nghĩ chứ không có điều kiện thực nghiệm. Bạn hãy thử với tất cả các ký tự bao gồm cả số và các ký tự khác, trong code có khai báo các ký tự được chấp nhận - đó là theo các ký tự trên bàn phím của tôi thực tế có thể có ký tự mà bàn phím của tôi không có.
Bổ sung: Bạn thử cả trường hợp Caplock bật và tắt nhé. Code viết cho việc nhập từ bàn phím nên có tính đến trạng thái của Caplock, cơ chế của máy quét có thể khác.
 
Upvote 0
VBA ở một số hoàn cảnh tốc độ chạy nhanh hơn bất kẻ ngôn ngữ nào có nhúng với nó. VÍ dụ các bạn làm
Dim Arr
Arr = Range("A1:H10000").Value -> Code này lấy ra mảng giá trị trong vùng A1:H10000
Không biết anh có hiểu nhầm gì đó không. Theo em nghĩ VBA thông qua C++ để lấy dữ liệu trên bảng tính sau khi xử lý dữ liệu xong lại thông qua C++ để ghi vào bảng tính. Vì VBA là độc lập, nó chỉ bổ trợ cho Excel.
Khi khởi động Excel thì C++ sẽ được biên dịch và chạy trước. Mọi việc sau này VBA phải thông qua C++ để thực hiện.
Excel được viết bằng C++ và C# phải không anh!

lâu nay thấy mọi người nói Python rảnh tính mò thử quậy chơi xem tình hình sao ... thấy nói vậy mất gió luôn ... 123 Run
Chắc anh sợ rơi ý tưởng vào tay của người khác. "Và gặp nguy hiểm"
 
Lần chỉnh sửa cuối:
Upvote 0
Như bạn có đề cập, tôi làm cho bạn 2 lựa chọn: Ghi trực tiếp xuống sheet hoặc ghi vào listbox sau đó mới ghi xuống sheet 1 lần. Bạn tìm đoạn tôi ghi chú và xóa bớt đoạn code bạn không chọn.
Lưu ý: Bạn nên test kỹ trước khi đưa vào áp dụng vì tôi chỉ code trên những gì tôi nghĩ chứ không có điều kiện thực nghiệm. Bạn hãy thử với tất cả các ký tự bao gồm cả số và các ký tự khác, trong code có khai báo các ký tự được chấp nhận - đó là theo các ký tự trên bàn phím của tôi thực tế có thể có ký tự mà bàn phím của tôi không có.
Xin chào anh Hữu Thắng,
Code trong form đã xử lý được trường hợp bộ gõ tiếng Việt.
Bổ sung: Bạn thử cả trường hợp Caplock bật và tắt nhé. Code viết cho việc nhập từ bàn phím nên có tính đến trạng thái của Caplock, cơ chế của máy quét có thể khác.
Nhưng trường hợp Caplock thì lỗi ạ. OT gửi kết quả test nhờ anh xem giúp ạ.
Cảm ơn Anh.
 
Upvote 0
Xin chào anh Hữu Thắng,
Code trong form đã xử lý được trường hợp bộ gõ tiếng Việt.

Nhưng trường hợp Caplock thì lỗi ạ. OT gửi kết quả test nhờ anh xem giúp ạ.
Cảm ơn Anh.
Vậy thì không xét Caplock nữa thôi.
--
À tôi nhầm. Đây lỗi thuật toán, tôi sẽ sửa lại cho bạn.
Bài đã được tự động gộp:

Xin chào anh Hữu Thắng,
Code trong form đã xử lý được trường hợp bộ gõ tiếng Việt.

Nhưng trường hợp Caplock thì lỗi ạ. OT gửi kết quả test nhờ anh xem giúp ạ.
Cảm ơn Anh.
Bạn thử file này xem.
 

File đính kèm

  • Textbox to scan barcode.xlsm
    27.4 KB · Đọc: 17
  • Textbox to scan barcode (new).xlsm
    27.6 KB · Đọc: 24
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Vậy thì không xét Caplock nữa thôi.
--
À tôi nhầm. Đây lỗi thuật toán, tôi sẽ sửa lại cho bạn.
Bài đã được tự động gộp:

Bạn thử file này xem.
Anh Hữu Thắng ơi, OT cảm ơn anh ạ.
OT đã test thử code trong 2 file.
Trường hợp lỗi xuất hiện các ký tự đặc biệt khi bật Capslock đã được xử lý ạ và trường hợp này giống với trường hợp khi OT test trực tiếp trên sheet không cần qua Form như video trên.

Nhưng vấn đề OT đang hiểu trong trường hợp xử lý lỗi liên quan đến vấn đề Capslock ở đây là nếu có bật hay tắt caplock thì QR-Code cũng không thay đổi. Cụ thể ví dụ trong video trên: QR-Code đang là chữ "YR" nếu bật caplock trong trường hợp thông qua Form hay trực tiếp trên Sheet thì nó tự chuyển thành chữ thường "yr"...
Có cách nào khắc phục giống như chế độ tắt CapsLock đi không ạ?
chữ "YR" nhận vào máy tính không thay đổi hoặc nếu QR-Code là "Aa" thì dù bật caplock thông tin ghi nhận vào máy tính vẫn là "Aa" tương tự trường hợp anh đã xử lý chế độ bật bộ gõ tiếng Việt ạ.
---
Oanh Thơ xin phép sửa lại tiêu đề ạ.
 
Upvote 0
Anh Hữu Thắng ơi, OT cảm ơn anh ạ.
OT đã test thử code trong 2 file.
Trường hợp lỗi xuất hiện các ký tự đặc biệt khi bật Capslock đã được xử lý ạ và trường hợp này giống với trường hợp khi OT test trực tiếp trên sheet không cần qua Form như video trên.

Nhưng vấn đề OT đang hiểu trong trường hợp xử lý lỗi liên quan đến vấn đề Capslock ở đây là nếu có bật hay tắt caplock thì QR-Code cũng không thay đổi. Cụ thể ví dụ trong video trên: QR-Code đang là chữ "YR" nếu bật caplock trong trường hợp thông qua Form hay trực tiếp trên Sheet thì nó tự chuyển thành chữ thường "yr"...
Có cách nào khắc phục giống như chế độ tắt CapsLock đi không ạ?
chữ "YR" nhận vào máy tính không thay đổi hoặc nếu QR-Code là "Aa" thì dù bật caplock thông tin ghi nhận vào máy tính vẫn là "Aa" tương tự trường hợp anh đã xử lý chế độ bật bộ gõ tiếng Việt ạ.
---
Oanh Thơ xin phép sửa lại tiêu đề ạ.
Tôi tưởng bạn muốn giống y hệt như khi scan trực tiếp không dùng code.
Nếu muốn loại bỏ ảnh hưởng của Caplock thì dễ hơn nữa, không cần xét Caplock. Khi nào sử dụng máy tính tôi sẽ sửa lại giúp bạn.
Hoặc bạn có thể tự sửa, Xóa đoạn If... Then bCap = Not bShift ... Else bCap = bShift và thay bằng bCap = bShift (tôi nhớ mang máng như vậy, nếu đúng thì xóa luôn khai báo hàm API vì không cần dùng)
 
Upvote 0
Tôi tưởng bạn muốn giống y hệt như khi scan trực tiếp không dùng code.
Nếu muốn loại bỏ ảnh hưởng của Caplock thì dễ hơn nữa, không cần xét Caplock. Khi nào sử dụng máy tính tôi sẽ sửa lại giúp bạn.
Hoặc bạn có thể tự sửa, Xóa đoạn If... Then bCap = Not bShift ... Else bCap = bShift và thay bằng bCap = bShift (tôi nhớ mang máng như vậy, nếu đúng thì xóa luôn khai báo hàm API vì không cần dùng)
Dạ, vâng khi nào anh ngồi máy anh sửa giúp OT trường hợp này với ạ.
Cảm ơn anh Hữu Thắng.
 
Upvote 0

File đính kèm

  • Textbox to scan barcode .xlsm
    27.4 KB · Đọc: 48
Upvote 0
Bạn thử lại với file này.
Nhân tiện, tiêu đề có lẽ nên nói nguyên nhân là do bộ gõ tiếng Việt hoặc Unikey thì mới rõ.
Dạ, làm phiền anh Hữu Thắng rồi.
Về kết quả sang tuần đến cơ quan OT sẽ test thử rồi thông tin lại ở đây ạ.
Cảm ơn anh Hữu Thắng.
 
Lần chỉnh sửa cuối:
Upvote 0
Nhìn qua một số điểm sáng của ngôn ngữ thì mình thấy đúng là nếu viết code bằng Python sẽ ngắn gọn thật. Có thể nói code của Python sẽ ngắn gọn hơn C, Pascal, Delphi, .NET, VB/VBA (có thể là gần như vậy) . Nhưng đây là vấn đề của ngôn ngữ. Như kiểu người nói tiếng. Anh, người nói tiếng Việt. Công lực vẫn là con người. Hình như Python là không có biên dịch mã máy vì thế các lập trình viên khi tham gia ngôn ngữ nò thì dù có không muốn Open thì cũng phải Open nên theo đánh giá chủ quan của mình thì Python, ngoài vấn đề ngôn ngữ ngắn nó còn là phương tiện thể thực thi các dự án OpenSource mà ai tham gia đều buộc phải Open?
....
"Ngắn gọn" ở đây hơi chủ quan. Điển hình:
C là ngôn ngữ cấu trúc, lại rất gần mã máy cho nên hầu hết các hàm thư viện của nó viết bằng mã macro máy. Nếu tôi muốn viết ngắn gọn, tôi có thể tự tạo macro để code tôi gọi.
C++ là dạng hướng đối tượng. Hầu hết các hàm thư viện của C++ nằm trong STL được viết với mục đích chuyên tốc độ. Vì là hướng đối tượng cho nên nếu tôi có sẵn một thư viện class hoành tráng thì code của tôi cũng rất ngắn gọn. Code chính chỉ việc dựng đối tượng và kêu nó làm việc.
Trong trường hợp này, nếu không kể code class thư viện thì code chính rất ngắn.
C# nếu có Linq thì sẽ rút ngắn lệnh truy vấn dữ liệu rất nhiều. Như vậy code ấy tính là C# hay Linq?

Ví dụ: điển hình của C++ là câu đố kinh điển "làm thế nào để hiển thị câu "Hello" 20 lần mà khong dùng vòng lặp, không đệ quy?
Câu trả lời là đặt một lớp với hàm dựng mặc định hiển thị câu "Hello"; đặt một lớp khác có thuộc tính là một mảng 20 phần tử loại lớp kia. Khi khởi lớp sau thì tự động 20 phần tử kia sẽ gọi hàm dựng của chúng.

Không biết anh có hiểu nhầm gì đó không. Theo em nghĩ VBA thông qua C++ để lấy dữ liệu trên bảng tính sau khi xử lý dữ liệu xong lại thông qua C++ để ghi vào bảng tính. Vì VBA là độc lập, nó chỉ bổ trợ cho Excel.
Khi khởi động Excel thì C++ sẽ được biên dịch và chạy trước. Mọi việc sau này VBA phải thông qua C++ để thực hiện.
Excel được viết bằng C++ và C# phải không anh!
..
Sai bét. Excel được viết bằng C++. Tức là các hàm và đối tượng được viết bằng C++. VBA chỉ gọi các hàm này thôi. Hầu hết các hàm chuyên thì được nối thẳng vào code, các hàm còn lại đưa vào dll (tương tự như các API's)
Có thể trình dịch và nền tảng VBA được viết bằng C++, nhưng theo tôi biết thì hầu hết các trình dịch đươc viết bằng ngôn ngữ tối ưu của từng nơi. Tức là rất có khả năng MS viết bằng ngôn ngữ riêng của họ.

Khi khởi động Excel thì C++ sẽ được biên dịch và chạy trước
Đúng là lý luận của dân Python, hoàn toàn không có một khái niệm gì về biên dịch và kết nối.
 
Upvote 0
Thì cũng tùy có cái nên cho ... có cái thì ko cho ... chính vì vậy mới phân biệt được cái nọ cái kia ===\.-0-0-0--0-0-0--0-0-0--0-0-0-
mà sao bác bill ko cho hết đi nhỉ ... cất dấu làm chi không biết ????!!!! mà cái thư viên Hàm Đồ sộ đó của Bác Bill vẫn cho xài thoải mái đó chi ???
nói chung trang bị con win và bộ office có bản quyền cũng gần 5 chai , nên khi dùng các chức năng của windows tính ra cũng đâu có miễn phí !
khi dùng các hàm API của win mình thường phải gò theo khuôn khổ các khai báo có sẵn mà không biết trong các hàm API đó nó làm gì , ko như Linux vừa miễn phí mà ta gần như có thể xem mọi thứ bên trong, thông qua đó có thể hiểu đc máy tính nó hoạt động thế nào nếu nghiên cứu , đợi 1 ngày có bản office hỗ trợ macro trên Linux ^^
 
Upvote 0
Web KT
Back
Top Bottom