[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『「印刷」から「名前を付けて保存」の流れをVBAで一括処理』(勉強不足)
社内で共通のエクセルフォーム(見積書・納品書・請求書が各々のシートに収められている)を使用しています。
その中で「御見積書」シートの「印刷」からブックの「名前を付けて保存」まで一連の流れをVBAで一括処理したいです。
やりたいこと
その1.シート名「御見積書」の印刷
シートの構成はA1:L42が見積書の鏡となっており
A43:L84、A85:L126・・・と24行が1ページと印刷設定された内訳があります。
現在は印刷の際、A1:L42の鏡のN2セルにページ総数(半角数字)を入力→印刷→総数に応じてページ数を指定→印刷ボタン押下しPDF化していますが
(これは印刷範囲が5ページまで設定されているためです。)
ページ数を自分で指定せずN2セルの数字ページ数で印刷をしたいです。
その2.ブックの保存
フォームはテンプレとして使用しているので、1案件ごとに「名前を付けて保存」します。
ルールがあり、セル「C12」(見積内容)+アンダーバー+「L4」(年月日)が保存名となります。
保存名を自動に取得してマクロ型式ではなく「*.xlsx」形式でデスクトップへ保存したいです。
その3.閉じる前にアクティブセルをA1にしてから閉じる。
これは次回開くときにアクティブセルがA1にある、でも構いません。
その4.その1.〜3.まで一つのマクロで実行したいです。
長文失礼いたしました。
何卒よろしくお願いします。
< 使用 Excel:Office365、使用 OS:Windows10 >
(もこな2) 2019/10/11(金) 12:25
まくろすたーと
プリンタをPDFプリンタに変更 プリントアウトする命令の引数に開始ページ、終了ページ(N2セルから取得)を指定して実行
シートごと新規ブックへコピー
With コピーして出来た新規ブック (1番目のシートの)A1セルを選択
名前を付けて保存 ファイル名 = デスクトップのパス + C12セルの値 + 年月日(L4から取得) ファイル形式 = 希望のものを指定
閉じる End with
まくろおわり
(もこな2) 2019/10/11(金) 12:54
自分なりに調べて、このように記述しました。
Sub 見積書印刷から保存まで()
'印刷ページ数をN2セルから取得
ActiveWindow.SelectedSheets.PrintOut From:=1, To:=Range("N2").Value,Copies:=1, Collate _:=True
Dim Save_File, Save_Filename As String Dim strca As String Dim objNa As Object
'名前を付けて保存するファイル名の設定 Save_Filename = Range("C12") & "_" & Range("L4")
'「名前を付けて保存する」ダイアログボックスの表示 Save_File = Application.GetSaveAsFilename(Save_Filename, _ FileFilter:="Excelファイル,*.xlsx,すべてのファイル,*.*")
'ユーザ名の取得 Set objNa = CreateObject("WScript.Network") strca = objNa.UserName
'アクティブセルをA1へ ActiveSheet.Range("A1").Select
End Sub
フォームにページ設定されている5ページ分が印刷されてしまい、保存もできませんでした。
ご教示いただけると幸いです。
よろしくお願いいたします。
(勉強不足) 2019/10/11(金) 16:43
>保存もできませんでした。
マクロの記録は試してみましたか?
(たぶんダイアログボックスの表示は記録されないとおもいますが・・・・)
>ユーザ名の取得
取得したいのは”デスクトップ(のパス)”ですよね?
コンパイルエラーにならないことしかチェックしてないですが、一つの例としてこんな感じでは?
Sub さんぷる() Stop ' ←ブレークポイントの代わり
Dim MyPath As String MyPath = CreateObject("WScript.Shell").SpecialFolders("Desktop")
With Worksheets("御見積書")
'▼1〜指定したページまで印刷 .PrintOut From:=1, To:=Range("N2").Value
'▼シートを丸ごと新規ブックへコピー .Copy
End With
'▼シートをコピーしてできた新規ブック With Workbooks(Workbooks.Count)
'(デスクトップに)名前を付けて保存 .SaveAs _ Filename:=MyPath & "\" & .Worksheets(1).Range("C12").Value & Format(.Worksheets(1).Range("L4"), "yyyyddmm"), _ FileFormat:=xlOpenXMLWorkbook
'ブックを閉じる .Close End With End Sub
(もこな2) 2019/10/11(金) 22:52
コメントいただきありがとうございます。
「御見積書」シートのN5セルは【1】ですが、5ページ印刷されてしまいました。
マクロの記録は試していないのです、今から試してみます。
5ページ印刷されてしまうことに悩んでしまっていました。
ユーザ名の取得は、おっしゃる通り”デスクトップ(のパス)”ですが、
PCが変わっても使えるようにしたいためです。
「御見積書」シートのみを「名前を付けて保存」ではなく、
ブック全体を保存したいです。
そのフォームの別シートに「請求書」「納品書」などがあり、
「御見積書」シートの入力内容が反映される仕様になっているからです。
(フォームは別の人が作り、社内全体で使用していて
請求書など他のシートは営業が使います。)
まだまだ勉強不足で理解が足りず申し訳ありません。
よろしくお願いいたします。
(勉強不足) 2019/10/16(水) 09:42
■2
>PCが変わっても使えるようにしたいためです。
それは分かっています。
試しに、今の環境、別(のユーザーでログインしている)PCでそれぞれ、イミディエイトに↓を入力してなんと表示されるか確認してみてください。
? CreateObject("WScript.Shell").SpecialFolders("Desktop")
もしくは↓をみると何を言いたいか分かってもらえるかもしれません。
http://officetanaka.net/excel/vba/tips/tips107.htm
■3
>「御見積書」シートのみを「名前を付けて保存」ではなく、ブック全体を保存したいです。
なるほど。そういうことでしたか。
その場合は、ブックをそのまま別名で保存すればよいですね。
■4
(■3)と関連しますが、別ブックとして保存するのであれば、印刷するページを指定するんじゃなくて要らない行を消してもいいかもですね。
ただ、消しちゃった場合は戻せませんので、次にそのブックをフォーム代わりにすることができなくなるので注意が必要です。
(要は連続処理しようとすると支障が出る場合がある)
踏まえると、将来的に連続処理を考えているなら↓みたいな感じでもよいのかも。
まくろすたーと 【1】デスクトップのパスを取得する
【2】"見積書","納品書","請求書"シートをまとめて新規ブックへコピーする
with コピーして出来たブックの"見積書"シート
【3】N2セルを確認して要らない行があれば削除する
【4】対象のシートをアクティブにする A1セルを選択する
【5】親(ブック)を名前を付けて保存 ファイル名 = デスクトップのパス + C12セルの値 + 年月日(L4から取得) ファイル形式 = 希望のものを指定
【6】対象のシートをPDF形式で保存する(出力パスは親ブックに準拠)
【7】親(ブック)を閉じる end with まくろおわり
【6】はマクロの記録でヒントが得られないようなので、たぶん↓こんな感じです。 .ExportAsFixedFormat Type:=xlTypePDF, Filename:=Left(.Parent.FullName, InStrRev(.Parent.FullName, ".") - 1)
(もこな2) 2019/10/16(水) 18:01
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.