プロが教える店舗&オフィスのセキュリティ対策術

 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()

「Excel:印刷できる幅の調整はできます」の質問画像

A 回答 (5件)

あと、どこかに



 '印刷範囲をA1~BV30にする
 ActiveSheet.PageSetup.PrintArea = "$A$1:$BV$30"

の行を挿入して、印刷範囲を固定して下さい。

With xlPageSetup

End With
で挟まれた中のどこかに

'拡大縮小を100%にする
.Zoom = 100

を挿入して、拡大率を100%に固定してみましょう。

すくなくとも
.Zoom = 100

>印刷できる帳票のサイズが小さくなってしまいました。
は防げる筈です。
    • good
    • 0
この回答へのお礼

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

大変たすかりました。ありがとうございます。

お礼日時:2014/12/01 15:41

こんにちは。



やってみていないので、正確な話ではありませんが、この場合は、Excelの上位互換や下位互換の話とは違うような気がします。

コードをみると、なんとなく違和感を感じます。
理由は、マージンの設定をし直しているからです。私の記憶では、一旦、シートのページを設定したら、それを動かさないようにする、というのが基本だったような気がします。
つまり、一旦、試し印刷でマージン・サイズなどを合わせたら、後はマクロでマージン等の設定をいじらないことだと思います。その設定は、ブックに残されるはずですから、そのシートを使う時には、同じ設定が使えるのだったと思うのです。むろん、マクロで設定できるに越したことはありません。

もう一つは、CentimetersToPoints を使っていることですね。
Excelの印刷の設定というのは、VBのような物理的な設定ではなく、論理計算なので、この計算は、おそらく、丸めが発生しているはずです。InchesToPointsの方が正確なはずです。

要点をまとめると、設定そのものは、手動で設定し、2010と2007で合わせ、その後、マクロではいじらない、もしくは、各バージョンで、実際の印刷に使われた設定を用いる、ということです。

なお、細かいことですが、バージョンによって、枝番がありますから、Val(Application.Version) で数値化し分岐させます。

この回答への補足

WindFallerさま

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

CentimetersToPointsではなく、InchesToPointsのほうが正確なのですね。
こちら、修正かけていきます。

今回は雛形をコピーして使用しているのではなく、
VB.netで新規に作っているので、マージン設定を行わないと、
余白がExcelのデフォルト値になるので、余計崩れてしまうかと考えています。

補足日時:2014/12/01 15:35
    • good
    • 0
この回答へのお礼

初の書込みでしたので、間違ってました。

お礼はこっちに書くのですね。

ありがとうございました。

お礼日時:2014/12/01 15:44

>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
    • good
    • 0

印刷範囲の指定をしてもダメですか?

    • good
    • 0

Excel2010と Excel2007で完全な互換性はありません。

この回答への補足

aokiiさま

ご回答ありがとうございます。
Excel2007から同じ帳票を作ると、"A"と同じ幅になります。
しかしVB.netから作成すると"B"のようになってしまうのです。

補足日時:2014/12/01 12:02
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A