[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『シートを新規ブックへコピペして今日の日付で保存する』(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.