【無料配信♪】Renta !全タテコミ作品第1話

 Excel2010 VBAにてマクロを作成しております。
Excel2010のメインウィンドウの「ファイル」タブ→「印刷」の
画面におきまして、[設定]欄にて設定したページ指定(印刷開始ページ及び
印刷終了ページ)は取得できるのでしょうか?

 Workbook_BeforePrintプロシージャにて取得しようと思っているのですが、
ActiveSheet.PageSetupのメンバやThisWorkbookのメンバを見たところ、
印刷の開始ページ及び終了ページの設定が見つかりませんでした。
印刷のページ指定の設定箇所をご存知の方がいらっしゃいましたら
教えて頂きたく宜しくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

直接の回答とは言えないことをまずはお詫びしつつ。



私の頭の中には
「全頁の上端・下端に“同じモノ”を印刷する」
という事がヘッダー・フッターの意義である、というモノがありますので
(当然、ページ番号などの可変部分は除きます)、
質問者さまの
> 別シートに記述の「ページごとのヘッダー値」
と言う考え方にはなかなか賛同できずにいます。

具体的に「ヘッダーフッターの位置にどのように印刷したいのか」がわかれば、
なんとなくでも策が見いだせるかもしれません。


例えば、
「奇数ページは右端にヘッダーフッターを、偶数ページは左端に」
と言うのであれば、2007以降「奇数/偶数ページ別指定」というオプションが付きましたので
単純にこの機能を使ってやれば済みます。

潰れて見辛いかもしれませんが、
「ページ設定」の中、「奇数/偶数ページ別指定」にチェックを入れ、
「ヘッダー(フッター)の編集」をクリックすると、
「奇数ページ/偶数ページのヘッダー(フッター)」のタブが現れますので、
これで別々に設定してやります。

ちなみにVBAで記述する際は
Sub ODD_EVEN_HEADER_FOOTER()
  Application.PrintCommunication = False
  With ActiveSheet.PageSetup
    ' 奇数ページのヘッダー/フッター
    .LeftHeader = ""
    .CenterHeader = ""
    .RightHeader = ""
    .LeftFooter = ""
    .CenterFooter = ""
    .RightFooter = "奇数"

    ' 奇数/偶数ページ別ON
    .OddAndEvenPagesHeaderFooter = True

    '偶数ページのヘッダー/フッター
    .EvenPage.LeftHeader.Text = ""
    .EvenPage.CenterHeader.Text = ""
    .EvenPage.RightHeader.Text = ""
    .EvenPage.LeftFooter.Text = "偶数"
    .EvenPage.CenterFooter.Text = ""
    .EvenPage.RightFooter.Text = ""
  End With
  Application.PrintCommunication = True
End Sub
こんな感じのようです。



いや、そうじゃない。本当に「ページ別に変えたいんだ」というのであれば、
回答として「エクセルにはその機能は無いはずです」と言うものを提示させていただきます。
前述の通り、それは「ヘッダー/フッターの考え方と若干ずれている」からです。

強引にコレを実現するなら
※例えば1行目から100行目で10行ごとに改ページなら
まずは印刷範囲を指定して、
以下10行ごとに
・印刷範囲を指定
・ヘッダー/フッターを設定
・印刷
を繰り返すようなイメージになるのではないかなぁ、と思います。


以上、何かの参考までにお納めくださいませ。
「Excel2010 VBAにて印刷設定の」の回答画像2
    • good
    • 0
この回答へのお礼

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


> 直接の回答とは言えないことをまずはお詫びしつつ。
 ご丁寧にありがとうございます。
こちらこそご回答を頂きながらお礼が遅くなりまして申し訳ありません。


> 私の頭の中には
> 「全頁の上端・下端に“同じモノ”を印刷する」
> という事がヘッダー・フッターの意義である、というモノがありますので
> (当然、ページ番号などの可変部分は除きます)、
> 質問者さまの
>> 別シートに記述の「ページごとのヘッダー値」
> と言う考え方にはなかなか賛同できずにいます。
>
> 具体的に「ヘッダーフッターの位置にどのように印刷したいのか」がわかれば、
> なんとなくでも策が見いだせるかもしれません。
 tsubuyuki様の仰るのもごもっともです。
