前の質問
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の余白無しでプリントするといい感じになるのですが、バーコード生成でつまづいています。
コメント(11件)
■仕様■
●元データ: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
よくよく確認しておかないといけないということを理解しておいたほうがいいと思いますよ
(1)作成されたバーコードが透明
プロパティに値がセットされたことをExcelは感知しませんから再描画させる必要がありますね
(2)2つ目移行のシートがうまく作成できない
With ThisWorkbook.Sheets(buf) という指定がありますけれど、
ここを通る時点で buf に何が入っているかを考えてみてください
出力先シートを元のシートから変更してのチャレンジでしたが、うまくいきませんでした。
自分でエラーの解決を試みています。
自己解決の努力が足りないという点を指摘していただきまして、感謝しています。
また分からなければ何らかの形で質問させていただくことがあるかと思います。
また、回答を作成中であるにも関わらず締め切りされた方がおられましたら、コメント欄に回答頂ければポイント送信にてお礼差し上げます。
http://q.hatena.ne.jp/1289007484#c189998 でコメントしましたように
どこで躓いているかはある程度絞れています
ただ、ご説明では、そちらの状況が読めなかった(想定しきれなかった)ということです
コードを書くだけであれば過去に作ったものから探し出して回答用にまとめなおすだけですし、
コードを書くのであればググって出てきたものを貼り付けることなどでも回答可能ですが、
それでは本当の解決には至りませんからね(このあたりは各人の考え方次第なので、
作ってみるという努力をしている回答者を誉めることはあっても責めはしませんよ)
>自己解決の努力が足りないという点を指摘
努力という言葉が誤解を生んでしまったようで申し訳ありません
「整理してみてください」という意味にとらえてください
整理してみると自分でも驚くほどあっけなく解決することと思います
以上、まずはがんばってみてください
With objBC ~ End With 間に
.value=Sheets(zzz).Cells(yyy,xxx).valueの形で書いてみて下さい。
動的に連動しないと困るならば、
.LinkedCell= の右辺の内容を見直してみて下さい。
バーコードが空欄になるというのは、恐らく
.value か .LinkedCell の何れにかよって値が正しく設定されていないから
起こるんじゃないかと思います。今、ちょっと時間がないので自分では試せませんが…。
.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)
ボクの回答は、従前からよく理解できている知識を基にしている訳ではなくて、質問を受けてマクロを組んでみてたまたま上手く動いた様にみえたものを提供しているに過ぎないです。基本原理への理解が浅いので、往々にして的外れなものになっちゃうんですよね。だから、今回の「バーコードが透明になる」という問題に対して的確な解決策を示すことができなくて、単に上手く行った例を提示するしか出来ないのです…済みません(反省)。
いろいろと試してみた結果、解決することができました。ありがとうございます。
>(2)2つ目移行のシートがうまく作成できない
>With ThisWorkbook.Sheets(buf) という指定がありますけれど、
>ここを通る時点で buf に何が入っているかを考えてみてください
について、withとendの位置を内側にずらすことで解決しました。ありがとうございます。
毎回すごく実用的なコードを書いて下さって、大変感謝しています!
いつも書いて下さるコードで本当に助けられています。
.LinkedCell = ThisWorkbook.Sheets(shName1).Cells(lngCellValY, lngCellValX).Address(RowAbsolute:=False, ColumnAbsolute:=False, ReferenceStyle:=Application.ReferenceStyle, External:=True)
に修正したところ、所望の動作を得ることができました。
深く感謝します!
私も問題の本質が何なのかをきちんと把握して回答できる様に努力いたします。
どうも有難うございました!