[Chia sẻ] Hàm tạo một số loại Barcode mã nguồn thuần VBA

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

Mr.hieudoanxd

Thành viên thường trực
Tham gia
25/10/19
Bài viết
292
Được thích
132
Xuất phát từ bài viết này. Trong quá trình tìm hiểu cách tạo QRCode và URL, Em cải tiến thêm và bổ sung một số mã Barcode khác.
Hôm nay em chia sẻ mọi người trong diễn đàn hàm AddBarCode để tạo các loại mã sau:
QRCode, DataMatrix, Aztec, MaxiCode, Code128, EAN-13, UPC-A, ITF-14, Code39
Công thức hàm AddBarCode ( Text , sStyle , isRes). Trong đó các tham số
+)Text: Văn bản muốn chuyển đổi sang mã Barcode tương ứng
+)sStyle: Loại Barcode muốn chuyển đổi tương ứng như sau:
QRCode = 0 (Giá trị mặc định)
DataMatrix = 1
Aztec = 2
MaxiCode = 3
Code128 = 4
EAN13 = 5
UPCA = 6
ITF = 7
Code39 = 8
+)isRes: Có trả về văn bản báo hoàn thành hay không?
Hàm trên nếu báo lỗi sẽ trả về Comment tại ô viết hàm trong comment có nội dung URL sử dụng và quy tắc của văn bản đầu vào tương ứng với loại Barcode muốn tạo

P/s: Trong bài có sử dụng hàm Uniconvert chắc của anh @huuthang_bd
Mã:
Enum s_Barcode
    sQRCode = 0
    sDataMatrix = 1
    sAztec = 2
    sMaxiCode = 3
    sCode128 = 4
    sEAN13 = 5
    sUPCA = 6
    sITF = 7
    sCode39 = 8
End Enum

Function AddBarCode(Text As String, Optional ByVal sStyle As s_Barcode = sQRCode, Optional ByVal isRes As Boolean = False) As String
    Dim sURL As String, sFolderPath As String, sFilePath As String, str As String
    Dim objXML As Object, objStream As Object
    Dim rng As Range, sh As Worksheet, shp As Shape, arr
    
    On Error Resume Next
    Application.Volatile
    
    Set objXML = CreateObject("MSXML2.XMLHTTP")
    Set objStream = CreateObject("ADODB.Stream")
    Set rng = Application.Caller
    Set sh = rng.Worksheet
    arr = Array("QRCode", "DataMatrix", "Aztec", "MaxiCode", "Code128", "EAN-13", "UPC-A", "ITF-14", "Code39")
    
    If Text = "" Then Exit Function
    For Each shp In sh.Shapes
        If Not Intersect(shp.TopLeftCell, rng) Is Nothing Then shp.Delete
    Next shp
    If Not (rng.Comment Is Nothing) Then rng.Comment.Delete
    
    sFolderPath = Environ("TEMP") 'truy xuat bien moi truong cua he dieu hanh
    sFilePath = sFolderPath & "\QRCode.png"
    str = EncodeURL(Text)
    
    Select Case sStyle
