• ベストアンサー

エクセル マクロ 印刷設定

エクセルの写真台紙のようなものがあり、 A4(サイズ)の枠に4枚貼れるようになっています。 そのA4(サイズ)の枠が『横方向』に20枚あります。 印刷範囲設定をコマンドボタンに入れたいのですが、 写真(JPG)を貼り付けた最終ページまでを 印刷範囲として設定できるでしょうか?

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.2

具体的な姿な何も説明されていないので,「台紙1枚分のセル範囲」がA:M列(13列),右隣の2枚目台紙がN:Z列(やはり13列)といった具合のレイアウトにします。 sub macro1()  dim s as shape  dim res as long  for each s in activesheet.shapes  res = application.max(res, s.bottomrightcell.column)  next  res = application.ceiling(res, 13)  activesheet.pagesetup.printarea = range(columns(1),columns(res)).address end sub

noname#225437
質問者

お礼

質問通りの動作では可能でしたので ベストアンサーとさせていただきます。 ありがとうございました。

noname#225437
質問者

補足

説明不足すみません。 説明文からだとこの方法で完璧でしたが それぞれページ内には文字も罫線も『オートシェイプ』も最初から存在し、それを含め印刷範囲を設定したいのです。 ですので、20枚目のオートシェイプを認識し 印刷範囲は毎度、20枚すべてになってしまいます。 そもそも写真だけを認識する事が可能なのかは 分かりませんが、 別の方法を探りたいと思います。

その他の回答 (1)

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.1

写真だけなのであれば、印刷範囲をクリアしてやれば写真がある範囲だけ印刷してくれます。 要するに、写真がない範囲にも「見出し」的な文字が入っていて、 印刷の時にはそれらは不要、文字だけのページは印刷したくない。 ・・と言うことでしょうか。 写真がある範囲の右端の「座標」は、 全ての写真をグループ化して、その幅を見れば取れそうです。 シート内の全ての列について「列幅が同じ」なら・・   一番右にある図の右端の座標÷列幅=列数 ですから、そこから割り出して、印刷範囲の設定が可能かもしれません。 Sub Sample1() Dim SR As ShapeRange     ActiveSheet.PageSetup.PrintArea = ""     ActiveSheet.Shapes.SelectAll     Set SR = Selection.ShapeRange     With SR         .Group     ' セル幅が「54」で、縦の印刷範囲が31行目までの場合     ActiveSheet.PageSetup.PrintArea = Range(Cells(1, 1), Cells(31, Int((.Width / 54) + 0.5))).Address         .Ungroup     End With End Sub   ※走らせてプレビューで確認下さい。 また、印刷する全てのページにおいてページの幅は同一でしょうから、   一番右にある図の右端の座標÷ページ幅=ページ数 ですから、そこから割り出して、印刷するページ範囲(●ページ~○ページ)の指定をして 印刷まで一気にできるかもしれません(印刷ダイアログ内での印刷範囲指定を利用)。 これだと、列幅がマチマチでも(レイアウトが一緒なら)対応できる気がします。 Sub Sample2() Dim SR As ShapeRange     ActiveSheet.PageSetup.PrintArea = ""     ActiveSheet.Shapes.SelectAll         Set SR = Selection.ShapeRange     With SR         .Group     ' 1ページの領域の幅が「486」なら     ActiveSheet.PrintOut From:=1, To:=Int((.Width / 486) + 0.5)         .Ungroup     End With End Sub   ※注 動かすと印刷されます。 ちなみに「領域(セル)の幅」は、調べたい領域(幅)を選択した状態で イミディエイトウィンドウに「? selection.width(Enterキー)」で調べられます。 (例えば、A1:I1を選択した状態でイミディエイトに入力し、Enter。) どちらの場合も「Int(******* + 0.5)」としているのは、「切り上げて整数」にしたいからです。 (例えば、写真がある領域が「12.2ページまで」の時には「13ページ」にしたい。  小数のままやると多分エラーが出ます。切り捨ててしまうと写真が欠けます。) また、どちらの場合も改ページ位置ギリギリに写真があると、若干欠ける可能性もあります。 もっと上手い方法があるんじゃないかなぁ・・とも思いますので、 とりあえず、参考までにお納め下さい。

noname#225437
質問者

お礼

私が条件を明確にしていなかったので説明不足でした。 御時間を割いて説明して頂いたのに 申し訳なく思います。 この方法でやってみたのですが 私が未熟なもので理解出来ない部分がありました。 ご回答ありがとうございました。