ヘッダー・フッターは同じものを印刷すると理解しているのですが、
ページ番号などの可変部分は使用できるので、同じように可変に
できないものかと思ってしまっています。
具体的には1枚のシートに月報を作っておりまして、月ごとに
改ページを行っております。
 4ページ目:2013年4月
 5ページ目:2013年5月
 6ページ目:2013年6月
 ~
 13ページ目:2014年1月
 14ページ目:2014年2月
 15ページ目:2014年3月
※先頭ページ番号を4に設定
 最初の質問の仰々しさからすると大した内容ではない
ヘッダー・フッターなのですが、ヘッダーとフッターには
 ヘッダー:yyyy年m月 月報
 フッター:月ごとの注意事項
を印刷しようと考えております。

ExcelVBAでの記述は

Workbook_BeforePrintで

印刷ページ分ループ内にて
ActiveSheet.PageSetup.CenterHeader =
  StrConv(CStr(Format(DateSerial("2013", ページ番号, "1"), "yyyy年m月")), vbWide)

と設定して1枚ずつ印刷を実行するイメージです。


> 例えば、
> 「奇数ページは右端にヘッダーフッターを、偶数ページは左端に」
> と言うのであれば、2007以降「奇数/偶数ページ別指定」というオプションが付きましたので
> 単純にこの機能を使ってやれば済みます。
>
> ....
> こんな感じのようです。
 このような機能もあるのですね。
今回は奇数/偶数ページでは分けられないので利用させて頂くことは
できないようですが、よい知識を得ることができました。
ありがとうございます。


> いや、そうじゃない。本当に「ページ別に変えたいんだ」というのであれば、
> 回答として「エクセルにはその機能は無いはずです」と言うものを提示させていただきます。
> 前述の通り、それは「ヘッダー/フッターの考え方と若干ずれている」からです。
>
> 強引にコレを実現するなら
> ※例えば1行目から100行目で10行ごとに改ページなら
> まずは印刷範囲を指定して、
> 以下10行ごとに
> ・印刷範囲を指定
> ・ヘッダー/フッターを設定
> ・印刷
> を繰り返すようなイメージになるのではないかなぁ、と思います。
>
>
> 以上、何かの参考までにお納めくださいませ。
 先ほどのヘッダーフッターの奇数/偶数ページ別指定のように
Excelとしてヘッダーフッターの機能として沿っているものは
ついているわけで。Win32APIのOpenPrinter・GetPrinterを使用して、
DEVMODEやPRINTER_INFOなどを取得してみましたが、どこにも
印刷開始ページ、終了ページの情報はありませんでした。
tsubuyuki様の仰るように僕の行おうとしていることは
ヘッダーフッターの考え方からずれているのかと思われます。
やはりシートに記述する内容なのもしれません。

お礼日時:2013/09/07 10:53

こんにちは。



取得する目的は?

取得ってできるのかな?
設定は、PrintPutメソッドに引数があるのでできます。
    • good
    • 0
この回答へのお礼

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

 目的としましては以下のように印刷時に
別シートに記述してあるページごとのヘッダー、
フッターの内容に入れ替えようと思っております。

Private Sub Workbook_BeforePrint(Cancel As Boolean)
  ※取得できるなら「ファイル」タブ→「印刷」にて
   指定したページ番号ループにしたい
   For i = 開始ページ To 終了ページ
    With ActiveSheet
     With .PageSetup
       .CenterHeader = 別シートに記述のページごとのヘッダー値
       .CenterFooter = 別シートに記述のページごとのフッター値
     End With
     .PrintOut 1ページずつ
    End With
   Next
End Sub

 取得できないようでしたら、印刷用のボタンと
開始ページ、終了ページを設定するシートを作成して
そこから行うことになるのかなと思っております。
 

お礼日時:2013/09/06 10:59