Rem Case "QRCode":      sURL = "https://api.qrserver.com/v1/create-qr-code/?size=150x150&data=" & str
    Case sQRCode:       sURL = "https://bwipjs-api.metafloor.com/?bcid=qrcode&text=" & str
    Case sDataMatrix:   sURL = "https://bwipjs-api.metafloor.com/?bcid=datamatrix&text=" & str
    Case sAztec:        sURL = "https://bwipjs-api.metafloor.com/?bcid=azteccode&text=" & str
    Case sMaxiCode:     sURL = "https://bwipjs-api.metafloor.com/?bcid=maxicode&text=" & str
    Case sCode128:      sURL = "https://bwipjs-api.metafloor.com/?bcid=code128&text=" & str
    Case sEAN13:        sURL = "https://bwipjs-api.metafloor.com/?bcid=ean13&text=" & str
    Case sUPCA:         sURL = "https://bwipjs-api.metafloor.com/?bcid=upca&text=" & str
    Case sITF:          sURL = "https://bwipjs-api.metafloor.com/?bcid=itf14&text=" & str
    Case sCode39:       sURL = "https://bwipjs-api.metafloor.com/?bcid=code39&text=" & str
    Case Else:          Exit Function
    End Select
    
    objXML.Open "GET", sURL, False ' Tai hinh anh QR Code tu URL
    objXML.sEnd
    If objXML.Status = 200 Then ' Kiem tra trang thai phan hoi HTTP
        With objStream ' Luu hinh anh vao stream
            .Type = 1 ' Binary
            .Open
            .Write objXML.responseBody
            .SaveToFile sFilePath, 2 ' Luu vao tep tam thoi
            .Close
        End With
 
        With ActiveSheet.Pictures.Insert(sFilePath) ' Chen hinh anh vao trang tinh
            .Left = rng.Left
            .Top = rng.Top
            .Width = rng.Width
            .Height = rng.Height
        End With
        Kill sFilePath
        AddBarCode = IIf(isRes, "T" & ChrW(7841) & "o " & arr(sStyle) & " Xong!", "")
    Else
        AddBarCode = ""
        str = UniConvert("Khoong theer tari hifnh arnh QR Code tuwf") & "URL: " & ChrW(10) & sURL
        Select Case sStyle
        Case sQRCode:       str = str
        Case sDataMatrix:   str = str & ChrW(10) & "Mã DataMatrix " & UniConvert("laf chuooxi bao goofm casc kys tuwj") & " ASCII t" & ChrW(7915) & " 0-255"
        Case sAztec:        str = str & ChrW(10) & UniConvert("Max Aztec la chuooxi bao goofm casc kys tuwj") & " ASCII t" & ChrW(7915) & " 0-255"
        Case sMaxiCode:     str = str & ChrW(10) & "Mã MaxiCode " & UniConvert("laf chuooxi bao goofm casc kys tuwj") & " ASCII t" & ChrW(7915) & " 0-255"
        Case sCode128:      str = str & ChrW(10) & UniConvert("Max Code128 laf chuooxi bao goofm casc kys tuwj ASCII tuwf 0 ddeesn 127")
        Case sEAN13:        str = str & ChrW(10) & UniConvert("Max EAN-13 laf chuooxi 12 chuwx soos, chir chuwsa soos tuwf 0 ddeesn 9")
        Case sUPCA:         str = str & ChrW(10) & UniConvert("Max UPC-A la chuooxi 11 chuwx soos, chir chuwsa soos tuwf 0 ddeesn 9")
        Case sITF:          str = str & ChrW(10) & "Mã ITF-14 " & UniConvert("laf chuooxi cos 13 hoawjc 14 chuwx soos, chir chuwsa soos tuwf 0 ddeesn 9")
        Case sCode39:       str = str & ChrW(10) & UniConvert("Max Code39 laf chuooxi bao goofm casc kys tuwj A ddeesn Z, 0 ddeesn 9 vaf moojt soos kys tuwj ddawjc bieejt nhuw ( - , . $ / + %   ")
        End Select
        With rng
            .AddComment
            .Comment.Visible = True
            .Comment.Text Text:=cst_AddinName & ":" & ChrW(10) & " " & str
            .Comment.Shape.TextFrame.Characters.Font.Bold = False
        End With
    End If
End Function
Private Function EncodeURL(Text As String) As String
    Dim i As Long, s As String, str As String
    For i = 1 To Len(Text)
        s = Mid(Text, i, 1)
        Select Case Asc(s)
        Case 48 To 57, 65 To 90, 97 To 122  ' 0-9, A-Z, a-z
            str = str & s
        Case Else
            str = str & "%" & Right("0" & Hex(Asc(s)), 2)
        End Select
    Next i
    EncodeURL = str
End Function
 

File đính kèm

  • Barcode.xlsm
    38 KB · Đọc: 23
Hàm này cần kết nối internet đúng không bạn, ngày xưa có google api, giờ api đó chết rồi, dùng qua internet nhanh nhưng bị phụ thuộc vào việc họ có duy trì dịch vụ nữa không
 
Upvote 0
Hàm này cần kết nối internet đúng không bạn, ngày xưa có google api, giờ api đó chết rồi, dùng qua internet nhanh nhưng bị phụ thuộc vào việc họ có duy trì dịch vụ nữa không
Đúng rồi bác. Ví dụ như link ở bài viết ở trên em dẫn nguồn đã hỏng URL rồi
 
Upvote 0
Hãy thử gõ google lệnh "barcode vba github" bạn sẽ nhận được một vài mã nguồn VBA, kể cả qrcode
 
