2013-04-22 1 views
6

매크로를 사용하여 Excel 셀에 2 차원 바코드 (PDF417 또는 QR 코드)를 생성하고 싶습니다. 이 작업을 수행하기 위해 유료 라이브러리에 대한 무료 대안이 있습니까?Excel VBA를 사용하여 2D (PDF417 또는 QR) 바코드 생성

나는 certain tools이 일을 할 수는 있지만 우리에게는 상대적으로 비쌉니다.

+0

순수 VBA 솔루션은 (쉽게 찾을 수있는 원격 API 호출의 많은)를 찾기 어려운 것 같다. 다음은 최근 픽업입니다 : http://code.google.com/p/barcode-vba-macro-only/ (방금 테스트되었습니다!) –

+0

이 남자의 웹 사이트를 확인하십시오. 그는 excel 수식을 사용하여 21x21 매트릭스에 대한 QR 코드 알고리즘을 구현했습니다. 아마도 xls-sheet에 구현할 수있는 쉬운 방법을 찾을 수 있습니다. http://blog.ambor.com/2013/03/create-qr-codes-in-excel-or-any.html –

+0

여기를 클릭하십시오. QR code in Excel (VBA) http://stackoverflow.com/questions/5446421/encode-algorithm-qr-code –

답변

8

VBA를 모듈 barcode-vba-macro-only (코멘트에 세바스티앙 페리 언급) 코드는 이해하기 완전히 간단하지 않다 2013 년

에 MIT 라이센스에 따라 지리산 가브리엘에 의해 생성 된 순수한 VBA 1D/2D 코드 생성기입니다, 그러나 위에 링크 된 버전에서 많은 코멘트가 체코 어에서 영어로 번역되었습니다.

워크 시트에서 사용하려면 barcody.bas을 복사하여 모듈의 VBA로 가져 오면됩니다.

=EncodeBarcode(CELL("SHEET"),CELL("ADDRESS"),A2,51,1,0,2) 