このQ&Aに関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QEXCEL-VBAで印刷時のページ番号を取得したい

EXCEL97です。
ブックの目次を作るマクロを作っています。
ブック内のシート名を目次のシートに縦に並べることはできたのですが、
その横にセットしたページ数をどうやって取得するか悩んでいます。
過去ログも見たのですがHPageBreaks.Countでは
プレビューでは1ページしかないはずのシートで
1が返ってきたりしてどうもうまくいきません。
良い方法があればどなたか教えてもらえないでしょうか。

Aベストアンサー

Application.ExecuteExcel4Macro("get.document(50)")
で、印刷ページ数が取得出来ます。

http://www2.odn.ne.jp/excel/waza/print.html

Qマクロを使って両面 部数設定をして印刷したい

ぜひ教えてください。

エクセル2010です。
現在 下記で印刷していますがこれに 両面 部数設定U1 にて
印刷ができるようにしたいのです。
ぜひマクロを教えてください。
(マクロの知識がなく 下のマクロもコピーで使用しています)

Sub 印刷()

With Sheets("シート書")
For num = .Range("s1").Value To .Range("t1").Value
.Range("r7").Value = num
.PrintOut
Next num
End With

End Sub

Aベストアンサー

両面印刷はプリンタドライバの設定によって制御されます。
なので、VBA(マクロ)からこれを設定しようとすると
相当な努力が必要です。(私はやろうと思えません。)
> マクロの知識がなく
と言う状態であれば、ひとまずは「無理」と覚えていただきたいところです。


コレで終わるのは申し訳ないので、ある程度簡単にできるやり方を。
わかりやすいだろうと思われる言葉を選びますが、難しかったらご容赦ください。

準備)
両面印刷用の「プリンタドライバ」を用意します。

Win7なら、
コントロールパネル から デバイスとプリンタ を開き、 プリンタを追加、
両面印刷に使用するプリンタを指定して追加し(いつも使っているプリンタで結構です)、
「両面印刷用(仮)」などわかりやすい名前にしておきます。

追加されたプリンタを右クリック、印刷設定を出します。
これから先はプリンタのメーカーや機種によって様々ですので
詳細を記載することは困難ですので、いつも通りの「両面設定」をなさってください。
適用・OKとボタンを押すと「このドライバに」両面印刷の設定が保存されます。
注:今後、このプリンタドライバを使うと「必ず」両面印刷されます。
  「通常使うプリンタ」に指定するのは危険です。

ここから、エクセルマクロ(VBA)での設定です。
エクセルを立ち上げ、該当ブックを開き、
念のためプレビュー画面でプリンタを先ほど設定した「両面印刷用(仮)」にし、
プリンターのプロパティ で「両面印刷が初期値である」を確認しておきましょう。
上手く設定できていれば、プロパティを開いた時から両面印刷状態になっているはずです。

質問文中のコードを

Sub 印刷()
  With Sheets("シート書")
    For num = 1 To .Range("U1").Value '1~U1セルの数字まで繰り返し
      .Range("R7").Value = num 'R7セルに○部目を入力。不要ならこの行は削除
      .PrintOut ActivePrinter:="両面印刷用(仮)"
    Next num
  End With
End Sub

と書き換えてやります。

これでU1セルの部数分、両面印刷されます。


正直、苦肉の策です。

両面印刷はプリンタドライバの設定によって制御されます。
なので、VBA(マクロ)からこれを設定しようとすると
相当な努力が必要です。(私はやろうと思えません。)
> マクロの知識がなく
と言う状態であれば、ひとまずは「無理」と覚えていただきたいところです。


コレで終わるのは申し訳ないので、ある程度簡単にできるやり方を。
わかりやすいだろうと思われる言葉を選びますが、難しかったらご容赦ください。

準備)
両面印刷用の「プリンタドライバ」を用意します。

Win7なら、
コントロールパ...続きを読む

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。

Qエクセルマクロで印刷プリンタを指定する方法

表題のとおりなんですけと、エクセルのVBAでの印刷命令はできますが、複数あるプリンタから特定のプリンタを指定したいのですが、なにかいい方法ありませんか?