Upvote 0
Đối với vụ barcode/qr code này thì tôi lại thích dùng thư viện có sẵn cho nhanh chứ tìm hiểu cách tạo nó thì hết giờ :cool:.
Dùng thư viện (Zxing.dll) thì phải thêm công đoạn đăng ký nhưng khỏi cần phải kết nối internet mới tạo được. Việc đăng ký thì chỉ cần chạy một file cmd là xong. Các bạn tôi đã sử dụng qua với các máy in barcode, các kích cỡ khác nhau nhưng không bị lỗi scan không ra hoặc ra kết quả khác như một số code dùng font barcode như: IDAutomationHC39M, Code39, Libre code 39...(Có thể do dùng bản free nên bị vậy).


Screen Shot 2024-07-17 at 17.16.54.png Screen Shot 2024-07-17 at 17.17.32.png

Screen Shot 2024-07-17 at 17.48.18.png

8lKx9Ej.png


File này tôi làm trên Access. Code VBA thì giống nhau thôi, chỉ có các phương thức, thuộc tính của các control là khác nhau chút ít. Các bạn có thể tham khảo thêm link trong video, full source code.

 
Lần chỉnh sửa cuối:
Upvote 0
Xuất phát từ bài viết này. Trong quá trình tìm hiểu cách tạo QRCode và URL, Em cải tiến thêm và bổ sung một số mã Barcode khác.
Hôm nay em chia sẻ mọi người trong diễn đàn hàm AddBarCode để tạo các loại mã sau:
QRCode, DataMatrix, Aztec, MaxiCode, Code128, EAN-13, UPC-A, ITF-14, Code39
Công thức hàm AddBarCode ( Text , sStyle , isRes). Trong đó các tham số
+)Text: Văn bản muốn chuyển đổi sang mã Barcode tương ứng
+)sStyle: Loại Barcode muốn chuyển đổi tương ứng như sau:
QRCode = 0 (Giá trị mặc định)
DataMatrix = 1
Aztec = 2
MaxiCode = 3
Code128 = 4
EAN13 = 5
UPCA = 6
ITF = 7
Code39 = 8
+)isRes: Có trả về văn bản báo hoàn thành hay không?
Hàm trên nếu báo lỗi sẽ trả về Comment tại ô viết hàm trong comment có nội dung URL sử dụng và quy tắc của văn bản đầu vào tương ứng với loại Barcode muốn tạo

P/s: Trong bài có sử dụng hàm Uniconvert chắc của anh @huuthang_bd
Mã:
Enum s_Barcode
    sQRCode = 0
    sDataMatrix = 1
    sAztec = 2
    sMaxiCode = 3
    sCode128 = 4
    sEAN13 = 5
    sUPCA = 6
    sITF = 7
    sCode39 = 8
End Enum

Function AddBarCode(Text As String, Optional ByVal sStyle As s_Barcode = sQRCode, Optional ByVal isRes As Boolean = False) As String
    Dim sURL As String, sFolderPath As String, sFilePath As String, str As String
    Dim objXML As Object, objStream As Object
    Dim rng As Range, sh As Worksheet, shp As Shape, arr
 
    On Error Resume Next
    Application.Volatile
 
    Set objXML = CreateObject("MSXML2.XMLHTTP")
    Set objStream = CreateObject("ADODB.Stream")
    Set rng = Application.Caller
    Set sh = rng.Worksheet
    arr = Array("QRCode", "DataMatrix", "Aztec", "MaxiCode", "Code128", "EAN-13", "UPC-A", "ITF-14", "Code39")
 
    If Text = "" Then Exit Function
    For Each shp In sh.Shapes
        If Not Intersect(shp.TopLeftCell, rng) Is Nothing Then shp.Delete
    Next shp
    If Not (rng.Comment Is Nothing) Then rng.Comment.Delete
 
    sFolderPath = Environ("TEMP") 'truy xuat bien moi truong cua he dieu hanh
    sFilePath = sFolderPath & "\QRCode.png"
    str = EncodeURL(Text)
 
    Select Case sStyle
