質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

5069閲覧

VBA 印刷範囲を取得できない

mi-c3

総合スコア20

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2018/01/17 06:16

編集2018/01/17 06:54

Excel の印刷範囲を取得するために、以下のコードを記述しました。

VBA

1 Dim rangeS As String 2 rangeS = ActiveSheet.PageSetup.PrintArea ''印刷範囲を取得 3 4 Dim c As Range 5 For Each c In Range(rangeS).Cells

ほとんどの場合、印刷範囲を文字列として取得できるのですが、
たまに、印刷範囲を設定しているように見えるにも関わらず
長さ0の文字列を取得してしまうことがあります。

印刷範囲を設定し直すと、このような問題が起きず、
印刷範囲を取得できるようになります。

Q1.なぜこのようなことが起きるのでしょうか?

Q2.解決するにはどうすれば良いでしょうか?

宜しくお願いします。

※追記
必ずしも
改ページビューで青色で囲まれている範囲 = 印刷範囲(PageSetup.PrintArea)
とはならないことがわかりました。

印刷範囲(PageSetup.PrintArea)が設定されるのは、以下の条件のようです(たぶん)。
a)ページレイアウト -> 印刷範囲 -> 「印刷範囲の設定」をした場合
b)改ページビューで青色の線を変更したとき

「改ページビューで青色で囲まれている範囲」を取得する方法を
ご存じの方がいれば、教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

手元では発生しないので、外している可能性大ですけど、以下のようにSet命令で行ったらどうなります?

印刷範囲の取得の目的が不明なので、直接は関係ないかもしれませんが、こちらを紹介しておきます。

投稿2018/01/17 08:17

編集2018/01/17 09:45
sazi

総合スコア25188

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mi-c3

2018/01/17 09:14

rangeS の箇所がハイライトされ、以下のメッセージが表示されました。 「コンパイルエラー: オブジェクトが必要です。」 どういう意図でSetを使うのでしょうか? そもそもStringにSetを使う標記は見たことがありません。
sazi

2018/01/17 09:45 編集

失礼しました。Range型だと思いこんでいました。 Range型で設定する場所で単に移送するだけではなく、Set命令を使用するべきという記事を見かけたので。 スルーしてください。
guest

0

ベストアンサー

ActiveSheet経由で参照しているのが怪しいですが、この処理はどこに置いて、どのタイミングで呼ばれるのでしょうか?
ActiveSheetを使わずに、次のようにシート名を直接指定しても同様でしょうか。

VBA

1rangeS = Worksheets("Sheet1").PageSetup.PrintArea ''印刷範囲を取得

teratailではActiveSheetを使っている人を良く見ますが、シートがアクティブなことを前提に処理しないといけないので、タイミングによってはシビアなシーンもあります。
できる限り上記のようにシートオブジェクトを直接使用した方が良いでしょう。

追記に関して
印刷範囲ではなく改ページプレビューで表示される範囲というオチですか。
ここのページで試行錯誤した方々がいたようですが、解決はしていないようですし、私も調べた限りでは無理そうでした。
ワークシートにHPageBreaksプロパティがあり改ページの情報を持っていますが、1ページしかないときは設定されないので使えませんでした(質問内容から察すると1ページかと思いましたので)
複数ページあるときは設定されますが、2ページ目以降の先頭(左上位置)しか取れないようですので、範囲を求めるには厳しそうです。
他にも有益なプロパティはあるかもしれませんが、そこまで調べきれておりません。
とりあえず参考まで。

投稿2018/01/17 06:33

編集2018/01/18 00:23
ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mi-c3

2018/01/17 06:46

>ActiveSheetを使わずに、次のようにシート名を直接指定しても同様でしょうか。 同じでした。 >teratailではActiveSheetを使っている人を良く見ますが、シートがアクティブなことを前提に処理しないといけないので、タイミングによってはシビアなシーンもあります。 ActiveSheetを使っているのは、今開いているシートに対して処理をしてほしいからです。 勉強不足で申し訳ありませんが、「シートがアクティブ」の正確な意味がわかりません。 おそらく、回答者さんは処理が実行中に別のシートを開くことでActiveSheetが変更されることを危惧されていると思いますが、そういうことでしょうか?
ttyp03

2018/01/17 06:56

>同じでした。 当てが外れましたか。失礼しました。 ということは、別の原因ですね。 ActiveSheetについては、明示的に必要性があって使っているのであれば問題ないです。 そうでないなら気をつけたほうがいいですよ、という回答です。 意図しない(印刷設定がされていない)シートがアクティブになっていて、それを参照していないかと危惧しました。
mi-c3

2018/01/18 00:36

>追記に関して >印刷範囲ではなく改ページプレビューで表示される範囲というオチですか。 >ここのページで試行錯誤した方々がいたようですが、解決はしていないようですし、私も調べた限りでは無理そうでした。 色々と調べてくださり、ありがとうございました。やはり難しそうですね。。。 「印刷範囲の設定をしていないと処理されませんよ」のようなメッセージを出すようにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問