エクセルVBA(マクロ)でバーコードを生成する方法を教えて下さい。


エクセルでバーコードを作る ~コントロール版~
http://takashixxx.blog88.fc2.com/blog-entry-23.html
を参考に以下のマクロを作りましたが、うまくいきません。
具体的には、「コードエラー」もしくは「バーコードは生成されるが、透明で、プロパティが指定できない」となります。

ActiveSheet.OLEObjects.Add(ClassType:="BARCODE.BarCodeCtrl.1", link:=False _
, DisplayAsIcon:=False, Left:=489.705882352941, Top:=41.4705882352941, _
Width:=123.529411764706, Height:=53.8235294117647).Select

cells(r,3)の中に、
バーコードの高さ=セルの1/2、
バーコードの幅=セルの3/4、
バーコードの位置=セルの上から1/4、左から1/4
バーコードのリンク=cells(r,2)
でバーコードを次々に作成するマクロを作りたいのですが、代わりに作っていただけると助かります。エラーの原因の指摘だけでも構いません。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/11/06 16:05:07
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Silvanus No.1

回答回数180ベストアンサー獲得回数71

ポイント70pt

リスト中にもコメント入れていますが、一旦描画されたバーコードの高さが

本来であれば配置されているセルの高さの変更に連動して変化しなければならないのですが、

私の能力ではどうやっても解決できませんでした…。

それ以外は、恐らく期待通りの動作になっているのではないかと思います。

' 参考文書 [MSDN] MSO2003 - VBAランゲージリファレンス
'               - バーコード コントロール リファレンス
' http://msdn.microsoft.com/ja-jp/library/cc391731.aspx

Option Explicit

Sub hatena_ReoReo7_101106()
   
Dim R As Long

Rows("1:3").RowHeight = 150
Columns("B:C").ColumnWidth = 40
    For R = 1 To 3
            With Cells(R, 2)
                .NumberFormatLocal = "0_ "
                .Value = 1234567890123# + R * 11111
            End With
        PasteBarCodeCtrl R, 3, R, 2
    Next

End Sub

Sub PasteBarCodeCtrl(lngCellBCY As Long, lngCellBCX As Long, lngCellValY As Long, lngCellValX As Long)
    
Const SngRelClTop As Single = 1 / 4
Const SngRelClLft As Single = 1 / 4
Const SngRelClHgt As Single = 1 / 2
Const SngRelClWdt As Single = 3 / 4
    
Const IntBCStyle As Integer = 2
    ' スタイル
    ' 0: UPC-A, 1: UPC-E, 2: JAN-13, 3: JAN-8, 4: Casecode, 5: NW-7,
    ' 6: Code-39, 7: Code-128, 8: U.S. Postnet, 9: U.S. Postal FIM, 10: 郵便カスタマーバーコード
Const IntBCSubst As Integer = 0
    ' サブスタイル (パラメータ説明省略、下記URL参照)
    ' http://msdn.microsoft.com/ja-jp/library/cc427156.aspx
Const IntBCValid As Integer = 0
    ' データの確認
    ' 0: 確認無し, 1: 無効なら修正, 2: 無効なら非表示
Const IntBCLnWgt As Integer = 3
    ' 線の太さ
    ' 0: 極細, 1:細, 2:中細, 3:標準, 4:中太, 5: 太, 6:極太, 7:超極太
Const IntBCDrctn As Integer = 0
    ' バーコードの向き
    ' 0: 0度, 1: 90度, 2: 180度, 3: 270度
Const IntBCShwDt As Integer = 1
    ' データの表示
    ' 0: 有り, 1: 無し
Const IntBCFrClr As Long = 0        ' 0 = RGB(0, 0, 0) [Black]
    ' 前景色
Const IntBCBkClr As Long = 16777215 ' 16777215 = RGB(255,255,255) [White]
    ' 背景色
    
Dim objOLEObj   As OLEObject
Dim objBC       As BARCODELib.BarCodeCtrl
Dim sngBcTop    As Single
Dim sngBcLft    As Single
Dim sngBcHgt    As Single
Dim sngBcWdt    As Single
Dim rngLnkCell  As Range

    With Cells(lngCellBCY, lngCellBCX)
        sngBcTop = .Top + .Height * SngRelClTop
        sngBcLft = .Left + .Width * SngRelClLft
        sngBcHgt = .Height * SngRelClHgt
        sngBcWdt = .Width * SngRelClWdt
    End With