Rem Case "QRCode":      sURL = "https://api.qrserver.com/v1/create-qr-code/?size=150x150&data=" & str
    Case sQRCode:       sURL = "https://bwipjs-api.metafloor.com/?bcid=qrcode&text=" & str
    Case sDataMatrix:   sURL = "https://bwipjs-api.metafloor.com/?bcid=datamatrix&text=" & str
    Case sAztec:        sURL = "https://bwipjs-api.metafloor.com/?bcid=azteccode&text=" & str
    Case sMaxiCode:     sURL = "https://bwipjs-api.metafloor.com/?bcid=maxicode&text=" & str
    Case sCode128:      sURL = "https://bwipjs-api.metafloor.com/?bcid=code128&text=" & str
    Case sEAN13:        sURL = "https://bwipjs-api.metafloor.com/?bcid=ean13&text=" & str
    Case sUPCA:         sURL = "https://bwipjs-api.metafloor.com/?bcid=upca&text=" & str
    Case sITF:          sURL = "https://bwipjs-api.metafloor.com/?bcid=itf14&text=" & str
    Case sCode39:       sURL = "https://bwipjs-api.metafloor.com/?bcid=code39&text=" & str
    Case Else:          Exit Function
    End Select
 
    objXML.Open "GET", sURL, False ' Tai hinh anh QR Code tu URL
    objXML.sEnd
    If objXML.Status = 200 Then ' Kiem tra trang thai phan hoi HTTP
        With objStream ' Luu hinh anh vao stream
            .Type = 1 ' Binary
            .Open
            .Write objXML.responseBody
            .SaveToFile sFilePath, 2 ' Luu vao tep tam thoi
            .Close
        End With
 
        With ActiveSheet.Pictures.Insert(sFilePath) ' Chen hinh anh vao trang tinh
            .Left = rng.Left
            .Top = rng.Top
            .Width = rng.Width
            .Height = rng.Height
        End With
        Kill sFilePath
        AddBarCode = IIf(isRes, "T" & ChrW(7841) & "o " & arr(sStyle) & " Xong!", "")
    Else
        AddBarCode = ""
        str = UniConvert("Khoong theer tari hifnh arnh QR Code tuwf") & "URL: " & ChrW(10) & sURL
        Select Case sStyle
        Case sQRCode:       str = str
        Case sDataMatrix:   str = str & ChrW(10) & "Mã DataMatrix " & UniConvert("laf chuooxi bao goofm casc kys tuwj") & " ASCII t" & ChrW(7915) & " 0-255"
        Case sAztec:        str = str & ChrW(10) & UniConvert("Max Aztec la chuooxi bao goofm casc kys tuwj") & " ASCII t" & ChrW(7915) & " 0-255"
        Case sMaxiCode:     str = str & ChrW(10) & "Mã MaxiCode " & UniConvert("laf chuooxi bao goofm casc kys tuwj") & " ASCII t" & ChrW(7915) & " 0-255"
        Case sCode128:      str = str & ChrW(10) & UniConvert("Max Code128 laf chuooxi bao goofm casc kys tuwj ASCII tuwf 0 ddeesn 127")
        Case sEAN13:        str = str & ChrW(10) & UniConvert("Max EAN-13 laf chuooxi 12 chuwx soos, chir chuwsa soos tuwf 0 ddeesn 9")
        Case sUPCA:         str = str & ChrW(10) & UniConvert("Max UPC-A la chuooxi 11 chuwx soos, chir chuwsa soos tuwf 0 ddeesn 9")
        Case sITF:          str = str & ChrW(10) & "Mã ITF-14 " & UniConvert("laf chuooxi cos 13 hoawjc 14 chuwx soos, chir chuwsa soos tuwf 0 ddeesn 9")
        Case sCode39:       str = str & ChrW(10) & UniConvert("Max Code39 laf chuooxi bao goofm casc kys tuwj A ddeesn Z, 0 ddeesn 9 vaf moojt soos kys tuwj ddawjc bieejt nhuw ( - , . $ / + %   ")
        End Select
        With rng
            .AddComment
            .Comment.Visible = True
            .Comment.Text Text:=cst_AddinName & ":" & ChrW(10) & " " & str
            .Comment.Shape.TextFrame.Characters.Font.Bold = False
        End With
    End If
End Function
Private Function EncodeURL(Text As String) As String
    Dim i As Long, s As String, str As String
    For i = 1 To Len(Text)
        s = Mid(Text, i, 1)
        Select Case Asc(s)
        Case 48 To 57, 65 To 90, 97 To 122  ' 0-9, A-Z, a-z
            str = str & s
        Case Else
            str = str & "%" & Right("0" & Hex(Asc(s)), 2)
        End Select
    Next i
    EncodeURL = str