Aベストアンサー

印刷のポートがLPT1:(プリンタポート)ならば

例:プリンタ名 自分のプリンタ
Application.ActivePrinter = "自分のプリンタ on LPT1:" 'プリンタの指定
ActiveWindow.SelectedSheets.PrintOut '印刷

印刷ポートがLAN内のプリンタサーバーの場合

例1:プリンタ名 事務室プリンタ
Application.ActivePrinter = "事務室プリンタ on Ne01:"
ActiveWindow.SelectedSheets.PrintOut

例2:プリンタ名 会議室プリンタ
Application.ActivePrinter = "会議室プリンタ on Ne02:"
ActiveWindow.SelectedSheets.PrintOut

Ne01 Ne02はLANにより異なります。

Qエクセルでシート毎の両面印刷を自動で設定する方法

エクセルシートのプリンタドライバの印刷設定について、現在の印刷設定と両面印刷設定とを切り替える方法を探しています(EXCEL2002です)。

VBAによる対策方法を色々調べてみましたが、VBAの機能では対応できないようです。
( sendkeys を使って擬似的にキー入力を行う方法もありましたが、ショートカットの割り当てが他のアプリケーションと重なる可能性があるため、この方法は避ける事にしました)


ワード向けですが、MicrosoftのページにVBからAPIを利用して、同様の設定をするサンプルがありましたので、エクセルのVBAでも試してみましたが、変更したプリンタの設定は、シートの設定に反映されませんでした(エクセル独自でシート毎の印刷設定が保存されていると思っています)。

対策として、
1)APIをうまく使う方法
2)Excelファイルが持っていると思われるプリンタ設定の変更
の2つがあると思っています。

APIを本格的に使ったこともありまんせので、印刷設定に関するAPIの参考情報を教えてもらえるだけでも助かります。

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

エクセルシートのプリンタドライバの印刷設定について、現在の印刷設定と両面印刷設定とを切り替える方法を探しています(EXCEL2002です)。

VBAによる対策方法を色々調べてみましたが、VBAの機能では対応できないようです。
( sendkeys を使って擬似的にキー入力を行う方法もありましたが、ショートカットの割り当てが他のアプリケーションと重なる可能性があるため、この方法は避ける事にしました)


ワード向けですが、MicrosoftのページにVBからAPIを利用して、同様の設定をするサンプルがありました...続きを読む

Aベストアンサー

> 保存したファイルを読み直しても、シート別にプリンタ設定が異なっていました。

ホントですね。
勘違いしてました。

--
> 1)APIをうまく使う方法

恐らく、質問者さんが探し当てたものと思われる記事を見ましたが、こちらはプリンタにエスケープシーケンスと呼ばれる信号を送り、「両面に設定を変更しなさい」と命令する手順かと思います。
プリンタがそういうコードに対応しているのが前提ですす。(対応していないプリンタではゴミが印刷されます。)
また、「両面に設定を変更しなさい」と命令しても、Excelが「これ、片面で印刷しといて」と命令を出すのなら、デフォルトの設定を変更する意味しかないですし。

APIというのは、アプリケーション・プログラム・インターフェースの名前が示すと通りインターフェースですから、アプリケーション側がインターフェースを提供していない部分に関しては、どうにも出来ません。
両面印刷の設定に関しては、こちらが提供されていないんじゃないかと思います。


> 2)Excelファイルが持っていると思われるプリンタ設定の変更

こちらに関しては、同じシートに対して片面設定<->両面設定を切り替えた物を別名で保存すれば、Stirlingなどのバイナリエディタで比較する事で、対象の設定箇所が絞り込めそうです。
ただ、私が確認した所、数バイト書き換えを行う必要があり、ワークシートの内容が異なる場合や、別のプリンタでの両面設定に対応するか疑問です。

> 保存したファイルを読み直しても、シート別にプリンタ設定が異なっていました。

ホントですね。
勘違いしてました。

--
> 1)APIをうまく使う方法

