VBAで貼り付けがうまくいかない

このQ&Aのポイント
  • WindowsXPのExcel2000でVBAマクロを完成させたが、貼り付け位置がうまく設定できず、印刷結果がみっともなくなってしまう。どうするべきか教えてください。
  • VBAで作成した請求書と領収書をリンクさせて一括印刷したいが、貼り付け位置の設定が上手くいかず、ページの一部がずれてしまう。解決方法が知りたい。
  • Excel2000のVBAマクロで作成した請求書と領収書を10人分作成し、一括印刷したいが、印刷結果が見栄えが悪くなってしまう。貼り付け位置の設定方法を教えてください。
回答を見る
  • ベストアンサー

VBAで貼り付けがうまくいかない

windowsXP  Excel2000でVBAマクロ完成しました。 A4用紙1枚のシートの上半分は請求書、下半分は領収書で、領収書は請求書の値を、すべてをリンクさせています。これを10枚のシート(10人分)に作成しました。 この請求書と領収書を別々に印刷用シート1枚に貼り付け一括印刷をします。つまり、10枚のシートの上半分を一括で印刷するのです。 印刷用シートの貼り付け位置は以下のようになり 1枚目上  3枚目上 5枚目上 7枚目上 9枚目上 2枚目上  4枚目上 6枚目上 8枚目上 10枚目上 請求書、領収書はそれぞれ5枚印刷すればいいのです。 ところがうまく貼り付け位置が設定できず前のページの一部が 次のページに少しずれて表れみっともない請求書になってしまいます。 なんとかきちっと印刷したいのですが困っています。お助けください。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。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

aitaine
質問者

補足

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

