家計簿アプリ

ExcelVBAで家計簿アプリを作ろう その9-2

家計簿アプリ
スポンサーリンク

家計簿アプリを、より使いやすく自分仕様に改造していきましょう!

以前の投稿で、家計簿アプリとして最低限の機能を持たせることができました。
(その6までをご確認いただいていない方は、まずは下記まとめをご確認ください。)

ただ、これは本当に最低限の機能しかなく、勘定科目も『固定費』と『変動費』しかないので、
各家庭に合った勘定科目を自由に追加できるように
このマクロのデコレーションをしていく必要があります。

前回からダウンロードしてきた明細書を基に、おおよそでリストに記入できるようにしていくマクロの作成に取り掛かっています。

前回はマクロ作成の大まかな流れと事前準備リストの作成を説明していきました。
今回は実際にダウンロードした明細書をマクロから開き、所定のExcelシートに貼り付けていく動作をやっていきましょう。

今回のようなマクロからファイルを開く・操作するといった手順は、会社での業務用マクロでは頻繁に使う内容になっていきますので、これができるだけで仕事での業務効率も格段に上げることができると思います。
しっかり練習していきましょう。

【本記事の目標】

ファイルの読み込み・貼り付けの方法を知ろう

簡単なイメージは下記記事に記載していますので、イメージづくりや今回以降の流れの参考に。
また、前回までの記事については下記をご確認ください。



ダウンロードしたファイルのデータを取り出す

ファイルを開く

それでは実際にExcelマクロを使って、ダウンロードしたファイル(Excelファイル、CSVファイル)を開いてみましょう。

ExcelファイルやCSVファイルを開くときは非常に簡単で

 Workbooks.Open Filename:=(開くファイルのフルパス)

このコマンドだけで完成です。
たったこれだけ?と思われるかもしれませんが、『ファイルを開く』という行為だけでいくと、これだけのコマンドでできてしまうのです。

ただこのコマンドは本当にただ開くだけなので、開くファイルのフルパスは、
事前に記入しておくか、別の方法で取得してあげないといけないです。

一番イメージしやすいのは、下記のような『ファイルを開く』というダイアログ(ウィンドウ)を立ち上げて、そこで選択したファイルのフルパスを取得する方法です。

このダイアログは、下記コマンドで立ち上げることができます。

 Application.GetOpenFilename

このコマンドでダイアログを立ち上げると、戻り値として選択したファイルのフルパスが返ってきます。
なので、下記のように一旦適当な変数にこのフルパスを代入して、Workbook.Openのコマンドで開いてあげることで、任意のファイルを開くことができます。

 Dim FileName1 as string
 FileName1 = Application.GetOpenFilename
 Workbooks.Open Filename:=FileName1

GetOpenFilenameでは、開くファイル形式の指定や、ダイアログに表示するタイトルの名前も指定することができます。
また、このダイアログを立ち上げて、複数のファイルを一度に選択できるようにすることも可能です。
ただし、複数ファイルを選択した場合、戻り値はただの文字列ではなく、配列データとして返ってきます

配列はプログラミングをしていくうえで一番つまづきやすい難所であり、これが理解できるかどうかによって、できることの幅が大きく変わってしまいます。

また別の機会にこの配列については重点的に説明していきたいと思います。

ただ、ここまでのコマンドは本当にただファイルを開くだけです。
問題はここから、そのファイルをどうやって操作するのか、が重要になってきます。

ここで重要になってくるのが、この方法でファイルを開いたとき、
 開いたファイルがアクティブ状態になる
という点です。

 



開いたファイルを操作していく

アクティブというのは、絶賛今操作しているファイルやシートのことを指します。
Excelファイルを複数開いていたとしても、文字を入力したとき、
 どれか1つのファイルの
 どれか1つのシートの
 どれか1つのセル

に文字が記入されていきますよね。
(全てのファイルに入力されるなんてことは起こらないですよね)

この時、そのファイル・シート・セルがアクティブ状態になっているのです。

別ファイルを開いたとき、もともと操作していたファイルではなく、
新しく開いたファイルがアクティブ状態に切り替わります。