恐らく、質問者さんが探し当てたものと思われる記事を見ましたが、こちらはプリンタにエスケープシーケンスと呼ばれる信号を送り、「両面に設定を変更しなさい」と命令する手順かと思います。
プリンタがそういうコードに対応しているのが前提ですす。(対応していないプリンタではゴミが印刷されます。)
また、「両面に設定を変更しなさい」と命令して...続きを読む

Q【Excel VBA】マクロでExcel自体を終了させたい

環境:WindowsXP、Excel2003

マクロでエクセルを終了(ブックを閉じて、アプリケーション自体も終了)させたいのですが、以下のコードではアプリケーションが閉じてくれません。

ThisWorkbook.Close
ExcObj.Quit
Application.Quit

どこか悪いところはありますでしょうか?

よろしくお願いします。

Aベストアンサー

普通に考えれば質問者のコードで上手くいきそうですが
hana-hana3さんの回答にもあるようにThisWorkBook.Closeでコード終了となりますので
Application.QuitをThisWorkBook.Closeの前にもってこないといけません。
Application.Quitはそれがあるプロシージャのコードが全て終わるまで
その実行を保留するちょと特別動作をします。

'-------------------------------------
 Application.Quit
 ThisWorkbook.Close
'-------------------------------------
 
 

Qexcel VBAで、プリンターの印刷余白及び用紙サイズを取得するには

Excelでラベル印刷を行っています。
社内には多種類のプリンターがあり、それぞれで印刷可能位置が違うため、中には最後の行が半分しか印刷できないようなプリンターもあります。
そのようなプリンターに関しては、印刷行数を1行減らすよう設定したいと思っています。 そこでプリンターが持っている印刷可能位置(上下・左右余白等)を取り込みたいのですがその方法が分かりません。 どなたかご教示お願いします。

Aベストアンサー

Declare Function CreateDC Lib "gdi32.dll" Alias "CreateDCA" _
(ByVal lpszDrive As String, ByVal lpszDevice As String, _
ByVal lpszOutput As Long, lpInitData As DEVMODE) As Long



Declare Function GetDeviceCaps Lib "gdi32" ( _
ByVal hdc As Long, _
ByVal nIndex As Long _
) As Long

Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long

Private Const HORZRES = 8 '実際のスクリーンの幅(実印刷領域)
Private Const VERTRES = 10 '実際のスクリーンの高さ
Private Const PHYSICALWIDTH = 110 '物理的幅(実用紙サイズ)
Private Const PHYSICALHEIGHT = 111 '物理的高さ
Private Const PHYSICALOFFSETX = 112 '印刷可能な左方向のマージン
Private Const PHYSICALOFFSETY = 113 '印刷可能な上方向のマージン

Public Const CCHDEVICENAME = 32
Public Const CCHFORMNAME = 32

Public Type DEVMODE
dmDeviceName As String * CCHDEVICENAME
dmSpecVersion As Integer
dmDriverVersion As Integer
dmSize As Integer
dmDriverExtra As Integer
dmFields As Long
dmOrientation As Integer
dmPaperSize As Integer
dmPaperLength As Integer
dmPaperWidth As Integer
dmScale As Integer
dmCopies As Integer
dmDefaultSource As Integer
dmPrintQuality As Integer
dmColor As Integer
dmDuplex As Integer
dmYResolution As Integer
dmTTOption As Integer
dmCollate As Integer
dmFormName As String * CCHFORMNAME
dmUnusedPadding As Integer
dmBitsPerPel As Long
dmPelsWidth As Long
dmPelsHeight As Long
dmDisplayFlags As Long
dmDisplayFrequency As Long
End Type

Const LOGPIXELSX = 88
Const LOGPIXELSY = 90

Sub test()

'http://hpcgi1.nifty.com/MADIA/VBBBS/wwwlng.cgi?print+200505/05050096.txt より
'アクティブプリンターの取得
Dim ret As Long
Dim lngPrinter As Long
Dim ActivePrinterName As String
Dim devm As DEVMODE
Dim intPos As Integer

