アプリ版:「スタンプのみでお礼する」機能のリリースについて

このごろ度々お世話になっております。

エクセルでのページ設定で、"ワークシートを何ページに収めて印刷"するか設定できると思うのですがそれを指定してしまうと、他で指定した余白設定とかは無視されてしまうのでしょうか?

VBAで
'ページ設定
Set SENTAKU = Workbooks(3).Sheets(1)
With SENTAKU.PageSetup
.Orientation = xlLandscape
.Zoom = False
.FitToPagesWide = 1
.TopMargin = 55
.BottomMargin = 15
.RightMargin = 0
.PrintTitleRows = "$2:$5"
End With
としたら、見事にMarginが無視されてました。

右の余白「0」は捨てられないのですが、セルの幅が増えても今のデータを横1枚で収めたいと考えてます。
(左の余白は少しぐらい減ってもいいが、どちらかというとZoomを変更して横1枚に収めたい。ちなみに縦は何ページでも可)

PageSetupでそのような設定ができないのなら横がはみ出したら、違うページ設定みないなのをIf文で書くことは可能なのでしょうか?
(横がはみ出したらAの設定(Zoomの縮小率が少し多い)、1枚で収まったらBの設定のような)

よろしくお願いいたします。

A 回答 (2件)

こんにちは。



この件は、私は特別の関心を持っていますが、VBAの中で、一番扱いにくい部分だと思います。

>「デフォルトの余白」でいいかなと思っていたのですが、

だから、やはり、「0」という選択肢はあると思います。

ちょっと遠回りの話になりますが、Excelの「物理的左余白」というのが、私は、一体何なのかよく分かりません。実際の物理的左余白なんて、数ミリのはずなのですが、違う数値が存在しているようです。これで、大幅に印刷に影響するようなことはありませんが、最大限ということなら、「0」を入れることが出来ると思います。

>右の余白は出来る限りいっぱいまでというつもりで「0」にしたのですが、

それは、右改行位置が、途中になるかならないかで、列で、切り捨てられてしまうからなんですね。だから、セル幅に依存してしまうわけなのです。つまり、右端のセル幅以内なら、どの数値を入れても同じことになってしまいますね。

>印刷範囲はデータの行の終点が毎回違うため(たまにノーデータがあるためendも使えない)、設定しにくくなっています。(列数は固定です)

65536行の一番下から、End(XlUp) ではないのですか?
それは、状況によって、関数やマクロにして、いろんな方法が出せるように思います。データの行の終点は、どのような考え方ですか?

>ちなみに”DOCUMENT(65)”とは何を意味しているのでしょうか?ネットで調べたのですがGET.DOCUMENT関数というのがあるのはわかったのですが使い方まで書いていませんでした(泣)

これは、元々は、昔、ある達人さんから教わったテクニックです。

GET.DOCUMENT(65)

現在手に入る資料をもとにすれば、以下のように書かれています。
An array of column numbers corresponding to columns that are immediately to the right of a manual or automatic page break.

「手動・自動改行の直右の位置の列番号を配列で出す」
他にも出し方はあるのですが、この方法が一番確実なのです。

http://office.microsoft.com/ja-jp/assistance/HP0 …

全部英語なんです。

なんとか、私は解決に結び付けたいと思います。
    • good
    • 0
この回答へのお礼

度々のご回答。ありがとうございます。

GET.DOCUMENT(65)の参考URLを見てみましたが「Excel 2000 Help File: Running Excel 4.0 Macros」のことですよね?
確かに英語サイトのようでどこを見てよいやらわかりませんでした。
あとで、もう少しちゃんと見てみます。

「物理的左余白」の問題ですが、実際下にも書きましたが「0」を入力すると、5mmほどの余白が空きます。私は印刷機の設定なのではないかと思うのですが下の余白を「0」にすると本気でぎりぎり「0mm」まで印刷されるのでどういう設定になっているかは良くわかりません。(下は下でまた左右とは別の設定が入ってるのかもしれないし)

>65536行の一番下から、End(XlUp) ではないのですか?