사용법은 다음과 같다 : 그것은 그냥 워크 시트 셀 주소로 참조를주고 있기 때문에있는 그대로

  1. CELL("SHEET)CELL("ADDRESS")을 남겨 워크 시트에서이 같은 기능에 넣어 당신은 수식
    • 입니다. A2는 인코딩 할 문자열이있는 셀입니다. 제 경우에는 셀 A2입니다. 따옴표를 사용하여 "텍스트"를 전달하면됩니다. 셀을 사용하면 더욱 역동적입니다.
    • 51은 QR 코드의 옵션입니다. 다른 옵션 = QRCode의
      • 1 그래픽 모드 1 = EAN8/13/UPCA/UPCE 2 = 다섯 인터리브, 코드 39 (3) = 두 50 = 데이터 매트릭스 (51)이다. 바코드는 Shape 객체에 그려집니다. 글꼴 모드는 0입니다. 글꼴 유형을 설치해야한다고 가정합니다. 유용하지 않습니다.
      • 0은 특정 바코드 유형의 매개 변수입니다. QR_Code의 경우 0 = 오류 수정, 1 = 중간 오류 수정, 2 = 4 분의 1 오류 수정, 3 = 높은 오류 수정.
      • 2는 1D 코드에만 적용됩니다. 그것은 완충 지대입니다. 정확히 정확히 무엇을할지는 모르겠지만 1D 막대 공간과 관련이있을 것입니다. 단순히 지금 당신이 할 수있는,이 래퍼로

        Public Sub RenderQRCode(workSheetName As String, cellLocation As String, textValue As String) 
            Dim s_param As String 
            Dim s_encoded As String 
            Dim xSheet As Worksheet 
            Dim QRShapeName As String 
            Dim QRLabelName As String 
        
            s_param = "mode=Q" 
            s_encoded = qr_gen(textValue, s_param) 
            Call DrawQRCode(s_encoded, workSheetName, cellLocation) 
        
            Set xSheet = Worksheets(workSheetName) 
            QRShapeName = "BC" & "$" & Left(cellLocation, 1) _ 
             & "$" & Right(cellLocation, Len(cellLocation) - 1) & "#GR" 
        
            QRLabelName = QRShapeName & "_Label" 
        
            With xSheet.Shapes(QRShapeName) 
             .Width = 30 
             .Height = 30 
            End With 
        
            On Error Resume Next 
            If Not (xSheet.Shapes(QRLabelName) Is Nothing) Then 
             xSheet.Shapes(QRLabelName).Delete 
            End If 
        
            xSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, _ 
             xSheet.Shapes(QRShapeName).Left+35, _ 
             xSheet.Shapes(QRShapeName).Top, _       
             Len(textValue) * 6, 30) _ 
             .Name = QRLabelName 
        
        
            With xSheet.Shapes(QRLabelName) 
             .Line.Visible = msoFalse 
             .TextFrame2.TextRange.Font.Name = "Arial" 
             .TextFrame2.TextRange.Font.Size = 9 
             .TextFrame.Characters.Text = textValue 
             .TextFrame2.VerticalAnchor = msoAnchorMiddle 
            End With 
        End Sub 
        
        Sub DrawQRCode(xBC As String, workSheetName As String, rangeName As String, Optional xNam As String) 
        Dim xShape As Shape, xBkgr As Shape 
        Dim xSheet As Worksheet 
        Dim xRange As Range, xCell As Range 
        Dim xAddr As String 
        Dim xPosOldX As Double, xPosOldY As Double 
        Dim xSizeOldW As Double, xSizeOldH As Double 
        Dim x, y, m, dm, a As Double 
        Dim b%, n%, w%, p$, s$, h%, g% 
        
        Set xSheet = Worksheets(workSheetName) 
        Set xRange = Worksheets(workSheetName).Range(rangeName) 
        xAddr = xRange.Address 
        xPosOldX = xRange.Left 
        xPosOldY = xRange.Top 
        
        xSizeOldW = 0 
        xSizeOldH = 0 
        s = "BC" & xAddr & "#GR" 
        x = 0# 
        y = 0# 
        m = 2.5 
        dm = m * 2# 
        a = 0# 
        p = Trim(xBC) 
        b = Len(p) 
        For n = 1 To b 
            w = AscL(Mid(p, n, 1)) Mod 256 
            If (w >= 97 And w <= 112) Then 
            a = a + dm 
            ElseIf w = 10 Or n = b Then 
            If x < a Then x = a 
            y = y + dm 
            a = 0# 
            End If 
        Next n 
        If x <= 0# Then Exit Sub 
        On Error Resume Next 
        Set xShape = xSheet.Shapes(s) 
        On Error GoTo 0 
        If Not (xShape Is Nothing) Then 
            xPosOldX = xShape.Left 
            xPosOldY = xShape.Top 
            xSizeOldW = xShape.Width 
            xSizeOldH = xShape.Height 
            xShape.Delete 
        End If 
        On Error Resume Next 
        xSheet.Shapes("BC" & xAddr & "#BK").Delete 
        On Error GoTo 0 
        Set xBkgr = xSheet.Shapes.AddShape(msoShapeRectangle, 0, 0, x, y) 
        xBkgr.Line.Visible = msoFalse 
        xBkgr.Line.Weight = 0# 
        xBkgr.Line.ForeColor.RGB = RGB(255, 255, 255) 
        xBkgr.Fill.Solid 
        xBkgr.Fill.ForeColor.RGB = RGB(255, 255, 255) 
        xBkgr.Name = "BC" & xAddr & "#BK" 
        Set xShape = Nothing 
        x = 0# 
        y = 0# 
        g = 0 
        For n = 1 To b 
            w = AscL(Mid(p, n, 1)) Mod 256 
            If w = 10 Then 
            y = y + dm 
            x = 0# 
            ElseIf (w >= 97 And w <= 112) Then 
            w = w - 97 
            With xSheet.Shapes 
            Select Case w 
             Case 1: Set xShape = .AddShape(msoShapeRectangle, x, y, m, m): GoSub fmtxshape 
             Case 2: Set xShape = .AddShape(msoShapeRectangle, x + m, y, m, m): GoSub fmtxshape 
             Case 3: Set xShape = .AddShape(msoShapeRectangle, x, y, dm, m): GoSub fmtxshape 
             Case 4: Set xShape = .AddShape(msoShapeRectangle, x, y + m, m, m): GoSub fmtxshape 
             Case 5: Set xShape = .AddShape(msoShapeRectangle, x, y, m, dm): GoSub fmtxshape 
             Case 6: Set xShape = .AddShape(msoShapeRectangle, x + m, y, m, m): GoSub fmtxshape 
               Set xShape = .AddShape(msoShapeRectangle, x, y + m, m, m): GoSub fmtxshape 
             Case 7: Set xShape = .AddShape(msoShapeRectangle, x, y, dm, m): GoSub fmtxshape 
               Set xShape = .AddShape(msoShapeRectangle, x, y + m, m, m): GoSub fmtxshape 
             Case 8: Set xShape = .AddShape(msoShapeRectangle, x + m, y + m, m, m): GoSub fmtxshape 
             Case 9: Set xShape = .AddShape(msoShapeRectangle, x, y, m, m): GoSub fmtxshape 
               Set xShape = .AddShape(msoShapeRectangle, x + m, y + m, m, m): GoSub fmtxshape 
             Case 10: Set xShape = .AddShape(msoShapeRectangle, x + m, y, m, dm): GoSub fmtxshape 
             Case 11: Set xShape = .AddShape(msoShapeRectangle, x, y, dm, m): GoSub fmtxshape 
               Set xShape = .AddShape(msoShapeRectangle, x + m, y + m, m, m): GoSub fmtxshape 
             Case 12: Set xShape = .AddShape(msoShapeRectangle, x, y + m, dm, m): GoSub fmtxshape 
             Case 13: Set xShape = .AddShape(msoShapeRectangle, x, y, m, m): GoSub fmtxshape 
               Set xShape = .AddShape(msoShapeRectangle, x, y + m, dm, m): GoSub fmtxshape 
             Case 14: Set xShape = .AddShape(msoShapeRectangle, x + m, y, m, m): GoSub fmtxshape 
               Set xShape = .AddShape(msoShapeRectangle, x, y + m, dm, m): GoSub fmtxshape 
             Case 15: Set xShape = .AddShape(msoShapeRectangle, x, y, dm, dm): GoSub fmtxshape 
            End Select 
            End With 
            x = x + dm 
            End If 
        Next n 
        On Error Resume Next 
        Set xShape = xSheet.Shapes(s) 
        On Error GoTo 0 
        If Not (xShape Is Nothing) Then 
            xShape.Left = xPosOldX 
            xShape.Top = xPosOldY 
            If xSizeOldW > 0 Then 
            xShape.Width = xSizeOldW 
            xShape.Height = xSizeOldH 
            End If 
        Else 
            If Not (xBkgr Is Nothing) Then xBkgr.Delete 
        End If 
        Exit Sub 
        fmtxshape: 
            xShape.Line.Visible = msoFalse 
            xShape.Line.Weight = 0# 
            xShape.Fill.Solid 
            xShape.Fill.ForeColor.RGB = RGB(0, 0, 0) 
            g = g + 1 
            xShape.Name = "BC" & xAddr & "#BR" & g 
            If g = 1 Then 
            xSheet.Shapes.Range(Array(xBkgr.Name, xShape.Name)).Group.Name = s 
            Else 
            xSheet.Shapes.Range(Array(s, xShape.Name)).Group.Name = s 
            End If 
            Return 
        
        End Sub 
        

        :

