[[20191125164647]] 『シートを新規ブックへコピペして今日の日付で保存』(koooo) ページの最後に飛ぶ

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

 

『シートを新規ブックへコピペして今日の日付で保存する』(koooo)

マクロで今日の日付のシートに集計結果がでるようになってます
そのシートを新規ブックにコピーしてファイル名を今日の日付で
デスクトップに保存できるようにしたいです。

これだと集計結果がない日は別のシートがコピーされました
マクロはほとんど知識がありません
ご指導いただけますでしょうか

Sub シートをコピー()

ActiveSheet.Copy

End Sub

< 使用 Excel:Excel2019、使用 OS:Windows10 >


 >そのシートを新規ブックにコピーしてファイル名を今日の日付で
 >デスクトップに保存できるようにしたいです。

 まずはマクロの自動記録で、上記の作業を記録して、できたコードをたたき台にしてみてはいかがでしょうか?

(渡辺ひかる) 2019/11/25(月) 17:23


ファイルを保存する部分は、渡辺ひかるさんのアドバイスどおり、マクロの記録でたたき台を作るとして、
>マクロで今日の日付のシートに集計結果がでる
ということですから、
 ActiveSheet.Copy

ではなく、

 (本日の日付のシート).Copy

になるように修正すればよいとおもいます。

(もこな2 ) 2019/11/25(月) 18:41


自動記録してみました

でもデスクトップのパスは人によって違います
誰でも使えるようにしたいです

ファイル名を今日の日付にするにはどうしたらいいのですか

ChDir "C:\Users\○○\Desktop"

    ActiveWorkbook.SaveAs Filename:= _
        "C:\Users\○○\Desktop\ファイル名.xlsx", FileFormat:= _
        xlOpenXMLWorkbook, CreateBackup:=False
    Application.Goto Reference:="Macro1

後、(本日の日付のシート).Copy
Format(Now, "yyyymmdd").Copyとしたらエラーになりました

どこをどうしたらいいですか
マクロは他の人が作ったものなので全然わかりません

(koooo) 2019/11/26(火) 09:21


 こんな感じでしょうか?(^^)
 ↓参考にしたサイト(デスクトップのパスを取得するところ)
http://officetanaka.net/excel/vba/tips/tips107.htm

 Sub test1()

    Dim desktoppath As String
    Dim wsh As Object: Set wsh = CreateObject("wscript.shell")

    desktoppath = wsh.specialfolders("desktop") & "\"
    Set wsh = Nothing

    ThisWorkbook.Sheets(Format(Date, "yyyymmdd")).Copy

    ActiveWorkbook.SaveAs Filename:=desktoppath & Format(Date, "yyyymmdd") & ".xlsx", _
                          FileFormat:=xlOpenXMLWorkbook

End Sub

(虎) 2019/11/26(火) 11:07


「本日の日付のシートがない場合に何もしない」とするのに
時間がかかってしまいました。

(虎)さん

無事にできました。
ありがとうございます。
(koooo) 2019/11/29(金) 16:06


ちまちま書きためていたら、かぶってしまった&投稿するのをすっかり忘れていたので遅きに失したようですが、まぁ何かの参考に。

■1
>デスクトップのパスは人によって違います
デスクトップのようなフォルダは「特殊フォルダ」と呼ばれます。
これを取得するには、ExcelVBAの機能ではなく、Windowsの機能を呼び出して使う方法があります。
http://officetanaka.net/excel/vba/tips/tips107.htm  ←虎さんと同じところです
http://vbaexcel.seesaa.net/article/148413570.html

なので、例えばデスクトップのパスを表示させるなら、↓みたいな感じでOKです。

    Sub 実験1()
        Dim ふぉるだぱす As String

        ふぉるだぱす = CreateObject("WScript.Shell").SpecialFolders("Desktop")
        MsgBox "デスクトップのフルパスは↓のとおりです。" & vbCrLf & "  " & ふぉるだぱす
    End Sub

