マクロを使用してExcelセルに2dバーコード(PDF417またはQRコード)を生成したいとします。これを行うには有料ライブラリの無料の代替手段はありますか?Excel VBAを使用して2D(PDF417またはQR)バーコードを生成
私はcertain toolsが仕事をすることができますが、私たちにとっては比較的高価です。
マクロを使用してExcelセルに2dバーコード(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")
を残すワークシートでは、このような関数に入れます 数式
私はむしろ、ワークシートの数式としてそれを使用するよりも、それ純粋なVBA関数呼び出しにするラッパー関数を追加しました:
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
このラッパーを使用すると、することができます今、単に
Call RenderQRCode("Sheet1", "A13", "QR Value")
ワークシート名cellを入力するだけで、QRコードをレンダリングすることができます。ロケーション、および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を使ってコードを手に入れました。私は1枚のシートに200以上のqrコードを使用するシステムを開発しているので、Patratacusのソリューションはシステムを大幅に遅くしましたので、私はあなたのことを試しました。挑戦のみ - それは私のPC上で動作しますが、私のクライアントのMacでは動作しません。問題はsURLを呼び出すことです。 Mac Shellを使用する必要があるようですが、実装するのが難しいです。何か案は?私はむしろコメントではなく、新しい質問または回答としてこれを投稿するべきでしょうか?前もって感謝します。 – Tristan
こんにちは@Tristan。どういたしまして。 :)私はMacユーザーではないので、私はあなたを助けることができないのではないかと心配しています。それにもかかわらず、私は、OSがExcelがHTTPリクエストを発行するのを妨げている可能性があると考えています。別のURL(単純に固定画像で応答するURL)で試したことがありますか?あなたはその方向で何かを点検するべきです。新しい質問を投稿すると便利かもしれませんが、あなたの問題について詳細を知る必要があります。範囲外で中断したり再現できないようにしないようにしてください。がんばろう!:) –
こんにちは@Luiz、Macでは、Pictures.Insertコード内の "sURL + sParameters"コマンドによって返されているものと同じ文字列を返すためのAPIを持っています。 Macsのシェルスクリプト "curl --get -d"を使ってこれを取得しました。これは画像の生データを返すようですか?そして今、それは、MacのPicture.Insertは生データとイメージパスだけを読み取ることができないようです。だから我々はこれを回避する方法を見つけようとしている。 MacのPicture.Insertの方法で、生データを読み込むか、APIによって返されたデータをファイルとして保存してから、pictures.insertで開くことができます。たぶん病気は新しい質問を始めるでしょう。もう一度ありがとう! – Tristan
ピュアVBAソリューションは、(リモートAPI呼び出しの多くは見つけることが容易です)見つけるのは難しいようです。最近のピックはここにあります:http://code.google.com/p/barcode-vba-macro-only/(ちょうどテスト済み!) –
この男のウェブサイトをチェックしてください。彼はエクセル式を使用するだけで、21×21行列のQRコードアルゴリズムを実装しました。おそらくxls-sheetに簡単に実装する方法を見つけることができます: http://blog.ambor.com/2013/03/create-qr-codes-in-excel-or-any.html –
ここをクリックしてくださいQRコードはExcel(VBA)内のQRコード http://stackoverflow.com/questions/5446421/encode-algorithm-qr-code –