なので、新しく開いたファイルを操作するときは
 Activeworkbook.sheet(“シート名”).~
 Activesheet.Range(“A1”).~
といった形で操作していけばいいのです。

このアクティブ状態の考え方は、過去にも説明していますので、そちらもご参考ください。

上記の方法で、所定のファイルを開いて、それを操作できるようになりました。
(具体的な操作はこれから指定していきますが)

ただ、新しく開いたファイルはアクティブ状態になっているので操作ができますが、
もともと操作していたファイルを編集したい、(例えば、新しく開いたファイルの所定の場所のデータを、今操作しているファイルにコピーする)となった場合どうすればいいのでしょうか。


マクロが記録されているファイル自体は、
Thisworkbookというコマンドで操作・編集することが可能です。

これらを使えば、下記のように、マクロから新しく開いたファイルと、
もともとマクロが登録されていたファイルの両方を操作することができます。

例えば、新しく開いたファイルのsheet1シートのA1~C16の場所のデータをコピーして、もともと開いていたファイルのsheet1シートのAA1~AC16に貼り付ける、といった操作をする場合、下記のようなコマンドになります。

 Activeworkbook.sheet(“sheet1”).Range(“A1:C16”).Copy
 Thisworkbook.sheet(“sheet1”).Range(“AA1:AC16”).Pastespecial

上記で使った Copy と Pastespecial というコマンドは、普段もよく使うであろう【コピー & ペースト】のコマンドです。

今回のように1セル以上の範囲をコピーするときにも使えますし、
1つのセルだけや、図形のコピー等でも使うことができます。

また、セルをコピーする場合、コピーすると下記のようにコピーしたいセルが点線で囲われます。

この状態で、貼り付けたいセルを選択してペーストすることで、コピー&ペーストが可能です。

このコピー状態(点線状態)は解除しない限り、何度でもペーストが可能です。
繰り返しペーストしたい場合は便利ですが、ずっとこのままだと、ペーストしたい場所じゃない場所に誤ってペーストしてしまう恐れがあります。

通常のExcel作業中の場合だと、【Esc】ボタンをクリックすることでコピー状態を解除することができます。

じゃあ、マクロで自動で動かしているときはどうすればいいのか。
この時に使うのが
 Application.CutCopyMode = False
というコマンドです。

この CutCopyMode というのがコピー状態(点線状態)のことです。
これを false にする、つまり無しにするので、コピー状態を解除することができるのです。

このコマンドは、【コピー&ペースト】をマクロで実施させる際には、
必要なコピーが終わった後には必ず入れておいた方が誤動作を減らすことができます。

 



開いたファイルを閉じる

ファイルを開いて、ファイルを操作し終わったら、最後にそのファイルを閉じる必要がありますよね。
ファイルを開くときも非常に簡単なコマンドだけでしたが、閉じるときも非常に単純で、

 Activeworkbook.Close

これだけです。簡単ですね。

ただファイルを閉じる場合は、もしファイルが編集されていたら
「ファイルを保存しますか?」というのを聞いてきます。
このウィンドウはマクロで自動操作中でも出てきて、その瞬間マクロを止めてしまいます。
なので、自動化したい場合はこのウィンドウが出ないように、

  • ファイルを保存したい場合は事前に上書き保存しておく
  • 保存したくない場合は、このウィンドウが一時的に出てこないようにする

といったことを事前にしておく必要があります。

閉じる前に上書き保存する

開いたファイルを上書き保存する場合も非常に単純で、

 Activeworkbook.Save

これだけでOKです。
この直後に、下記のようにファイルを閉じる操作をすれば、保存後にファイルの編集はされていないはずなので、「ファイルを保存しますか?」のウィンドウは出てこなくなります。

 Activeworkbook.Save
 Activeworkbook.Close

保存せずに閉じる

ファイルを保存せずに閉じる場合は、「ファイルを保存しますか?」のウィンドウを一時的に出さなくすることで、保存せずに閉じることができます。
このウィンドウは誤操作を抑制するための警告表示ですので、下記方法で一時的に止めることができます。

 Application.DisplayAlerts = False