その他の回答 (5)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんにちは。 >ところが、4ページ目のところだけ左の縦線が実践になっています。これを破線にすれば、すべて解決できそうです。ところがどうやっても破線にできません。なんででしょうか。 朝から、ずっと考えていたけれど、なるほど! 私も、うかつでしたね。(^^; そのことは、ふと、頭の中でよぎったのですが、それは手抜きして無視したのがいけませんでした。 「領収印刷 (2)」シートでは、直すことは出来ませんから、コピー元から直さないといけませんね。「コピー元のシートの列の幅」が違っているものがあります。 別の言い方をすれば、その貼り付ける元のシートの範囲の画像の大きさがずれているということですね。 右マージン・左マージンで収納できれば、いまのままでよいのですが、やはり元を直したほうがよいですね。 **** >ここの部分--特に"[A-Z]*が私の力では理解できません。次のようなコードでしたら何とか理解できます。どうか超初心者の私を助けてください。 [A-Z]* :意味は、最低でも、A~Z までの文字が先頭にあるというだけの意味です。 もしも、[A-Z][A-Z]* なら、最低でも、A~Z までの文字が2つあるという意味です。 *は、何か、0個以上の文字があるという意味です。 [ ] は、例えば、0-9 なら、0 ~ 9 までということです。 >Sub 請求書入力() >Application.ScreenUpdating = False >Dim list, SheetName 別に、それでよいです。こちら側では、一体、いくつまであるか分らないので、たぶん、[A-Z]* にしておけば問題ないだろうと考えただけです。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

文章の修正加筆 × そのズレをマクロで修正するものも作ってみましたから、ものすごく時間が掛かるので、 ○ そのズレをマクロで修正するしようと作ってみましたが、印刷設定値を呼び出し設定するのに、ものすごく時間が掛かるので、印刷プレビューで、ご自身の手で修正していただくものとして、

aitaine
質問者

お礼

長期不在の為失礼しました。いろいろありがとうございました。

aitaine
質問者

補足

ご指摘のとおり手動で修正しようと印刷プレビュを見ると、問題の4ページ目のところがおかしいのです。他の正常に印刷されるページのところは、両サイドの縦線がすべて破線になっています。 ところが、4ページ目のところだけ左の縦線が実践になっています。これを破線にすれば、すべて解決できそうです。ところがどうやっても破線にできません。なんででしょうか。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 Wendy02です。 >それで私いろいろ研究し、領収書の部分を画像として貼り付けることにしたのです。 この方法は、以前、マクロでやったことがあります。ちょっと面倒な作業が必要だったような気がします。 でも、以下の情報だけだと、ちょっと厳しいですね。 >印刷用シートの貼り付け位置は以下のようになり >1枚目上  3枚目上 5枚目上 7枚目上 9枚目上 >2枚目上  4枚目上 6枚目上 8枚目上 10枚目上 これが、1ページに収まるということですか? それぞれの範囲は、A1:?32 だったのでしょうか? この辺りが、曖昧になってしまっています。何をどう組み合わせて、1ページにするようにするか、教えてください。

aitaine
質問者

補足

以下のコードで何とか印刷しています。これではだめでしょうか? Sheets("領収印刷 (2)").Select Dim 対象シート As Object '変数「対象シート」はオブジェクト型 Set 対象シート = ActiveSheet 'オブジェクトへの参照を変数に代入する 対象シート.Shapes.SelectAll 'すべての図形を選択する Selection.Delete '現在選択されているオブジェクトを削除する Sheets("AAA").Select Range("B34:AB65").Select Selection.Copy 'ActiveWindow.ScrollWorkbookTabs Position:=xlLast Sheets("領収印刷 (2)").Select Range("A1").Activate ActiveSheet.Pictures.Paste Sheets("AAA").Select Application.CutCopyMode = False 'コピーの解除 Range("B3").Select Sheets("BBB").Select Range("B34:AB65").Select Selection.Copy Sheets("領収印刷 (2)").Select Range("A35").Select ActiveSheet.Pictures.Paste Sheets("BBB").Select Application.CutCopyMode = False 'コピーの解除 Range("B3").Select Sheets("CCC").Select Range("B34:AB65").Select Selection.Copy Sheets("領収印刷 (2)").Select Range("AD1").Select ActiveSheet.Pictures.Paste Sheets("CCC").Select Application.CutCopyMode = False 'コピーの解除 Range("B3").Select Sheets("DDD").Select Range("B34:AB65").Select Selection.Copy Sheets("領収印刷 (2)").Select Range("AD35").Select ActiveSheet.Pictures.Paste Sheets("DDD").Select Application.CutCopyMode = False 'コピーの解除 Range("B3").Select 以下続く 'ActiveWindow.SelectedSheets.PrintOut Sheets("hyousi").Select 'ActiveSheet.Protect End Sub

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

追伸: 確か、行の高さを狭めて調整することで、64行を入れていたような気がします。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんにちは。Wendy02です。 うまく行っていないのですね。昨年の11月だったので、だいぶ内容を忘れてしまいました。私のマクロは、まだお使いになっていますか?もしそうですと、前のところから話を遡らないといけないので、ちょっとお時間をくださいますか?少しずつ見当してみます。 あれから、行数が変わったのでしょうか?

aitaine
質問者

補足

その節はお世話になりました。実は請求書に関してはあなた様のマクロ使わせていただいていますが、領収書に関しては請求書のデータをリンクしているので上の方法は使えません。それで私いろいろ研究し、領収書の部分を画像として貼り付けることに下のです。縦に貼り付けも考えましたが、書式が変わってしまい手動で修正しないと行の高さがばらばらになる経験上、横に貼り付けることにし、うまく印刷までこぎつけましたが、5枚のうち4枚目だけ前のシートの部分が少し重なってみっともないです。我慢できる程度ですが、受け取る人にあまりいい印象をあたえないかも。どうしてもそれを修正したいです。

関連するQ&A

  • excel2000VBAで用紙の上半分部分のみ連続印刷する

    excel2000VBAでマクロを作成しています。 10人について数項目については同じですが、人によって請求項目が違い、請求項目がない人については、非表示にしたいです。 また前回の請求を参考に見ながら書き換え必要部分のみ入力作成します。 請求書の印刷は、A4用紙5枚を使います。 各シートの、上半分(1/2)の部分が請求書になっていますので各シートの上半分部分を1枚目から10枚目まで連続で印刷します。 下記のコードは、シート2枚印刷すると、その横の列に 順に印刷するようにマクロ作成しました。つまり縦に2枚横5枚づつ計10枚印刷できます。 これでなんら印刷の不具合は生じません。 しかしながら、見るからに幼稚なコードで情けないです。これをマクロらしく、もしくは新しい別の方法をご教示ねがいたいのです。よろしくお願いします。 Sub 請求書一括印刷() Application.ScreenUpdating = False Sheets("A").Select Range("B2:AB32").Select Selection.Copy Sheets("請求印刷 (2)").Select Range("B1").Select ActiveSheet.Paste Sheets("A").Select Application.CutCopyMode = False Range("B2").Select Sheets("B").Select Range("B2:AB32").Select Selection.Copy Sheets("請求印刷 (2)").Select Range("B34").Select ActiveSheet.Paste Sheets("B").Select Application.CutCopyMode = False Range("B2").Select Sheets("C").Select Range("B2:AB32").Select Selection.Copy Sheets("請求印刷 (2)").Select Range("AD1").Select ActiveSheet.Paste Sheets("C").Select Application.CutCopyMode = False Range("B2").Select   以下つづく Sheets("hyousi").Select End Sub

  • エクセルの印刷について

    仕事で使っている表があって、毎回印刷に手間取るので教えて下さい。 シート1に名簿(名前のリスト)があり、シート2が請求書になっています。 請求書は1人分ずつ出すようにしていて、シート2の氏名欄を書き換えればその人の請求書が完成するようになっているのですが、名前を何度も入れ替えながら印刷するとかなりの時間かかってしまいます。 名簿から請求書の氏名欄に氏名を順番にコピーして印刷をしていける方法は無いでしょうか? (請求書は1枚の用紙で氏名欄のみを入れ替えして印刷したいのですが) ここを見ているとマクロを利用とかがあるのですが、知識がなく読んでもよく分からず… エクセル上でなんとかなりませんでしょうか?宜しくお願いいたします。 環境はWindowsXP  Excel2003です。

  • リンク貼り付けをマクロで簡素化したい

    1)個人票ブック(太郎シート 花子シート 次郎シー・・・・・)の各シートのA1からA5まで、値や公式がはいっています。 2)このシートのA1からA5までの値等を、別の総括表ブック(一枚のシートしかない)にリンク貼り付けをします。 3)まず、太郎シートのA1~A5までは、総括表ブックのB列にリンク貼り付けするマクロボタンを、太郎シートに設置します。 4)さらに、花子シートのA1~A5までは、総括表ブックのC列にリンク貼り付けするマクロボタンを、花子シートに設置します。 5)そして、次郎シートのA1~A5までは、総括表ブックのD列にリンク貼り付けするマクロボタンを、次郎シートに設置します。 6)こうしてマクロボタンを順次貼り付けていきます。 7)各シートの貼り付け場所は列に貼り付けていきますが、上から順番ではなく、任意に飛んでいますが、  各シートの行は、みな一律で同じ行です。 列は違っても皆おなじ行にリンク貼り付けしたいです。 このような操作をマクロ記録でつくりましたが、膨大な作業が必要です。これをなんとかVBAで簡素化したいのですが・・よろしくお願いします。

  • VBAと照合について

    VBAと照合について 下記のような3枚のシート(上からシート1,2,3)をエクセル2007で作成しています。 シート1とシート2は全く同じ内容であるべきものです。 しかし、出所が違うため、両者のシートを照合して もし合っていれば、シート1を印刷したいのです。 なお、ここではあえて、1月4日分の売り上げは、わざと違う値を入力しています。 シート3にマクロのボタンを作成し、VBAで二枚のシートを照合し、メッセージボックスで 合っていれば印刷OK,違っていれば印刷中止にしたいのです。 IF関数までは理解でき、シート3のB2からE4までは=IF(sheet1!B2=sheet2!B2,"","×") 等で処理していて、違っているセルに条件付き書式で×を表示するようにしています。 ただ、関数ではなく、照合から印刷までをマクロで自動処理したいので、VBAコードが知りたいです。 よろしくお願いします。

  • MS-EXCEL VBA (マクロ) の書き方

    エクセルの複数シートのデータを両面印刷可能なプリンターで、両面印刷するためのマクロを書きたいのですが、どうしてもうまく行きません。 シート名は、1,2,3,4 と4シートで、それぞれのシートにA4用紙1枚分のデータがあり、それが印刷範囲に指定されています。それら4枚分の印刷範囲を、1枚のA4用紙に、2ページを1ページに圧縮+両面印刷 で印刷したいのですがどうしてもうまく行きません。(プリンターのプロパティ設定はマクロ実行前にSheet1で行っているのですが。) どなたかお分かりになる方、お手数ですがご教授願えませんでしょうか。 補足:ちなみに、4ページ分を1ページに印刷して、片面での印刷は以下のマクロで出来ています。 Sheets(Array("1", "2","3","4")).Select Sheets("1").Activate 'この時Sheet1で、プリンターのプロパティで、4ページを1ページに印刷を選択してある。 ActiveWindow.SelectedSheets.PrintOut Copies:=1 よろしくお願いします。 ちなみにプリンターは事務所のネットプリンターで、TOSHIBA e-STUDIO4520CSeriesPCL6 です。

  • Excel 改ページのVBAうまくいかないです

    助けてください。EXCEL2000を使用しています。 マクロを組んでいるのですが、改ページがうまくいきません。 マクロ実行前の状態では、ページ設定で、用紙が「A3」の「縦」で拡大縮小が「79%」、データの区切りのいいところに何箇所か改ページが設定されています。 そこで、マクロを使って、A3サイズ、用紙を横、拡大縮小92%にして、尚かつ区切りのいいところ(毎回印刷範囲、区切りたいセルの位置は決まっている)で印刷できるようにしたいです。 印刷範囲は A1:P63,A64:P126,A127:P193,A194:P237,A257:P329, A330:P357,A368:P397,A401:P462 で設定したいです。 改ページしたい行を ひたすら ActiveSheet.HPageBreaks.Add Before:=Range("セル番地") で記述したのですが、 余計なところにも改ページ線ができてしまいました。(121行目の下、 351行目の下) このいらない改ページ線は、用紙を横にして、拡大縮小を92% をした時点で、ついてしまった線のようです。 余計な改ページ線を削除したいです。 なお、マクロは自動記録しかわかっておらず、 意味がわかっていないです。 お手数ですが お分かりになる方、 わかりやすくお願いいたします。

  • EXCEL VBA コピー貼り付け時のチェック

    お世話になります。田中と申します。 VBAの練習で下記の操作を実現したいと思っておりますが、どうしたらよいのか分りません。 A.xlsというブックがあります。 A.xlsの[データ]というシートにボタンをおいてそのボタンをクリックしたら以下のような動作をしたいのです。 このA.xlsの[データ]シートのA1~L20までをコピーして、C:\Users\田中\DesktopにあるB.xlsというブックの[シート1]という名称の単にシートに貼り付けしたいのです。 ただし貼り付け時に他のユーザーがB.xlsを開いている場合は、貼り付け処理を中止したいのですが、そのようなユーザーに開かれているかどうかVBAでチェックする方法はありますでしょうか? どなたかお知恵をお借りできますでしょうか。 よろしくお願い致します。 環境 Windows7 Excel2013

  • VBAでの印刷書式の記述について

    EXCEL2002を使用しております。 マクロで、通常のページ番号から3を引いた数でページ設定したいのです。 たとえば、以下のシート構成の時、 1シート目:表紙 2シート目:目次 3シート目:本文 1シート目から3シート目範囲選択し、印刷する。 このとき、3シート目から1ページとしたいのです。 マクロで、フッターを設定しております。 With ActiveSheet.PageSetup   .CenterFooter = "&P-3" End With このようにすると、印刷される文字列が「33」となってしまいます。 「1」と表示するには、上記CenterFooterの設定はどのようにすればよろしいでしょうか?

  • Excelで印刷設定をした後に部数の連番を印刷

    おそらくVBAを使うことになると思いますが、やりたいことは、 シートを1ページ印刷します。 それを例えば10部印刷します。 合計10枚出力します。 そのときに用紙サイズや用紙種類を指定して、 10部の連番を一枚ずつのページに印刷されるようにしたいです。 例えば、 1枚目:1/10 2枚目:2/10 ・・・ 10枚目:10/10 ちなみに部数印刷の場合なので ヘッター/フッターでは出来なそうです。 素人ながらに検索しましたら、 部数を印刷するVBAは見つかりました。 http://okwave.jp/qa/q2909328.html このマクロではそのまま印刷が始まってしまいますが、 印刷が始まる前に、用紙の設定等をしたいのです。 よろしくお願い致します!

  • 【Excel VBA】印刷について

    Excel2003を使用しています。 あるシートを印刷するときに、その中で数ページだけ印刷が不要のページがあります。 例えば、20ページまで印刷するなかで、4,7,18ページが不要という場合、その不要ページを指定すれば、それ以外のページを印刷するというふうに、マクロで印刷範囲を指定することは可能でしょうか? (印刷不要のページは都度変わります) 手元にある参考書で、ページ数を指定する方法はわかるのですが、不要なページを印刷しないようにすることができればと思い、質問させていただきました。 よろしくお願いします。

専門家に質問してみよう