[[20191011120816]] 『「印刷」から「名前を付けて保存」の流れをVBAで』(勉強不足) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『「印刷」から「名前を付けて保存」の流れを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


そこまでやりたいことがはっきりしているなら、まずは「マクロの記録」から挑戦してみましょう。
(べん) 2019/10/11(金) 12:34

たぶん、擬似コードにするとこんな感じでは?
 まくろすたーと

    プリンタをPDFプリンタに変更
    プリントアウトする命令の引数に開始ページ、終了ページ(N2セルから取得)を指定して実行

    シートごと新規ブックへコピー

    With コピーして出来た新規ブック
      (1番目のシートの)A1セルを選択

      名前を付けて保存
        ファイル名   = デスクトップのパス + C12セルの値 + 年月日(L4から取得)
        ファイル形式 = 希望のものを指定

      閉じる
    End with

  まくろおわり

(もこな2) 2019/10/11(金) 12:54


コメントありがとうございます。
VBA初心者でわからないことだらけです。
至らない点が多々あると存じますがよろしくお願いいたします。

自分なりに調べて、このように記述しました。

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


>フォームにページ設定されている5ページ分が印刷されてしまい、
ちょっと状況がわからないですが、「御見積書」シートのN5セルには、なんと入っていたのですか?
説明のとおりだと、【5】と入力されていたら、「御見積書」シートの1〜5ページが印刷されそうですが

>保存もできませんでした。
マクロの記録は試してみましたか?
(たぶんダイアログボックスの表示は記録されないとおもいますが・・・・)

>ユーザ名の取得
取得したいのは”デスクトップ(のパス)”ですよね?

コンパイルエラーにならないことしかチェックしてないですが、一つの例としてこんな感じでは?

    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


もこな2様

コメントいただきありがとうございます。

「御見積書」シートのN5セルは【1】ですが、5ページ印刷されてしまいました。

マクロの記録は試していないのです、今から試してみます。
5ページ印刷されてしまうことに悩んでしまっていました。

ユーザ名の取得は、おっしゃる通り”デスクトップ(のパス)”ですが、
PCが変わっても使えるようにしたいためです。

「御見積書」シートのみを「名前を付けて保存」ではなく、
ブック全体を保存したいです。
そのフォームの別シートに「請求書」「納品書」などがあり、
「御見積書」シートの入力内容が反映される仕様になっているからです。
(フォームは別の人が作り、社内全体で使用していて
請求書など他のシートは営業が使います。)

まだまだ勉強不足で理解が足りず申し訳ありません。
よろしくお願いいたします。

(勉強不足) 2019/10/16(水) 09:42


■1
>「御見積書」シートのN5セルは【1】ですが、5ページ印刷されてしまいました。
ごめんなさい。見るべきはN2セルでしたね。「御見積書」シートのN2セルも【1】ですか?

■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.