매크로를 사용하여 Excel 셀에 2 차원 바코드 (PDF417 또는 QR 코드)를 생성하고 싶습니다. 이 작업을 수행하기 위해 유료 라이브러리에 대한 무료 대안이 있습니까?Excel VBA를 사용하여 2D (PDF417 또는 QR) 바코드 생성
나는 certain tools이 일을 할 수는 있지만 우리에게는 상대적으로 비쌉니다.
매크로를 사용하여 Excel 셀에 2 차원 바코드 (PDF417 또는 QR 코드)를 생성하고 싶습니다. 이 작업을 수행하기 위해 유료 라이브러리에 대한 무료 대안이 있습니까?Excel VBA를 사용하여 2D (PDF417 또는 QR) 바코드 생성
나는 certain tools이 일을 할 수는 있지만 우리에게는 상대적으로 비쌉니다.
VBA를 모듈 barcode-vba-macro-only (코멘트에 세바스티앙 페리 언급) 코드는 이해하기 완전히 간단하지 않다 2013 년
에 MIT 라이센스에 따라 지리산 가브리엘에 의해 생성 된 순수한 VBA 1D/2D 코드 생성기입니다, 그러나 위에 링크 된 버전에서 많은 코멘트가 체코 어에서 영어로 번역되었습니다.
워크 시트에서 사용하려면 barcody.bas을 복사하여 모듈의 VBA로 가져 오면됩니다.
=EncodeBarcode(CELL("SHEET"),CELL("ADDRESS"),A2,51,1,0,2)
사용법은 다음과 같다 : 그것은 그냥 워크 시트 셀 주소로 참조를주고 있기 때문에있는 그대로
CELL("SHEET)
및 CELL("ADDRESS")
을 남겨 워크 시트에서이 같은 기능에 넣어 당신은 수식
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
QR 코드의 내용이 마치 "for 루프"카운터를 통과하는 것처럼 코드를 생성하기위한 입력이 메시지의 중간에서 재설정되어 메시지의 중간에서 몇 단어를 복제합니다. 다른 사람이 위에 링크 된 Google 코드와 같은 문제를 봤습니까? –
나는 아직도이 문제가있다 - 나는 새로운 질문으로 그것을 추가했다 : http://stackoverflow.com/questions/41404226/why-does-this-vba-generated-qr-code-stutter –
나는 지금 말더듬을 고쳤다. 최소한 내가 만난 모든 엣지의 경우), 향상된 코드를 GitHub에 두었습니다. 답변에서 업데이트 된 링크를 참조하십시오. –
의 크기를 변경하는 코드 섹션에 꽤 오래되고 잘 정립 된 게시물입니다 주위를 재생할 수 있습니다 아직 받아 들여짐). 그러나 비슷한 게시물에 대해 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을 다운로드 할 수 있습니다) :
귀하의 게시물을 보내 주셔서 감사합니다! 정말 감사합니다! API를 사용하여 코드를 관리 할 수있었습니다. 나는 Patratacus 솔루션이 시스템을 주되게 느리게 만들었으므로 한 장에 200 개 이상의 코드를 사용하는 시스템을 개발 중입니다. 그래서 당신의 시스템을 시험해 보았는데 훨씬 더 효과적입니다. 유일한 도전입니다 - 내 PC에서 작동하지만 내 고객 Mac에서는 작동하지 않습니다. 문제는 sURL을 호출하는 중입니다. Mac Shell을 사용해야 할 필요가 있지만 구현하는데 어려움이 있습니다. 어떤 아이디어? 나는 이것을 오히려 새로운 질문이나 답변으로 게시해야합니까? 미리 감사드립니다. – Tristan
안녕하세요 @ 트리스탄. 천만에요. :) 나는 Mac 사용자가 아니므로, 내가 당신을 도울 수는 없을 것 같습니다. 그럼에도 불구하고 OS에서 엑셀이 HTTP 요청을 발행하는 것을 막을 수 있다고 생각됩니다. 다른 URL (단순히 고정 된 이미지로 응답하는 URL)을 사용해 보셨습니까? 그 방향으로 무엇인가를 확인해야합니다. 새 질문을 게시하는 것이 유용 할 수 있지만 문제에 대한 세부 정보가 필요합니다. 특히 문제가 범위를 벗어나 일시적으로 재현되지 않도록 방지해야합니다. 행운을 빕니다!:) –
안녕하세요 @ 루이즈, Mac에서 우리는 Pictures.Insert 코드 내부에 "sURL + sParameters"명령에 의해 반환되는 것과 동일한 문자열을 반환하는 API를 가지고 있습니다. 우리는 맥 쉘 스크립트 "curl --get -d"를 사용하여 이것을 얻었다. 이것은 이미지 원시 데이터를 반환하는 것? 그리고 이제는 Macs Picture.Insert가 원시 데이터와 이미지 경로 만 읽을 수없는 것 같습니다. 그래서 우리는이 문제를 해결할 방법을 찾고 있습니다. Mac 용 Picture.Insert를 통해 원시 데이터를 읽거나 API에서 반환 한 데이터를 파일로 저장 한 다음 pictures.insert로 열 수 있습니다. 어쩌면 아픈 것이 새로운 질문을 시작합니다. 다시 감사드립니다! – Tristan
순수 VBA 솔루션은 (쉽게 찾을 수있는 원격 API 호출의 많은)를 찾기 어려운 것 같다. 다음은 최근 픽업입니다 : http://code.google.com/p/barcode-vba-macro-only/ (방금 테스트되었습니다!) –
이 남자의 웹 사이트를 확인하십시오. 그는 excel 수식을 사용하여 21x21 매트릭스에 대한 QR 코드 알고리즘을 구현했습니다. 아마도 xls-sheet에 구현할 수있는 쉬운 방법을 찾을 수 있습니다. http://blog.ambor.com/2013/03/create-qr-codes-in-excel-or-any.html –
여기를 클릭하십시오. QR code in Excel (VBA) http://stackoverflow.com/questions/5446421/encode-algorithm-qr-code –