나는 래퍼 함수가 아니라 워크 시트의 수식으로 그것을 사용하는 것보다 그것을 순수 VBA 함수 호출을 추가

Call RenderQRCode("Sheet1", "A13", "QR Value") 

그냥 워크 시트 이름 인 cell을 입력하기 만하면 VBA에서이 코드를 호출하여 QRCode를 렌더링합니다. 위치 및 QR_value. QR 모양은 지정한 위치에 그려집니다.아주 좋은 기존의 대답은하지 않았다 비록

당신은 (나는 이것을 알고있는 QR

With xSheet.Shapes(QRShapeName) 
     .Width = 30 'change your size 
     .Height = 30 'change your size 
    End With 
+0

QR 코드의 내용이 마치 "for 루프"카운터를 통과하는 것처럼 코드를 생성하기위한 입력이 메시지의 중간에서 재설정되어 메시지의 중간에서 몇 단어를 복제합니다. 다른 사람이 위에 링크 된 Google 코드와 같은 문제를 봤습니까? –

+0

나는 아직도이 문제가있다 - 나는 새로운 질문으로 그것을 추가했다 : http://stackoverflow.com/questions/41404226/why-does-this-vba-generated-qr-code-stutter –

+0

나는 지금 말더듬을 고쳤다. 최소한 내가 만난 모든 엣지의 경우), 향상된 코드를 GitHub에 두었습니다. 답변에서 업데이트 된 링크를 참조하십시오. –