最終列の最終行にデータが入ってるかはデータが来てみないとわからないことなので、これを使うのはちょっと賭けみたいなことになってしまいます。
データの行の終点はデータが入っている列の全てから見た一番下の行でしょうか?(10行程度のこともあれば100行近くまでデータがあることもあるので)
これはエクセルがどこを認知するかに任せてしまってます。縦が途中で切れて次のページになるのは大丈夫なので。

ながながとお付き合いありがとうございました。

お礼日時:2005/08/01 09:20

こんにちは。



まず最初に、

.LeftMargin  の設定がないようなのですが、デフォルトでは、Excelとプリンタ・ドライブとの間で決められている、「デフォルト余白」か、予め設定している余白になるはずだと思います。それでは、「0」にすると、どうなるかというと、「物理的余白」になります。。

しかし、反対側の右の余白(.RightMargin)「0」は、物理的にはありえないようになっています。論理値だけです。

それは、つまり、これは別の見方をすると、

左の物理的余白+左の設定余白+
   (セルの幅の積み上げ+セルの調整余白)>設定用紙の幅

 (あくまでも、この計算の考え方は、私の推測から作られたものです。)

それで、その(論理的)計算で、もしも、設定用紙の幅より超えることがあれば、セルの自動改行が途中で入ります。これは、物理的な計算ではありません。

ただ、いずれにしても、こういうのは、VBA限定の処理では、あまりうまくいかないひとつです。おそらく、Excel内部で設定しているからなのだと思います。

なお、それらの設定値は、ポイントになっていますので、気をつけてください。

幅が収まらないときのサンプルコードです。
MsgBox のところに、実行に必要なコードを入れ替えてください。

Sub testsample()
Dim vc As Variant
  vc = ExecuteExcel4Macro("COLUMNS(GET.DOCUMENT(65))")
  If Not IsError(vc) Then
   If vc > 1 Then
    MsgBox "幅が、1枚に収まりません。"
   End If
  End If
End Sub

この回答への補足

<お礼に対する補足>
結局、列数は変わらないのに一定のセル幅の増減があるため横が入りきらなくなることを考え、
ぎりぎり1枚で収まる幅を確認してそれ以上の列幅であればページ設定を変更するというマクロにしました。
ご迷惑をおかけして申し訳ありませんでした。

'ページ設定
e = Range("B1").Width
Set SENTAKU = Workbooks(3).Sheets(1)
If e < 132 Then
With SENTAKU.PageSetup
.Orientation = xlLandscape
.Zoom = 55
.LeftMargin = 55
.TopMargin = 55
.BottomMargin = 20
.RightMargin = 10
.PrintTitleRows = "$2:$5"
End With
Else
With SENTAKU.PageSetup
.Orientation = xlLandscape
.Zoom = 50
.LeftMargin = 45
.TopMargin = 55
.BottomMargin = 20
.RightMargin = 10
.PrintTitleRows = "$2:$5"
End With
End If

補足日時:2005/07/29 15:06
    • good
    • 0
この回答へのお礼

ご回答ありがとうござます。

左については、「デフォルトの余白」でいいかなと思っていたのですが、全部設定したほうが良いのかもしれないと思い「55」ポイントで設定しようと思います。
右の余白は出来る限りいっぱいまでというつもりで「0」にしたのですが、実際「10」ぐらいにしても変わらないくらいの余白が空くので(5mmぐらい)、「0」としておくよりは「10」にしておいたほうが良いのかもしれません。
問題の自動改行ですが、
サンプルコードを使用してみた結果、
自動改行されたシートはどうもエクセルのなかでは1枚のつもりらしくちゃんと機能してくれません(印刷すると2枚なのに)、印刷範囲の設定をするとやっと「幅が1枚に~」のメッセージボックスが出てきました。
印刷範囲はデータの行の終点が毎回違うため(たまにノーデータがあるためendも使えない)、設定しにくくなっています。(列数は固定です)
もうちょっと良い手を考えてみます。
ありがとうございました。

ちなみに”DOCUMENT(65)”とは何を意味しているのでしょうか?ネットで調べたのですがGET.DOCUMENT関数というのがあるのはわかったのですが使い方まで書いていませんでした(泣)
お手数おかけします。よろしくお願いいたします。

お礼日時:2005/07/29 14:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!