2013-04-22 73 views
6

マクロを使用してExcelセルに2dバーコード(PDF417またはQRコード)を生成したいとします。これを行うには有料ライブラリの無料の代替手段はありますか?Excel VBAを使用して2D(PDF417またはQR)バーコードを生成

私はcertain toolsが仕事をすることができますが、私たちにとっては比較的高価です。

+0

ピュアVBAソリューションは、(リモートAPI呼び出しの多くは見つけることが容易です)見つけるのは難しいようです。最近のピックはここにあります:http://code.google.com/p/barcode-vba-macro-only/(ちょうどテスト済み!) –

+0

この男のウェブサイトをチェックしてください。彼はエクセル式を使用するだけで、21×21行列のQRコードアルゴリズムを実装しました。おそらくxls-sheetに簡単に実装する方法を見つけることができます: http://blog.ambor.com/2013/03/create-qr-codes-in-excel-or-any.html –

+0

ここをクリックしてくださいQRコードはExcel(VBA)内のQRコード 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コードのオプションです。他のオプションは= QRコード
      • 1は、グラフィカルモードのためのものである1 = EAN8/13/UPCA/UPCE、2 =インターリーブ5、3 = Code39の二、50 =データ マトリックス、51です。バーコードはShapeオブジェクトに描画されます。フォントモードでは0です。私はあなたがフォントの種類をインストールする必要があると仮定します。 有用ではありません。
      • 0は特定のバーコードタイプのパラメータです。 QR_Codeの場合、0 =低誤り訂正、1 =中間誤り訂正、2 =四分位誤り 訂正、3 =高誤り訂正。
      • 2は1Dコードにのみ適用されます。それはバッファゾーンです。私はそれが正確に何をしているのかはっきりしていませんが、おそらく 1Dのバースペースで何かするのでしょうか?

私はむしろ、ワークシートの数式としてそれを使用するよりも、それ純粋な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 
+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を使ってコードを手に入れました。私は1枚のシートに200以上のqrコードを使用するシステムを開発しているので、Patratacusのソリューションはシステムを大幅に遅くしましたので、私はあなたのことを試しました。挑戦のみ - それは私のPC上で動作しますが、私のクライアントのMacでは動作しません。問題はsURLを呼び出すことです。 Mac Shellを使用する必要があるようですが、実装するのが難しいです。何か案は?私はむしろコメントではなく、新しい質問または回答としてこれを投稿するべきでしょうか?前もって感謝します。 – Tristan

+0

こんにちは@Tristan。どういたしまして。 :)私はMacユーザーではないので、私はあなたを助けることができないのではないかと心配しています。それにもかかわらず、私は、OSがExcelがHTTPリクエストを発行するのを妨げている可能性があると考えています。別のURL(単純に固定画像で応答するURL)で試したことがありますか?あなたはその方向で何かを点検するべきです。新しい質問を投稿すると便利かもしれませんが、あなたの問題について詳細を知る必要があります。範囲外で中断したり再現できないようにしないようにしてください。がんばろう!:) –

+0

こんにちは@Luiz、Macでは、Pictures.Insertコード内の "sURL + sParameters"コマンドによって返されているものと同じ文字列を返すためのAPIを持っています。 Macsのシェルスクリプト "curl --get -d"を使ってこれを取得しました。これは画像の生データを返すようですか?そして今、それは、MacのPicture.Insertは生データとイメージパスだけを読み取ることができないようです。だから我々はこれを回避する方法を見つけようとしている。 MacのPicture.Insertの方法で、生データを読み込むか、APIによって返されたデータをファイルとして保存してから、pictures.insertで開くことができます。たぶん病気は新しい質問を始めるでしょう。もう一度ありがとう! – Tristan

関連する問題