ただこのコマンドを使った場合、「ファイルを保存しますか?」だけでなく、そのほかの全ての警告表示が一切出なくなってしまいます。
それはさすがに危険なので、このコマンドで一時的に止めてファイルを閉じた後は、必ず下記コマンドで警告表示を復帰させておきましょう。

 Application.DisplayAlerts = True

ファイルを閉じるタイミングだけにするのであれば、下記のように記載しておけばOKです。

 Application.DisplayAlerts = False
 ActiveWorkbook.Close
 Application.DisplayAlerts = True

 



データを貼り付ける先を準備する

ここまでの手順で、

  1. ファイルを開いて
  2. ファイルを操作して
  3. そのファイルを閉じる

といった操作ができるようになりました。
じゃあ、実際にこの操作で開いたファイルのデータをどこに貼り付けていきましょうか?
その貼り付けるシートを準備しておきましょう。

単純にデータを貼り付けることができればOKなのですが、後でそのデータから勘定科目を割り当てる作業をしていくので、読みだすファイルごと(カード明細や銀行明細ごと)にシートを準備しておいた方が、後々操作がしやすくなります。

今回は下記のようなカード明細サンプルと銀行明細サンプルを使っていこうと思いますので、『カード明細用』と『銀行明細用』の2つのシートを準備しておきました。

このシートは現状では白紙です。
ここにそれぞれの明細サンプルを貼り付けるマクロを作ってみましょう。

 



準備したシートに貼り付けるマクロを作る

これまでの内容を踏まえて実際にマクロを作ってみましょう。
分かりやすくするため、今回作るマクロは新しく「FileDataCopy」というモジュールを作り、そこに記載していきます。

まずはカード明細のデータを貼り付けるマクロを作ります。

Option Explicit

Sub CardMeisaiCopy()
'カード明細サンプルを貼り付けるマクロ

Dim FileName1 As String

'ファイルを開く
FileName1 = Application.GetOpenFilename
Workbooks.Open Filename:=FileName1

'ファイルのデータを所定のシートに貼り付ける
ActiveWorkbook.Sheets(1).Range("A:C").Copy
ThisWorkbook.Sheets("カード明細用").Range("A:C").PasteSpecial
Application.CutCopyMode = False

'ファイルを閉じる
Application.DisplayAlerts = False
ActiveWorkbook.Close
Application.DisplayAlerts = True

End Sub

意外と単純ですよね。

同じ流れで、銀行明細用の方も作っちゃいましょう。

Sub BankMeisaiCopy()
'銀行明細サンプルを貼り付けるマクロ

Dim FileName1 As String

'ファイルを開く
FileName1 = Application.GetOpenFilename
Workbooks.Open Filename:=FileName1

'ファイルのデータを所定のシートに貼り付ける
ActiveWorkbook.Sheets(1).Range("A:D").Copy
ThisWorkbook.Sheets("銀行明細用").Range("A:C").PasteSpecial
Application.CutCopyMode = False

'ファイルを閉じる
Application.DisplayAlerts = False
ActiveWorkbook.Close
Application.DisplayAlerts = True

End Sub

ファイル操作と聞くと、いよいよプログラミングっぽい感じになってきますが、
実際にマクロを書くと意外とあっさりしてますよね。
実はプログラミングって、やってみると意外とあっさりしている場合が多いです。

初見だとものすごく複雑そうに見えますが、1つずつ細かく分解してみていくと、
あっさりしたコマンドが積み重なっているだけなので、
時間はかかるかもしれませんが、1つずつ解読していけば、意外と簡単に理解できる場合もあります。
(そうじゃないぐらい複雑な場合もありますが。。。)

こんな感じで、少しづつ積み重ねていきましょう!


とりあえずこれで、ファイルを開いて必要なデータを貼り付けることができましたので、
次回はこのデータを編集して、勘定科目を割り振ったり、入力用のシートに転記する部分を作っていきましょう。

次の記事へ

コメント

タイトルとURLをコピーしました