■2
>ファイル名を今日の日付にするにはどうしたらいいのですか
そのまえに、マクロの記録で得られたコードから、ブックを保存する命令に関する部分だけを抜き出して整理するとこんな感じになります。

    Sub 整理()
        ActiveWorkbook.SaveAs _
            Filename:="C:\Users\○○\Desktop\ファイル名.xlsx", _
            FileFormat:=xlOpenXMLWorkbook
    End Sub

これを翻訳すると

    整理という名前のプログラム
        アクティブブック を 名前を付けて保存
            ファイルパスは "C:\Users\○○\Desktop\ファイル名.xlsx"
            保存形式は xlOpenXMLWorkbook(xlsx形式)
    プログラムはここまで終了

となりますから、「ファイル名を今日の日付にする」には、"ファイル名"の部分が変わってくれればよいことがわかりますよね?

■3
したがって、仰ることを実現するには、

 (1)今日の日付を調べる
 (2)調べた日付を適切な文字列に加工する
 (3)Filename:=【デスクトップのパス】【\】【(2)の文字列】 となるようにする

という手順が必要になります。

このうち(1)の部分は、Now関数やDate関数を使うと調べることができます。
例えば、こんな感じ。

    Sub 実験2()
        MsgBox Now
    End Sub
    '---------------
    Sub 実験3()
        MsgBox Date
    End Sub

そして、(1)で取得したものがそのままファイル名に使えればよいのですが、そうもいかないとおもいますから、(2)としてFormat関数で適切な形に加工します。
Format関数の説明は↓を参照
https://www.sejuku.net/blog/33422
http://officetanaka.net/excel/vba/tips/tips110.htm

(3)は、■1と(2)を組み合わせてやればよいですね。
例えばこんな感じ。

    Sub 実験4()
        Dim ふぉるだぱす As String
        Dim ふぁいる名 As String

        ふぉるだぱす = CreateObject("wscript.shell").SpecialFolders("Desktop")
        ふぁいる名 = Format(Date, "yyyy_mmdd") & ".xlsx"

        MsgBox ふぉるだぱす & "\" & ふぁいる名

    End Sub

■4
ここで、元々の質問に目を向けると
>マクロで今日の日付のシートに集計結果がでるようになってます
>集計結果がない日は別のシートがコピーされました
とのことですから、【今日の日付のシート】が無いときは処理しちゃダメってことですから、シートをコピーするという処理の前段として、そもそも本日のシートがあるか判定する必要がありませんか?

方法はいくつかあるとおもいますが、オブジェクトがぼんやり分かっていれば、一旦(今日の日付)シートを変数にセットしてみて、セットされてなければ処理しないという方法があります。

■5
以上を踏まえて、コードにしてみるとこんな感じ

 ※1 拡張子はあえて指定してないです。(エクセル君にお任せした方が間違いがなくて良いとおもうので)

    Sub 本日のシートをコピー()
        Stop  '←ブレークポイントのかわり

        Dim 本日 As String
        Dim ふぉるだぱす As String
        Dim SH As Worksheet

        本日 = Format(Date, "yyyy_mmdd")
        ふぉるだぱす = CreateObject("wscript.shell").SpecialFolders("Desktop")

        '▼エラーが発生しても止まらないようにしておいてから、変数SHにセットしてみる
        On Error Resume Next
        Set SH = Worksheets(本日)
        On Error GoTo 0

        '▼SHに本日のシートが格納されているときだけ処理
        If Not SH Is Nothing Then
            SH.Copy

            '▼シートをコピーしてできたブックは、必ずブックの集まり(ブックコレクション)の最後にある
            With Workbooks(Workbooks.Count)
                .SaveAs _
                    Filename:=ふぉるだぱす & "\" & .Worksheets(1).Name, _
                    FileFormat:=xlOpenXMLWorkbook
                .Close
            End With
        Else
            MsgBox 本日 & " シートが無いため処理を中止します"

        End If
    End Sub

(もこな2) 2019/11/30(土) 07:40


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.