End Function
Delphi có sẳn mã nguồn Mở trên github.com ... Bạn xem có phải nó như các mã mà bạn cung cấp ...

Nếu đúng như vậy Rảnh tôi viết lại nó xuất hàm API vậy là cứ thế ta dùng

1721219814155.png

Link cho ai đó tò mò thử
 
Lần chỉnh sửa cuối:
Upvote 0
Delphi có sẳn mã nguồn Mở trên github.com ... Bạn xem có phải nó như các mã mà bạn cung cấp ...

Nếu đúng như vậy Rảnh tôi viết lại nó xuất hàm API vậy là cứ thế ta dùng

Sink cho ai đó tò mò thử
Cảm ơn bác!. Có lẽ em không hợp với Delphi cho lắm. Em xong chút dự án còn dở dang của VBA này chắc chuyển sang nghiên cứu C# bác ạ.
 
Upvote 0
Cảm ơn bác!. Có lẽ em không hợp với Delphi cho lắm. Em xong chút dự án còn dở dang của VBA này chắc chuyển sang nghiên cứu C# bác ạ.
1/ Zxing là thư viện mã nguồn mở . từ đó các ngôn ngữ lập trình khác nhau dựa vào đó phát triển thành cái riêng của họ

bạn cũng có thể dựa vào đó viết lại thành DLL của riêng mình nếu bạn có khả năng

2/ Viết trên Delphi , C# hay bất cứ ngôn ngữ lập trình hiện đại nào đang còn phát triển và hổ trợ không quan trọng ... mà quan trọng là khả năng của bạn dựa vào đó viết được gì ứng dụng vào thực tế cho bạn xong chia sẻ hay bán tuỳ theo cách của bạn

3/ cố giắng tự viết lấy mà sử dụng.. hay hay dở, nhanh hay chậm không quan trong lắm ... mà quan trong là có viết cho nó chạy ra kết qua như mong đọi hay không xong từ đó nó sẻ hay và nhanh lên thôi

trừ khi không có khả năng viết thì mới sử dụng thư viện của bên thứ 3
 
Upvote 0
3/ cố giắng tự viết lấy mà sử dụng.. hay hay dở, nhanh hay chậm không quan trong lắm ... mà quan trong là có viết cho nó chạy ra kết qua như mong đọi hay không xong từ đó nó sẻ hay và nhanh lên thôi
Cái này đúng kiểu của em này. Hay hay dở cũng thích tự làm. Chứ đọc bài nào dù hay đến mấy mà em không hiểu code thì cũng xin khiếu. giữ lại ý tưởng trong đầu tìm hiểu dần. Đến một lúc nào đó trình độ mình tới thì cố gắng đọc hiểu, viết tiếp chứ không sử dụng.
 
Upvote 0
Cái này đúng kiểu của em này. Hay hay dở cũng thích tự làm. Chứ đọc bài nào dù hay đến mấy mà em không hiểu code thì cũng xin khiếu. giữ lại ý tưởng trong đầu tìm hiểu dần. Đến một lúc nào đó trình độ mình tới thì cố gắng đọc hiểu, viết tiếp chứ không sử dụng.
có 2 hướng đi cho ai đó nếu thấy phù hợp

1/ nếu không biết code thì họ viết cho xong họ thả BOM gì đó kệ họ còn ta chỉ biết sử dụng là tốt rồi

2/ nếu có biết chút ít code két thì tìm code nào đó mà ta có thể hiểu và vận dụng được nó xong từ đó kế thừa học và phát triển thêm

còn code nhiều làm rối hay quá phức tạp nhìn vào không hiểu gì thì chỉ lưu tham khảo thôi còn không cần thiết sử dụng làm gì cả

...

3/ Rảnh từng bước học thêm một ngôn ngữ hiện đại mà viết mã vì VBA được viết cách đây trên 20 năm rồi nên có nhiều thứ lỗi thời ọp ẹp không còn phù hợp nữa với thời đại công nghệ AI VÀ DỮ LIỆU NHIỀU

SAU HƠN 20 NĂM RỒI MS vẫn để đó và không có hổ trợ gì đặc biệt cả Ví dụ hàm Split viết cách đây trên 20 năm khi đó là đỉnh cao của chóp

khi đó Excel 2003 chỉ có 65536 dòng vậy sau hơn 20 năm vẫn sử dụng thì Excel 2010 đã lên 1048576 dòng ví dụ có trong link sau

