エクセルマクロのバーコード描画について質問です。


前の質問
http://q.hatena.ne.jp/1289007484
で作成した頂いたコード(第2列のデータを元に第3列にバーコード生成)を改造しようとしています。

コメント欄に示すように、コードを作ったのですが、
「作成されたバーコードが透明」
「2つ目移行のシートがうまく作成できない」
という2つのエラーが取りきれません。

バグを取り除いたコードを示して頂ければ有り難いです。

尚、Sheets("印刷用")は、A4の紙に3列、8行でバーコードを印刷するシートで、
A~C列と1~9行を印刷対象としています。
A~C列の幅33.63、第1行の高さ25、2~9行の高さ107.5、データはありません。

これをA4の余白無しでプリントするといい感じになるのですが、バーコード生成でつまづいています。

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

回答0件)

回答はまだありません

  • id:ReoReo7
    【エラーの出るコード】
    ■仕様■
    ●元データ:Sheets("バーコード生成")の2列に文字列が、5列にバーコード用の数字がある。
    開始は18行、終了条件は2列目が空。行をR1で管理。
    ●印刷用にセルの高さと幅だけ調節したフォーマット:Sheets("印刷用") 'データは空。セルの高さと幅は質問欄に示した通り。
    ●出力先:Sheets("印刷用i") '(iは1から順に増える)
    行(2~9)をR2、列(1~3)をC2で管理。
    Sheets("印刷用1")は 8行3列=1~24個目 のバーコードを格納
    Sheets("印刷用2")は 8行3列=25~48個目 のバーコードを格納

    Sub makeBarcodes()

    Dim R1 As Long
    Dim R2 As Long
    Dim C2 As Long
    Dim buf As String
    Const shName1 = "バーコード生成"

    Dim i As Long
    i = 0
    R2 = 9
    C2 = 3

    'Sheets("印刷用").Columns("A:C").ColumnWidth = 33.65
    'Sheets("印刷用").Rows(1 & ":" & 1).RowHeight = 25
    'Sheets("印刷用").Rows(2 & ":" & 9).RowHeight = 107.5

    With ThisWorkbook.Sheets(buf)

    For R1 = 18 To ThisWorkbook.Sheets("バーコード生成").Cells(65536, 2).End(xlUp).Row
    Call nextcell(R2, C2, buf, i)
    .Cells(R2, C2).HorizontalAlignment = xlCenter
    .Cells(R2, C2).VerticalAlignment = xlTop
    .Cells(R2, C2).value = ThisWorkbook.Sheets("バーコード生成").Cells(R1, 2).value
    PasteBarCodeCtrl R2, C2, R1, 5, shName1, buf
    Next
    End With

    End Sub

    Private Sub nextcell(R2 As Long, C2 As Long, buf As String, i As Long)
    If R2 = 9 Then
    If C2 = 3 Then
    i = i + 1
    Sheets("印刷用").Copy Before:=Sheets("sheet2")
    buf = "印刷用" & i
    Sheets("印刷用(2)").nAme = buf
    R2 = 2
    C2 = 1
    Else
    C2 = C2 + 1
    R2 = 2
    End If
    Else
    R2 = R2 + 1
    End If
    End Sub

    Sub PasteBarCodeCtrl(lngCellBCY As Long, lngCellBCX As Long, lngCellValY As Long, lngCellValX As Long, shName1 As String, shName2 As String)

    Const SngRelClTop As Single = 1 / 4
    Const SngRelClLft As Single = 1 / 4
    Const SngRelClHgt As Single = 1 / 2
    Const SngRelClWdt As Single = 3 / 5

    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 ThisWorkbook.Sheets(shName2).Cells(lngCellBCY, lngCellBCX)
    sngBcTop = .Top + .Height * SngRelClTop
    sngBcLft = .Left + .Width * SngRelClLft
    sngBcHgt = .Height * SngRelClHgt
    sngBcWdt = .Width * SngRelClWdt
    End With
    Sheets(shName2).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 = ThisWorkbook.Sheets(shName1).Cells(lngCellValY, lngCellValX).Address(RowAbsolute:=False, ColumnAbsolute:=False, _
    ReferenceStyle:=Application.ReferenceStyle)
    .Visible = True
    End With

    End Sub
  • id:windofjuly
    うぃんど 2010/11/06 16:55:36
    コードを回答してくれる人はいますけど、それが真の問題解決になっているかどうかを、
    よくよく確認しておかないといけないということを理解しておいたほうがいいと思いますよ
     
    (1)作成されたバーコードが透明
    プロパティに値がセットされたことをExcelは感知しませんから再描画させる必要がありますね
     
    (2)2つ目移行のシートがうまく作成できない
    With ThisWorkbook.Sheets(buf) という指定がありますけれど、
    ここを通る時点で buf に何が入っているかを考えてみてください
  • id:ReoReo7
    ご指摘頂きましてありがとうございます。

    出力先シートを元のシートから変更してのチャレンジでしたが、うまくいきませんでした。
    自分でエラーの解決を試みています。

    自己解決の努力が足りないという点を指摘していただきまして、感謝しています。
  • id:ReoReo7
    質問について、何をしようとしているのか分かりづらいとのご指摘を頂き、自分でチェックしてみましたが確かに問題が無いコード(単体テスト)から連動テストに変更した時の変更点が分かりにくいと判断できましたので、一度回答を締切させて頂きます。
    また分からなければ何らかの形で質問させていただくことがあるかと思います。
    また、回答を作成中であるにも関わらず締め切りされた方がおられましたら、コメント欄に回答頂ければポイント送信にてお礼差し上げます。
  • id:windofjuly
    うぃんど 2010/11/06 18:10:04
    >何をしようとしているのか分かりづらいとのご指摘
    http://q.hatena.ne.jp/1289007484#c189998 でコメントしましたように
    どこで躓いているかはある程度絞れています
    ただ、ご説明では、そちらの状況が読めなかった(想定しきれなかった)ということです
     
    コードを書くだけであれば過去に作ったものから探し出して回答用にまとめなおすだけですし、
    コードを書くのであればググって出てきたものを貼り付けることなどでも回答可能ですが、
    それでは本当の解決には至りませんからね(このあたりは各人の考え方次第なので、
    作ってみるという努力をしている回答者を誉めることはあっても責めはしませんよ)
     
    >自己解決の努力が足りないという点を指摘
    努力という言葉が誤解を生んでしまったようで申し訳ありません
    「整理してみてください」という意味にとらえてください
    整理してみると自分でも驚くほどあっけなく解決することと思います
     
    以上、まずはがんばってみてください
  • id:ReoReo7
    ありがとうございます。いろいろと整理してみたいと思います。
  • id:Silvanus
    もし、バーコードの内容が、セルの値に動的に連動しなくて良いならば
    With objBC ~ End With 間に
    .value=Sheets(zzz).Cells(yyy,xxx).valueの形で書いてみて下さい。
    動的に連動しないと困るならば、
    .LinkedCell= の右辺の内容を見直してみて下さい。
    バーコードが空欄になるというのは、恐らく
    .value か .LinkedCell の何れにかよって値が正しく設定されていないから
    起こるんじゃないかと思います。今、ちょっと時間がないので自分では試せませんが…。
  • id:Silvanus
    何となく問題ありそうなのが、
    .LinkedCell = ThisWorkbook.Sheets(shName1).Cells(lngCellValY, lngCellValX).Address(RowAbsolute:=False, ColumnAbsolute:=False, ReferenceStyle:=Application.ReferenceStyle)
    の行です。以下の様に変えてみて下さい。ダメかも知れないけど…。
    .LinkedCell = ThisWorkbook.Sheets(shName1).Cells(lngCellValY, lngCellValX).Address(RowAbsolute:=False, ColumnAbsolute:=False, ReferenceStyle:=Application.ReferenceStyle, External:=True)
    ボクの回答は、従前からよく理解できている知識を基にしている訳ではなくて、質問を受けてマクロを組んでみてたまたま上手く動いた様にみえたものを提供しているに過ぎないです。基本原理への理解が浅いので、往々にして的外れなものになっちゃうんですよね。だから、今回の「バーコードが透明になる」という問題に対して的確な解決策を示すことができなくて、単に上手く行った例を提示するしか出来ないのです…済みません(反省)。
  • id:ReoReo7
    >windofjulyさん
    いろいろと試してみた結果、解決することができました。ありがとうございます。

    >(2)2つ目移行のシートがうまく作成できない
    >With ThisWorkbook.Sheets(buf) という指定がありますけれど、
    >ここを通る時点で buf に何が入っているかを考えてみてください
    について、withとendの位置を内側にずらすことで解決しました。ありがとうございます。
  • id:ReoReo7
    >Silvanusさん

    毎回すごく実用的なコードを書いて下さって、大変感謝しています!
    いつも書いて下さるコードで本当に助けられています。

    .LinkedCell = ThisWorkbook.Sheets(shName1).Cells(lngCellValY, lngCellValX).Address(RowAbsolute:=False, ColumnAbsolute:=False, ReferenceStyle:=Application.ReferenceStyle, External:=True)

    に修正したところ、所望の動作を得ることができました。
    深く感謝します!
  • id:Silvanus
    上手くいった様で良かったです。
    私も問題の本質が何なのかをきちんと把握して回答できる様に努力いたします。
    どうも有難うございました!

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

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

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

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