こんにちは。Wendy02です。
何度も繰り返し実験してみましたが、確かに、ずれるのは分るのですが、マクロ自体の問題ではありませんね。問題は、正しい印刷領域の設定がされているか、どうかっていうことだと思いました。そのズレをマクロで修正するものも作ってみましたから、ものすごく時間が掛かるので、やむを得ないのですが、以下の検査用のプログラムを作ってみました。
なお、おまけとして、画像貼り付け用のプログラムを私も作ってみました。
'-----------------------------------------------------
Sub PrintAreaChecking()
'水平改行位置検査プログラム
Dim Pbks() As Variant
Dim k As Long
Dim Hcnt As Long '水平改行数
Dim i As Long
Dim j As Integer
Dim t As Long
Dim dummy As Variant
Dim PctRow() As Variant
Dim pct As Object
Dim msg
Dim flg As Boolean
With ActiveSheet
k = .Pictures.Count
'プリンタ設定
If .PageSetup.PrintArea = "" Then
.PageSetup.PrintArea = "$A$1:" & _
.Pictures(k).BottomRightCell.Address
End If
'検査プログラム
ReDim PctRow(1 To k)
For Each pct In .Pictures
i = i + 1
PctRow(i) = pct.TopLeftCell.Row
Next pct
Hcnt = ExecuteExcel4Macro("COLUMNS(GET.DOCUMENT(64))")
ReDim Pbks(1 To Hcnt)
For j = 1 To Hcnt
t = ExecuteExcel4Macro("INDEX(GET.DOCUMENT(64),1," & j & ")")
dummy = Application.Match(t, PctRow, 0)
If IsError(dummy) And j <> Hcnt Then
Pbks(j) = t & " *"
flg = True
Else
Pbks(j) = t
End If
Next j
If flg Then
msg = "行数が現在は、 " & Val(Pbks(1))
msg = msg & "です。" & vbCrLf & "プレビュー画面で、マージンを調整して設定しなおしてください。"
Else
msg = "設定は、問題ありません。ズレは出ないはずです。"
End If
MsgBox "水平改行位置" & vbCrLf & Join(Pbks, vbCrLf) & vbCrLf & msg
If flg Then
.PrintPreview
End If
End With
End Sub
'======================================================
'おまけ
'領収印刷 (2) に貼り付けるために、Wendy02が作ってみたもの
'単に参考まで。
'======================================================
Sub PastePictures()
Dim RyoshuSh As Worksheet
Dim sh As Worksheet
Dim i As Long 'カウンタ
Dim j As Long '行
Dim k As Integer '列
Set RyoshuSh = Worksheets("領収印刷 (2)")
'最初に画像を削除
RyoshuSh.Pictures.Delete
'セルの初期値
k = 1: j = 1
Application.ScreenUpdating = False
For Each sh In Worksheets
If sh.Name Like "[A-Z]*" Then
sh.Activate
sh.Range("B34:AB65").CopyPicture xlPrinter, xlPicture
sh.Range("B3").Select
Application.Goto RyoshuSh.Cells((j - 1) * 34 + 1, (k - 1) * 29 + 1)
RyoshuSh.Pictures.Paste
'行列:カウンタ
i = i + 1
If (i Mod 2) = 0 Then j = j + 1 '行
k = (i Mod 2) + 1 '列
End If
Next
Application.ScreenUpdating = True
Beep
Sheets("hyousi").Select
End Sub
質問者
補足
Wendy02様 素晴らしいプログラム作っていただきありがとうございました。
水平改行位置検査プログラムは、時間はかからず、瞬間的に次の表示がでました。
「水平改行位置 63 設定は問題ありません。ズレはでないはずです。」OKして
プレビュを見るとやはり4枚目のみ、ずれていました。こんなすごいプログラムでも
修正できないなんて不思議です。
おまけの'領収印刷 (2) に貼り付け用のプログラムですが
For Each sh In Worksheets
If sh.Name Like "[A-Z]*" Then
sh.Activate
ここの部分--特に"[A-Z]*が私の力では理解できません。次のようなコードでしたら
何とか理解できます。どうか超初心者の私を助けてください。
Sub 領収書作成部品()
請求書セルに数式や文字列を入れる。
End Sub
Sub 請求書入力()
Application.ScreenUpdating = False
Dim list, SheetName
list = Array("AA", "BB", "CC", "DD", "EE", "FF", "GG", "HH", "II", "JJ")
For Each SheetName In list
Sheets(SheetName).Activate
Call 領収書作成部品
Next
Sheets("hyousi").Select
End Sub
補足
Wendy02様 素晴らしいプログラム作っていただきありがとうございました。 水平改行位置検査プログラムは、時間はかからず、瞬間的に次の表示がでました。 「水平改行位置 63 設定は問題ありません。ズレはでないはずです。」OKして プレビュを見るとやはり4枚目のみ、ずれていました。こんなすごいプログラムでも 修正できないなんて不思議です。 おまけの'領収印刷 (2) に貼り付け用のプログラムですが For Each sh In Worksheets If sh.Name Like "[A-Z]*" Then sh.Activate ここの部分--特に"[A-Z]*が私の力では理解できません。次のようなコードでしたら 何とか理解できます。どうか超初心者の私を助けてください。 Sub 領収書作成部品() 請求書セルに数式や文字列を入れる。 End Sub Sub 請求書入力() Application.ScreenUpdating = False Dim list, SheetName list = Array("AA", "BB", "CC", "DD", "EE", "FF", "GG", "HH", "II", "JJ") For Each SheetName In list Sheets(SheetName).Activate Call 領収書作成部品 Next Sheets("hyousi").Select End Sub