devm.dmSize = LenB(devm)

intPos = InStr(1, Application.ActivePrinter, " on ")
If intPos > 0 Then
ActivePrinterName = Mid$(Application.ActivePrinter, 1, intPos - 1)
End If

If intPos = 0 Then
intPos = InStr(1, Application.ActivePrinter, " の ")
If intPos > 0 Then
ActivePrinterName = Mid$(Application.ActivePrinter, intPos + 3)
Else
MsgBox ("ありえない")
Exit Sub
End If
End If


lngPrinter = CreateDC("WINSPOOL", ActivePrinterName, 0, devm)

'http://www.bcap.co.jp/hanafusa/VBHLP/pMargi.n.htmより
'プリンターの印刷余白を取得

Dim LeftMargin As Long, TopMargin As Long
Dim RightMargin As Long, BottomMargin As Long
Dim PhysHeight As Long, PhysWidth As Long
'マージンをピクセル単位で取得しそれをmmに変換
LeftMargin = ScaleX(lngPrinter, GetDeviceCaps(lngPrinter, PHYSICALOFFSETX))
TopMargin = ScaleY(lngPrinter, GetDeviceCaps(lngPrinter, PHYSICALOFFSETY))
PhysWidth = ScaleX(lngPrinter, GetDeviceCaps(lngPrinter, PHYSICALWIDTH))
PhysHeight = ScaleY(lngPrinter, GetDeviceCaps(lngPrinter, PHYSICALHEIGHT))
'用紙サイズから印刷可能領域を差引きマージンを求める
RightMargin = PhysWidth - (ScaleX(lngPrinter, GetDeviceCaps(lngPrinter, HORZRES)))
BottomMargin = PhysHeight - (ScaleY(lngPrinter, GetDeviceCaps(lngPrinter, VERTRES)))
Debug.Print "プリンター用紙印刷余白(左) : " & LeftMargin & " mm"
Debug.Print "プリンター用紙印刷余白(上) : " & TopMargin & " mm"
Debug.Print "プリンター用紙印刷余白(右) : " & RightMargin & " mm"
Debug.Print "プリンター用紙印刷余白(下) : " & BottomMargin & " mm"
Debug.Print "プリンター用紙サイズ(幅)  : " & PhysWidth & " mm"
Debug.Print "プリンター用紙サイズ(高さ) : " & PhysHeight & " mm"

ret = DeleteDC(lnghPrinter)

End Sub

'http://www.kit.hi-ho.ne.jp/h-suenaga/progtips.html#bcb1 より ピクセル->mmの計算式
'1インチ = 25.4mm
Function ScaleX(ByVal lngPrinter As Long, ByVal Value As Long)
ScaleX = Int(0.5 + 25.4 * Value / GetDeviceCaps(lngPrinter, LOGPIXELSX))
End Function
Function ScaleY(ByVal lngPrinter As Long, ByVal Value As Long)
ScaleY = Int(0.5 + 25.4 * Value / GetDeviceCaps(lngPrinter, LOGPIXELSY))
End Function

Declare Function CreateDC Lib "gdi32.dll" Alias "CreateDCA" _
(ByVal lpszDrive As String, ByVal lpszDevice As String, _
ByVal lpszOutput As Long, lpInitData As DEVMODE) As Long



Declare Function GetDeviceCaps Lib "gdi32" ( _
ByVal hdc As Long, _
ByVal nIndex As Long _
) As Long

Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long

Private Const HORZRES = 8 '実際のスクリーンの幅(実印刷領域)
Private Const VERTRES ...続きを読む

QEXCEL VBAで全選択範囲の解除

EXCEL VBAで
Cells.Select
と書くと、全セルが選択状態になりますが、
これを解除するには、どう書けばよいのでしょうか?

Aベストアンサー

その1
A1 など、適当なセルを選択する。
(回答#1と同じ)

その2
全選択する前の選択範囲に戻る。

全選択前に
変数 = Selection.Address で記憶

全選択後
Range(変数).Select で元の選択範囲を選択


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

人気Q&Aランキング