khi tôi thử viết hàm SplitString từ Delphi thì nó chạy nhanh gấp vài lần hàm Split mặc định trên VBA với cùng dữ liệu như nhau


Mã:
Sub Test_Split_VBA_Delphi()
    Dim startTime As Double
    Dim endTime As Double
    Dim TotalTime As Double
    Dim Result As Variant
    Dim i As Long
    Dim S As String
    Dim Delimiter As String

    Rem Tao du lieu mau voi 10.000 dòng
    S = ""
    For i = 1 To 10 '000
        S = S & "Hello,World,This,Is,A,Test" & vbCrLf
    Next i
    Delimiter = ","

    Rem Bat dau do thoi gian
    startTime = Timer

    Rem Goi hàm Split  VBA
    Rem Result = Split(S, Delimiter)                        '100.000 Total time: 0.390625 seconds
   
    Rem Goi hàm SplitString  Delphi
    Result = SplitString(StrPtr(S), StrPtr(Delimiter))      '100.000 Total time: 0.125 seconds
   
    For i = LBound(Result) To UBound(Result)
        Debug.Print Result(i)
    Next i
   
    Rem Ket thúc do thoi gian
    endTime = Timer
    TotalTime = endTime - startTime

    Rem In ra thoi gian thuc thi
    Debug.Print "Total time: " & TotalTime & " seconds"
End Sub

do Ms họ bỏ không quan tâm nữa thôi chứ họ mà viết và hổ trợ mới thì nhanh gấp tỷ lần tôi viết :p:D
 
Upvote 0
Đúng rồi bác. Ví dụ như link ở bài viết ở trên em dẫn nguồn đã hỏng URL rồi
Bạn thử kiểm tra cái code tạo file ảnh QR Code xem sao. Tôi dùng cái App QR & Barcode Scanner (có bản quyền) quét QR code thì thấy nó bị lỗi font.
Hình đầu là trên file Excel của bạn, hình 2 là dùng Zxing.Dll.

QRtestScan_1.jpg QRtestScan_2.jpg
 
Upvote 0
Vấn đề ở dữ liệu đưa vào Hàm EncodeURL Em có 1 text như sau "Tại trạm trộn bê tông Minh tâm HD"

Chuyển sang chuỗi truy vấn có mã URL bằng hàm EncodeURL trên sheet lúc này nó vẫn hiểu đúng và trả về kết quả tương tự với hàm ENCODEURL của bản thân Excel kết quả trả về là: T%E1%BA%A1i%20tr%E1%BA%A1m%20tr%E1%BB%99n%20b%C3%AA%20t%C3%B4ng%20Minh%20t%C3%A2m%20HD

Nhưng ở trong code VBA Giá trị của Text đưa vào có mã UNICODE được hiểu là "T?i tr?m tr?n bê tông Minh tâm HD" do đó dẫn đến kết quả sai của hàm EncodeURL trả về là: T%3Fi%20tr%3Fm%20tr%3Fn%20b%EA%20t%F4ng%20Minh%20t%E2m%20HD

Em sẽ cố khắc phục vấn đề trên!
 
Upvote 0
Vấn đề ở dữ liệu đưa vào Hàm EncodeURL Em có 1 text như sau "Tại trạm trộn bê tông Minh tâm HD"
Hàm EncodeUrl của bạn sai. Bạn lên mạng tìm sẽ có nhiều lắm đó.
Hoặc ngắn gọn nhất là gọi WorksheetFunction :cool:

JavaScript:
Private Function EncodeURL_VBA(ByVal sText As String) As String
    EncodeURL_VBA = Application.WorksheetFunction.EncodeURL(sText)
End Function
 
Upvote 0
Hàm (*)ENCODEURL chỉ có từ excel version 2016 trở lên. Do đó em cố gắng viết lại hàm (**)EncodeURL để các phiên bản thấp hơn cũng sử dụng được. Em test thử kết quả của 2 hàm ở (*) và (**) ra kết quả giống nhau ở bảng tính mà nhỉ
Bài đã được tự động gộp:

Theo Microsoft viết thì Hàm ENCODEURL trả về một chuỗi được mã hóa theo URL, thay thế một số ký tự không phải chữ và số bằng ký hiệu phần trăm (%) và một số thập lục phân thì hàm sau phải trả về kết quả đúng chứ nhỉ?