ActiveSheet.OLEObjects.Add(ClassType:="BARCODE.BarCodeCtrl.1", Link:=False, DisplayAsIcon:=False, _
            Top:=sngBcTop, Left:=sngBcLft, Height:=sngBcHgt, Width:=sngBcWdt).Select
Set objOLEObj = Selection
Set objBC = objOLEObj.Object
    With objBC
        .Style = IntBCStyle
        .SubStyle = IntBCSubst
        .Validation = IntBCValid
        .LineWeight = IntBCLnWgt
        .Direction = IntBCDrctn
        .ShowData = IntBCShwDt
        .ForeColor = IntBCFrClr
        .BackColor = IntBCBkClr
        .Refresh
    End With
    With objOLEObj
        .Visible = False
        .Placement = xlMoveAndSize ' 描画後の「セル高」変更に対し「バーコード高」が連動しない…。
        .LinkedCell = Cells(lngCellValY, lngCellValX).Address(RowAbsolute:=False, ColumnAbsolute:=False, _
                                                                ReferenceStyle:=Application.ReferenceStyle)
        .Visible = True
    End With

End Sub
id:ReoReo7

ありがとうございます!

ちょっと感動しました・・・。

おかげさまで、とてもうまくいきました。

頂いたコードを改造して、使用していいきたいと思います。

また、描画後の非連動はむしろそちらのほうが都合が良いです。

ありがとうございました。

2010/11/06 16:04:53
  • id:windofjuly
    うぃんど 2010/11/06 13:08:25
    >バーコードを次々に作成するマクロを作りたい
     
    それがトラブルの原因のような気がします
    もう少し長く書きますと「ActiveSheet.OLEObjects.Add を何度も繰り返すことによって、
    作業領域を失ってしまって、やりようが無くなり、Excelはエラーを吐くしかなくなった」
    あるいは「繰り返しているつもりが、繰り返しになっていなかった」などになります
     
    質問の一部分だけを見て適当に回答する人もいますので、
    動くコードを書いてもらうというのではなくて、具体的にどのようなソースコードなのかをさらけ出して、
    「どこが問題点なのか?どのように見ていくべきなのか?」を教えてもらうほうが今後のためだと思います
    (だからヒントだけしかコメントしてません)
  • id:ReoReo7
    ありがとうございます。ソースコードのさらけ出しについて今後心がけるようにします。

    実際に作ったコードですが、提示しているコードを
    sub()
    end sub

    で囲ったコードで、連続実行はできていない段階です。
  • id:Silvanus
    おうっ!、テキストの桁が多すぎて、枠をはみ出ちゃってますよ…(ド阿呆)。
    次回から気を付けます…。
  • id:windofjuly
    うぃんど 2010/11/06 15:57:14
    「質問文のコードだけ」しか書いていないので「ガワ」だけの作成にとどまっていたという事ですね
    Silvanusさんの示してくださったページとサンプルを参考にプロパティをセットしてみてください
    (私は動作確認してませんけどSilvanusさんの回答ですから)
     
    さらに余計なお世話だと思いますけどnameプロパティを追加しておいたほうが良いと思いますよ
  • id:windofjuly
    うぃんど 2010/11/06 16:44:20
    2010-11-06 16:04:53 返信欄
    >おかげさまで、とてもうまくいきました。
    2010-11-06 16:09:59 新規質問 http://q.hatena.ne.jp/1289027397
    >「作成されたバーコードが透明」
    >「2つ目移行のシートがうまく作成できない
     
    5分の間に何があったのでしょう
    「単体テストだけ行ってみたらOKだったけれど連動させるとダメだった」ということかな?
    それならば最初にコメントした部分だけど、何をしているのか、イマイチ伝わってきませんね
    人に伝える努力をすれば、おのずと自力解決できたりする場合もあるので、
    よく考えて質問投稿や返信、終了などしたほうがいいと思いますよ
  • id:ReoReo7
    >windofjulyさん

    >「単体テストだけ行ってみたらOKだったけれど連動させるとダメだった」ということかな?
    その通りです。ご指摘ありがとうございます。

    5分であきらめた、という部分ですが
     頂いたコードを元に試行錯誤→OK。
     頂いたコードを元に14時頃からいろいろと改造(2時間を費やす)→NG
     単体テストはOKだったので頂いた回答に対してひとまずお礼を書く。改造したコードを再度質問
    という流れでした。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません