
VB.net 2010 のプログラムで、ExcelからA4サイズの帳票を作り、自動印刷する機能を作っていますが、解決できない点が1つありますので、質問させて頂きました。
実行するPCによって、1枚当たりに印刷できる幅が異なるのです。
画像をご覧いただきたいのですが、画像上段にある"A"はBV列までが、印刷できる範囲です。ところが"B"では、CF列までが印刷範囲となっています。(各列の幅は0.64(9ピクセル)です。)
”ページ設定”の値を見比べましたが、全て同じ設定です。
結果、"B"になってしまうPCで帳票を作ると、BW~CF列の余計な列のせいで、印刷できる帳票のサイズが小さくなってしまいました。
実行したPCの環境は以下のものです。
A画像になったPC Windows7 & Excel2010
B画像になったPC Vista & Excel2007
プリンタは同じプリンタを使っています。
A4で1枚当たりに印刷できる長さを固定に出来ないかご教授ください。
VBの印刷設定~印刷までのソースは次の通りです。
(objAppはExcel.Application、objSht はExcel.Worksheet オブジェクトです)
Dim xlPageSetup As Excel.PageSetup = objSht.PageSetup
With xlPageSetup
.PaperSize = Excel.XlPaperSize.xlPaperA4 '用紙サイズをA4
.Orientation = Excel.XlPageOrientation.xlPortrait
.LeftMargin = objApp.CentimetersToPoints(1.3) '左余白
.RightMargin = objApp.CentimetersToPoints(1) '右余白
.TopMargin = objApp.CentimetersToPoints(1.4)
.BottomMargin = objApp.CentimetersToPoints(1.5)
.FooterMargin = objApp.CentimetersToPoints(1)
.HeaderMargin = objApp.CentimetersToPoints(0.8)
.PrintTitleRows = "$14:$16"
.LeftFooter = "&""MS P明朝,""XXXXXX会社 見積書 (NoXXXXX)"
.RightFooter = "&""MS P明朝,""&P/&N"
.CenterHorizontally = True
End With
objSht.PrintOutEx()