Mã:
Function EncodeURL(Text As String) As String
    Dim i As Long, s As String, str As String
    For i = 1 To Len(Text)
        s = Mid(Text, i, 1)
        Select Case Asc(s)
        Case 48 To 57, 65 To 90, 97 To 122  ' 0-9, A-Z, a-z
            str = str & s
        Case Else
            str = str & "%" & Right("0" & Hex(Asc(s)), 2)
        End Select
    Next i
    EncodeURL = str
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Mã:
Function EncodeURL(Text As String) As String
    Dim i As Long, s As String, str As String
    For i = 1 To Len(Text)
        s = Mid(Text, i, 1)
        Select Case Asc(s)
        Case 48 To 57, 65 To 90, 97 To 122  ' 0-9, A-Z, a-z
            str = str & s
        Case Else
            str = str & "%" & Right("0" & Hex(Asc(s)), 2)
        End Select
    Next i
    EncodeURL = str
End Function

Bạn test thử hàm ASC() cho ký tự "ă" nó trả về số bao nhiêu (cũng sẽ là 97, đúng ra phải là 259)? Theo bảng ASCII ký tự "a" là 97. Do vậy hàm ASC chuyển đổi không chính xác ký tự "ă" --> encode thành binary cũng sai luôn.
 
Upvote 0
Cập nhật lại bài viết. Sửa hàm EncodeURL(Code trong Module 3) bị lỗi với ký tự UNICODE.
Để Sử dụng được cho các phiên bản Excel thấp hơn Version 2016 (không có hàm ENCODEURL)
 

File đính kèm

  • Barcode.xlsm
    36.2 KB · Đọc: 18
Upvote 0
Nếu người dùng có 1000 mục tạo mã, hàm trên chạy mất bao lâu vậy bạn.

Hàm trên có các lỗi cơ bản đó là:
1. Lỗi đặt đối tượng ActiveSheet
2. Hàm tính toán lại thì mã sẽ tự động chạy lần nữa, và vài lần nữa, chắc là nó sẽ tự tạo barcode chồng chất. Quá bất tiện nếu vài chục công thức tính toán lại chắc là người dùng phải ngồi chờ nó chạy xong rồi mới làm việc được.
3. Lệnh xóa đối tượng tại ô, giả xử người dùng tạo 1 đối tượng của họ. Mã sẽ xóa nó.
4. Đặt thuộc tính Application.Volatile trong trường hợp này, sẽ gây ra tính toán lại bất kể thay đổi nào ở ô nào trong trang tính.

Phương pháp viết mã với hàm như trên là không hiệu quả cho công việc.

Để giải quyết vấn đề:
1. Tải http sử dụng bất đồng bộ, tận dụng ResponseBody để nhập ảnh trực tiếp vào trang tính. Thay vì lưu vào thư mục rồi nhập.
2. Kiểm tra đối tượng đã tồn tại trước khi chạy.
3. Sử dụng Application.ThisCell.Parent thay cho ActiveSheet.

Và bạn nên cung cấp thêm thông tin nguồn gốc API bạn sử dụng để tải.
 
Lần chỉnh sửa cuối:
Upvote 0
Để giải quyết vấn đề:
1. Tải http sử dụng bất đồng bộ, tận dụng ResponseBody để nhập ảnh trực tiếp vào trang tính. Thay vì lưu vào thư mục rồi nhập.
2. Kiểm tra đối tượng đã tồn tại trước khi chạy.
3. Sử dụng Application.ThisCell.Parent thay cho ActiveSheet.

Và bạn nên cung cấp thêm thông tin nguồn gốc API bạn sử dụng để tải.
Bác hướng dẫn thêm về vấn đề này đi. Em cũng mới bập bõm va vào cái này chưa biết về việc sử dụng bất đồng bộ không lưu file vào thư mục mà nhập trực tiếp vào bảng tính
 
Upvote 0
Cập nhật lại bài viết. Sửa hàm EncodeURL(Code trong Module 3) bị lỗi với ký tự UNICODE.
Để Sử dụng được cho các phiên bản Excel thấp hơn Version 2016 (không có hàm ENCODEURL)
bác cho mình hỏi là mình dùng
{ DISPLAYBARCODE "Văn bản" QR } và { MERGEBARCODE Vanban QR } trên Word cũng bị lỗi dấu tiếng việt thì có cách nào fix không?
 
Upvote 0
Web KT

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

Back
Top Bottom