3

의 크기를 변경하는 코드 섹션에 꽤 오래되고 잘 정립 된 게시물입니다 주위를 재생할 수 있습니다 아직 받아 들여짐). 그러나 비슷한 게시물에 대해 StackOverflow in Portuguese에 무료로 online API from QR Code Generator을 사용하여 준비한 대안을 공유하고 싶습니다.

코드는 다음

Sub GenQRCode(ByVal data As String, ByVal color As String, ByVal bgcolor As String, ByVal size As Integer) 
On Error Resume Next 

    For i = 1 To ActiveSheet.Pictures.Count 
     If ActiveSheet.Pictures(i).Name = "QRCode" Then 
      ActiveSheet.Pictures(i).Delete 
      Exit For 
     End If 
    Next i 

    sURL = "https://api.qrserver.com/v1/create-qr-code/?" + "size=" + Trim(Str(size)) + "x" + Trim(Str(size)) + "&color=" + color + "&bgcolor=" + bgcolor + "&data=" + data 
    Debug.Print sURL 

    Set pic = ActiveSheet.Pictures.Insert(sURL + sParameters) 
    Set cell = Range("D9") 

    With pic 
     .Name = "QRCode" 
     .Left = cell.Left 
     .Top = cell.Top 
    End With 

End Sub 

그것은 세포의 매개 변수에서 만들어진 URL에서 이미지를 만들어 간단하게 (재)에 의해 일을 가져옵니다. 당연히 사용자는 인터넷에 연결되어 있어야합니다.

예를 들어 (포르투갈어 (브라질)의 내용으로 워크 시트, from 4Shared을 다운로드 할 수 있습니다) :

enter image description here

+1

귀하의 게시물을 보내 주셔서 감사합니다! 정말 감사합니다! API를 사용하여 코드를 관리 할 수있었습니다. 나는 Patratacus 솔루션이 시스템을 주되게 느리게 만들었으므로 한 장에 200 개 이상의 코드를 사용하는 시스템을 개발 중입니다. 그래서 당신의 시스템을 시험해 보았는데 훨씬 더 효과적입니다. 유일한 도전입니다 - 내 PC에서 작동하지만 내 고객 Mac에서는 작동하지 않습니다. 문제는 sURL을 호출하는 중입니다. Mac Shell을 사용해야 할 필요가 있지만 구현하는데 어려움이 있습니다. 어떤 아이디어? 나는 이것을 오히려 새로운 질문이나 답변으로 게시해야합니까? 미리 감사드립니다. – Tristan

+0

안녕하세요 @ 트리스탄. 천만에요. :) 나는 Mac 사용자가 아니므로, 내가 당신을 도울 수는 없을 것 같습니다. 그럼에도 불구하고 OS에서 엑셀이 HTTP 요청을 발행하는 것을 막을 수 있다고 생각됩니다. 다른 URL (단순히 고정 된 이미지로 응답하는 URL)을 사용해 보셨습니까? 그 방향으로 무엇인가를 확인해야합니다. 새 질문을 게시하는 것이 유용 할 수 있지만 문제에 대한 세부 정보가 필요합니다. 특히 문제가 범위를 벗어나 일시적으로 재현되지 않도록 방지해야합니다. 행운을 빕니다!:) –

+0

안녕하세요 @ 루이즈, Mac에서 우리는 Pictures.Insert 코드 내부에 "sURL + sParameters"명령에 의해 반환되는 것과 동일한 문자열을 반환하는 API를 가지고 있습니다. 우리는 맥 쉘 스크립트 "curl --get -d"를 사용하여 이것을 얻었다. 이것은 이미지 원시 데이터를 반환하는 것? 그리고 이제는 Macs Picture.Insert가 원시 데이터와 이미지 경로 만 읽을 수없는 것 같습니다. 그래서 우리는이 문제를 해결할 방법을 찾고 있습니다. Mac 용 Picture.Insert를 통해 원시 데이터를 읽거나 API에서 반환 한 데이터를 파일로 저장 한 다음 pictures.insert로 열 수 있습니다. 어쩌면 아픈 것이 새로운 질문을 시작합니다. 다시 감사드립니다! – Tristan