No.4ベストアンサー
- 回答日時:
あと、どこかに
'印刷範囲をA1~BV30にする
ActiveSheet.PageSetup.PrintArea = "$A$1:$BV$30"
の行を挿入して、印刷範囲を固定して下さい。
With xlPageSetup
と
End With
で挟まれた中のどこかに
'拡大縮小を100%にする
.Zoom = 100
を挿入して、拡大率を100%に固定してみましょう。
すくなくとも
.Zoom = 100
で
>印刷できる帳票のサイズが小さくなってしまいました。
は防げる筈です。
chie65535さま
詳しい説明ありがとうございます。
結局A4で印刷できる幅の縮小はできませんでしたが、
教わった内容をヒントに、次の方法で対応できました。
'印刷範囲を定める
Dim intEndRow = objSht.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell).Row
.PrintArea = "A1:BV" & intEndRow
If CInt(objApp.Version) > 12 Then
.Zoom = 100
Else
'印刷結果を拡大する
.Zoom = 112
'横幅を1ページに自動的収める。
.FitToPagesWide = 1
End If
大変たすかりました。ありがとうございます。
No.5
- 回答日時:
こんにちは。
やってみていないので、正確な話ではありませんが、この場合は、Excelの上位互換や下位互換の話とは違うような気がします。
コードをみると、なんとなく違和感を感じます。
理由は、マージンの設定をし直しているからです。私の記憶では、一旦、シートのページを設定したら、それを動かさないようにする、というのが基本だったような気がします。
つまり、一旦、試し印刷でマージン・サイズなどを合わせたら、後はマクロでマージン等の設定をいじらないことだと思います。その設定は、ブックに残されるはずですから、そのシートを使う時には、同じ設定が使えるのだったと思うのです。むろん、マクロで設定できるに越したことはありません。
もう一つは、CentimetersToPoints を使っていることですね。
Excelの印刷の設定というのは、VBのような物理的な設定ではなく、論理計算なので、この計算は、おそらく、丸めが発生しているはずです。InchesToPointsの方が正確なはずです。
要点をまとめると、設定そのものは、手動で設定し、2010と2007で合わせ、その後、マクロではいじらない、もしくは、各バージョンで、実際の印刷に使われた設定を用いる、ということです。
なお、細かいことですが、バージョンによって、枝番がありますから、Val(Application.Version) で数値化し分岐させます。
この回答への補足
WindFallerさま
ご回答ありがとうございます。
CentimetersToPointsではなく、InchesToPointsのほうが正確なのですね。
こちら、修正かけていきます。
今回は雛形をコピーして使用しているのではなく、
VB.netで新規に作っているので、マージン設定を行わないと、
余白がExcelのデフォルト値になるので、余計崩れてしまうかと考えています。
No.3
- 回答日時:
>Excel2007から同じ帳票を作ると、"A"と同じ幅になります。
>しかしVB.netから作成すると"B"のようになってしまうのです。
「VB.net(Excel2010)」は「Excel2007の上位互換」であって「完全互換」ではありません。
「上位互換」ってのは「下位のを読み込んだりはできるけど、設定を完全に同じにしても、まったく同じ物はできませんよ。微妙に差異が出るので、手動で微調整しないといけませんよ」っていう「互換性」です。
一方「完全互換」ってのは「設定を完全に同じにすれば、まったく同じ物が出来ますよ」っていう「互換性」です。
残念ながら、VB.net(Excel2010)は「上位互換」なので、設定をまったく同じにしても、Excel2007とは違う物が出来上がります。
>A4で1枚当たりに印刷できる長さを固定に出来ないかご教授ください。
Excelのバージョンを判定して、バージョンごとに最適な余白を指定して下さい。
.PaperSize = Excel.XlPaperSize.xlPaperA4 '用紙サイズをA4
.Orientation = Excel.XlPageOrientation.xlPortrait
If CInt(Application.Version) > 12 Then
'Excelが2007より新しい場合
.LeftMargin = objApp.CentimetersToPoints(○○○) '左余白
.RightMargin = objApp.CentimetersToPoints(×××) '右余白
(略)
Else
'Excelが2007か、2007以前の場合
.LeftMargin = objApp.CentimetersToPoints(△△△) '左余白
.RightMargin = objApp.CentimetersToPoints(□□□) '右余白
(略)
End If
のようにして、ExcelのVersionを判定して「2007で上手くいく左右余白」と「2010で上手くいく左右余白」を切り替えて下さい。
「Excelのバージョンが違うので、ページ設定の内容をまったく同じにしても、印刷結果が大違い」になります。
Application.Versionの値はStringで
Excel2013:"15.0"
Excel2010:"14.0"
Excel2007:"12.0"
Excel2003:"11.0"
Excel2002:"10.0"
Excel2000:"9.0"
Excel97:"8.0"
Excel95:"7.0"
Excel5.0:"5.0"
となっています。
なお「Excel2013」で実行すると、同じように「2013に合わせた余白の値にしないと、ページレイアウトが崩れる筈」なので「If文の場合分け」を以下のように増やしてください。
If CInt(Application.Version) > 14 Then
'Excel2013の場合
(略)
Else
If CInt(Application.Version) > 12 Then
'Excel2010の場合
(略)
Else
'Excel2007か2007以前の場合
(略)
End If
End If
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでCOPYを繰り返すと、処理が...
-
vba textboxへの入力について教...
-
【ExcelVBA】5万行以上のデー...
-
【マクロ】シートの変数へ入れ...
-
【VBA】 結合セルに複数画像と...
-
Vba Array関数について教えてく...
-
vbsでのwebフォームへの入力制限?
-
複数のExcelファイルをマージす...
-
Vba セルの4辺について罫線が有...
-
VBAでセルの書式を変えずに文字...
-
VBA ユーザーフォーム ボタンク...
-
【マクロ】並び替えの範囲が、...
-
pdfファイルの複数添付 引数の型
-
【マクロ】売上一覧YYYYMMDDHHS...
-
エクセルのマクロについて教え...
-
VBA 最終行の取得がうまくいか...
-
WindowsのOutlook を VBA から...
-
VBA 円グラフ 特定条件に一致し...
-
[VB.net] ボタン(Flat)のEnable...
-
【ExcelVBA】値を変更しながら...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Vba Array関数について教えてく...
-
VBAでCOPYを繰り返すと、処理が...
-
【ExcelVBA】5万行以上のデー...
-
【マクロ】シートの変数へ入れ...
-
vbsでのwebフォームへの入力制限?
-
エクセルのマクロについて教え...
-
【マクロ】並び替えの範囲が、...
-
Vba セルの4辺について罫線が有...
-
【マクロ】売上一覧YYYYMMDDHHS...
-
VBAでユーザーフォームを指定回...
-
【マクロ】開いているブックの...
-
エクセルの改行について
-
vb.net(vs2022)のtextboxのデザ...
-
エクセルのVBAコードと数式につ...
-
算術演算子「¥」の意味について
-
Excelのマクロについて教えてく...
-
改行文字「vbCrLf」とは
-
ワードの図形にマクロを登録で...
-
VBAの「To」という語句について
-
【マクロ】変数を使った、文字...
おすすめ情報