会計ソフトに CSVデータをインポートする際にエクセルのブックで加工することが多いんですが、この最終的に作成したデータはひとつのCSVデータとして保存しないといけません。
この部分、そういえば今まで手作業で行っていましたので今回マクロで自動化してみます。
具体的には保存先をユーザーに指定させ、データを保存する日時をあらかじめファイル名に記載してCSV形式で保存します。
会計ソフトへのインポートにはCSV形式でのデータが必要なことが多い。
顧問先のインターネットバンキングのデータを会計ソフトへインポートする作業をする際に自分の場合は加工用のExcelブックに複数のシートを使用してインターネットバンキングのデータを加工し、会計ソフトへインポートするためのCSVデータを作成しています。
で、この作業が終わったら会計ソフトへインポートするためのデータがあるシートを別途CSVデータとして保存する必要があります。
今までは該当のシートをコピーしてデータ貼り付けて。。。ってやってましたが
ボタンを押すとCSVデータにしたいシートのみをCSVデータとして保存ができるようにマクロを作ってみました。
これ自体の処理は難しくないのでひとつ手間を加えて
保存するCSVのファイル名に保存する際の日時を最初から表示するようにしてみます。
ということで今回のコードはこんな感じになりました↓
Sub save_csv()
'■シートを別のブックにコピーしてダイアログボックスにて保存先を指定した上でCSV形式で保存するマクロ
'■変数宣言
Dim filename As Variant
'■コピーするシートを指定する
Sheets(1).Copy
'■デフォルトで「インポートデータ(保存時の日時)」をファイル名に設定
filename = Application.GetSaveAsFilename(InitialFileName:="インポートデータ" & Format(Now, "yyyymmddhhmmss"))
'■処理実行部分
If filename <> False Then
ActiveWorkbook.SaveAs filename:=filename & "csv", FileFormat:=xlCSV,Local:=true
ActiveWorkbook.Close SaveChanges:=False
MsgBox "保存しました、会計ソフトへインポートしてください。"
Else
MsgBox "キャンセルします。CSVデータは保存されていません。"
ActiveWorkbook.Close SaveChanges:=False
End If
End Sub
シートのコピーをマクロ記録してみる。
まずはマクロの記録で、自分がいつもやっているCSVデータへの保存方法を試してみます。
コピーしたい(CSV形式で保存したい)シートで右クリックします。
表示された画面上に「移動またはコピー(M)」という選択肢があるのでそれをクリック。
こんな画面になると思いますので、「移動先ブック名(I)」の右側のドロップダウンリストをクリックします。
下記の画面になりましたら(新しいブック)を選択します。
最後に画面左下の「コピーを作成する(C)」にチェックを入れてOKボタンをクリック。
これが自分がいつもやっているコピーのやりかたになります。
で、ここまでの作業を「マクロの記録」で記録するとこんな感じに記録されます。
たったこれだけのコードです。ということはいままでやってきた動作はこの2行のコードで再現できることになります。
実際のところはSheets(“test”).Selectは不要なのでSheets(“test”).Copyの1行でいけます。
名前を付けて保存ダイアログボックスを表示させるには「Application.GetSaveAsFilename」
あらかじめCSVデータを保存する先が決まっているのであればその場所を指定すればよいですが、そういう時ばかりでもないと思いますので、今回はCSVデータの保存先をユーザーに指定させようと思います。
保存先を指定させるには下記のような画面から保存先を選択するのが一般的だと思います。
この画面(この記事では「名前を使けて保存」ダイアログボックスということとします)をマクロで表示させるには「Application.GetSaveAsFilename」を使用するとよいようです。
なのでこれを使うと上記の画面を表示させることができ、ユーザーに保存先を指定させることができます。
指定させる「だけ」なので実際に「保存」はされないので注意が必要です。これに関してはMicrosoftのページに下記の記載があります。
Application.GetSaveAsFilename メソッド
https://docs.microsoft.com/ja-jp/office/vba/api/excel.application.getsaveasfilename
このメソッドは、ユーザーによって選択、または入力されたファイルの名前とパス名を返します。 引数 MultiSelect が True の場合は、選択されたファイルの名前の配列が返されます。 入力が取り消された場合には False が返されます。
このメソッドを実行することによって、カレント ドライブやカレント フォルダーが変更される可能性があります。
InitialFilename を拡張子で使用し、フィルターを適用する場合、この拡張子はフィルター拡張子と一致する必要があります。一致しない場合、ダイアログ ボックスに表示される有効な InitialFilename は空の文字列になります。
自分もよくわかっていないんですが、Application.GetSaveAsFilenameでできることは「保存先までのパス+入力されたファイルの名前」を取得するだけのようです。
なので、Application.GetSaveAsFilenameで取得した「パス名+ファイル名」に次のActiveWorkbook.SaveAsで拡張子を設定してファイルを保存していくことにしました。
format関数を使ってファイル保存時の時刻をyyyymmddhhmmss形式にする。
今回、CSV形式で保存する際に、あらかじめファイル名を入力させた状態にするように設定してみました。下記画像の赤枠部分がそれになります。
インポートデータという文言の後にファイルを保存した日時を記載しています。
このようにあらかじめファイル名を入力させるにはApplication.GetSaveAsFilenameのInitialFileNameという引数?を設定すればできるようになります。
この部分ですね↓
また、保存した日時をファイル名に記載するためにformat関数を使用してファイル保存時の時間をyyyymmddhhmmss形式にしています。
この16行目の後半部分ですね↓
このあたりの詳しい解説はネットに優良な記事がたくさんありますのでそちらを参考にしたほうがいいです。
ブックを保存するにはActiveWorkbook.SaveAsを使う。
ブックを保存するにはActiveWorkbook.SaveAs~を使用するとできます。
この部分です↓
今回はCSV形式で保存するので引数?FileFormatにxlCSVを指定しています。
引数Localはtrueにしていないと、日付のデータをCSV保存した際に表示形式が崩れる(2021/5/30と表示したいのになぜか5/30/2021と表示される)現象が生じたので設定しています。
理由はわかりませんが、引数Localをtrueに設定するとなぜか解消されました。
また、「名前を使けて保存」ダイアログボックスでキャンセルされた場合には戻り値としてfalseがかえってくるのでこの部分に関してifステートメントで条件を判定させています。
CSV形式での保存が終わった場合には開いていたExcelブックを閉じてマクロが終了します。
まとめ
マクロを使って自分的、CSV形式での保存方法を記事にしました。
このやり方だと、CSV形式で保存する際のこんな確認メッセージ
とかこんなメッセージなど
が表示されないので、マクロのコードで上記メッセージの制御をする必要がない気がするのでこのやり方もありかなと思っています。
【本日の近況報告】
今使っているスマートフォンが買い換えてから2年半を経過しようとしています。
使用感に問題はないのですが、いかんせんバッテリーの持ちがすごく悪くなっています。
で、買い換えるスマホを以前からずっと検討していたのですが今一つピンとくるものがなく(値段的にも性能的にも)今までずっと見送ってきていました。
iPhoneのSE2は値段的にも性能的にはすごく魅力的で試してみたかったのですが、本体のサイズが小さいのが自分の中で気になっていて購入への踏ん切りがつきませんでした。
ところが最近モトローラというところから Moto G 100というスマホが発売されたことを知りまして、このスマホが自分の求めていた感じにスゴくフィットしそうです。
値段的にもそこまで高額ではなく、性能もそこそこいい感じなのでこれに機種変更しようと考えています。
【本日の1曲】
裸の王様 / JAGATARA
聴いた瞬間、「ヘアカット・ワン・ハンドレッド」みたいでめっちゃくちゃカッコイイなとなりました。ニューウェイヴとファンクとロックがいい感じにブレンドされているように思います。
これは踊れるナンバーです。痺れる。
この曲が収録されているアルバムは自分が3歳くらいの時にリリースされていたようです。
30年以上前に日本でこんなアルバムがリリースされていたとは。。。