はもちくわ

コードについて自分なりの解釈を書いてます。

【Excel】を使った書類管理(その③:VBAでExcelファイルを操作)

その②を書いてからかなり時間が空いてしまいました。

今回はExcelファイル操作について書いていきます。

題材にしている書類管理のためだけではなく、VBAでシステム的なものを作り進めていくと、他のファイル操作が必要になりがちですよね。

 

まず、ファイル操作に必須の「パス名」についてです。
と、言っても専門的なことは説明できない(^^;)ので私の持っているイメージで簡単に説明します。正確に詳しく勉強したい方は、ちゃんとした本やページで勉強してください(笑)

「パス名」という言葉自体はよく出てきますので、見たり聞いたりしたことがあると思います。簡単に言えば、PC内の「住所」みたいなものですね。けれど、実際の住所のように「この先の交番をみて左側に見える赤い屋根の・・・」とか「あの郵便局を曲がって見える・・・」などのように曖昧な表現で伝わることはありません。PC内は広くて真っ暗で、目印は何も無いと思ってください(笑)。

私が思ってるイメージはこんなです。

f:id:hamochikuwa440:20210804223725j:plain

PCという建物にドライブというフロア(階)があります。フロア(ドライブ)にはフォルダという同じ形のタンスがズラッと並んでいまして、それぞれのタンス(フォルダ)と引き出しに小さく名前が書いてある・・・というイメージです。

 

さらにPCはルールの範囲外のことはできません。例えばExcelのセルに「1+1=」と入れると数式ではなく、文字列として判断されますね。なので、ルールの範囲で指示したことを正確に実行するのには長けてますが、こっちの意図をくんで動くみたいなことは不得意です。そのため、PCには正確にすべてわかるようパス名を教えてあげることが必要です。

うまくPCが動かなくて、故障とか不具合とかを疑って、結局自分の指示ややり方が間違っていることは「あるある」ですよね^^;

 

それでは今回説明に使う、ファイルの格納イメージ例で、もう少しパス名について説明していきます。今回の書類管理のしくみは次のようなイメージで説明していきます。この形でご想像ください。

f:id:hamochikuwa440:20210804224517p:plain

この例ですと「契約書管理システム」というExcelマクロ有効ファイルのパス名は、

C:¥ユーザー¥契約書管理¥契約書管理システム.xlsm

となります。

最初のC:はPCのドライブを表します。

そして半角¥ マークは住所の「県」とか「市」とか「町」みたいな区切りです。
全部同じマークで区切りながらフォルダの階層を降りていけばいいので、現実社会の住所より単純ですね。
・・・と言いたいところですが、本当はけっこう厄介モノなんです!
実はこの区切り、OSやバージョンによって違うみたいなんです。「規格そろえてよ〜っ!!」と叫んでも直りません。そういうものだと思いましょう。なので、Windowsの方は半角¥もしくは半角\が区切りと思ってください。急に\ が出てきましたが、扱っているシステムによって見え方が違うだけで¥\も同じと考えておきましょう。バックスラッシュは入力が面倒ですから使うのは円マークでよいと思います。
Macの方は、区切りにApplication.PathSeparator を使う事をオススメします。Macの中だけでもバージョンによって違うことがあるからです。使い方としては、このまま区切り文字列の代わりにコードへ書けば、システムに合わせた区切りとなります。ただ、このままですと長いので区切りが多いと大変です。先に変数に代入して使うといいです。(過去の記事でも触れてます。)もちろんWindowsの方もこの方法を使えます。OSまたぎそうなら必須です。(OSまたぎはオススメしませんが…)

hamo440.hatenablog.com

 

さて、ここまでなんとなく伝わりましたでしょうか?

「契約書管理システム」というExcelファイルから別のファイルを操作するためには、操作するファイルのパス名を正確にすべて書かないといけないと言う事ですね。
ということは「直接パス名をコードに正確に書いておけばいいだけか、、、」と感じましたか?
ここでちょっと想像して欲しいのですが、会社でこのシステムを使うとして、PCやフォルダを社内で共有している場合です。どうでしょうか?はたして「契約書管理」フォルダはずっと「ユーザー」フォルダの中にいるでしょうか?そして「契約書管理」フォルダの名前を変更されませんでしょうか?
また、今までの経験上、結構多くの方が軽く考えているなと個人的に感じていることがあります。それはPC自体が変わることです。これはすごい重大なことですよ!だって住所で言えば、「国が変わる」ぐらいのことですからっ!…言い過ぎか^^;引っ越しぐらいのことですかね。

それなら「一切変更するな!!」とルールを決め、会社PCのディスプレイに付箋をずっとつけておけば解決、、、、うん、やっぱり無理ですよね(笑)

禁止しても実行できる状態なら「やるな!」と言うだけ
無駄無駄無駄無駄〜っ!!…_| ̄|○

 

そこでっ!こんなに便利な命令がありますっ!!
それは、Thisworkbook.Pathです。

これは「いま使っているExcelファイルのパス名を教えてください」という命令です。(前回記事の「その②」にサンプルあります。)

今回の例でこの命令を使うと

C:¥ユーザー¥契約書管理¥契約書管理システム.xlsm

この赤い四角までの値が得られます。命令文そのままの意味で覚えやすいですよね。
これですべては解決しませんが、とりあえずシステムファイルが入っているフォルダが移動されたり、名前が変えられたり、PCが変わったりしても大丈夫になりました!同じフォルダ内の名前だけ管理すればいいだけですね。これでディスプレイの付箋がひとつ減りました(笑)
私はこの命令知ってから随分ファイル管理が楽になりました。

 

前置き長くてすいません。パス名は意識しないと何するにしてもプログラムがうまく動きませんので書かせていただきました。なんやかんやと書きましたが、結局は、Thisworkbook.Pathを使っておけば、大体OKということです(笑)。あと、私たまにやってしまいますが、Thisworkbook.Path以降をつなぐ時、¥を忘れてしまうと別住所になってしまいます!郵便局の人がPCの中にいて、多分書き間違いかな?なんて判断して配達してくれませんよ(笑)気をつけましょう。
さあ、やっと操作するためのコードの説明に移ることにします。

 

今回の例で操作する対象ファイルは、先のイメージの「DataBase」フォルダに入っている「Staff.xlsx」とします。
また、FileSystemObject(FSO)はMacで使えませんので紹介しません。というか私自身使ったことありません。もし、Windowsだけの環境でしたら便利そうな機能なので勉強してもいいのではないでしょうか?確か使う前に「開発タグを表示」させるために行うような簡単な設定が必要だった気がします。

それでは操作項目ごとに下に書いていきます。内容は項目をクリックして表示してください。驚くほど長文になってしまったので、アコーディオン表示にしてます。

 

1. ファイルを開く(データを見るだけ)

Workbooks.Open Filename:=ThisWorkbook.Path & "¥DataBase¥Staff.xlsx", _
               ReadOnly:=True, _
               UpdateLinks:=False

これを分解して説明すると、

Workbooks.open 「指定条件でExcelファイルを開きなさい」という命令。

Filename:=イコールのあとにパス名を入れてファイルを指定。

ThisWorkbook.Pathさっき説明した今のファイルのパス名。

& 文字の足し算(結合)に使う記号です。半角スペースをつけるのを忘れずに。

"¥DataBase¥Staff.xlsx"今のファイル以降のパス名を記入します。
文字列はダブルクォーテーションでくくります。これはVBAのルール。

この直接入力の指定ですが、長期間のシステム管理を考えると少し工夫をしたほうがよいです。ここはコードの説明ということで、ダイレクトに記入してますが、下のブロックで工夫について書いておきます。ひとまずコードだけ読まれる方は飛ばして読んでください。

◆直接入力指定の工夫◆
コードに直接記入して指定すれば、手っ取り早く確実にプログラムが動きます。
ですが、システム完成後にフォルダの名前を変えることになった時、コード全体が長くて変更箇所も複数になると、変更箇所すべてを探して変更するのは、置換を使ったとしても大変になります。なので、変数を使って、コードの変更箇所をなるべく少なく(できるなら1箇所に)する等、コードの書き方の工夫が必要です。またコードの変更を前提に運用してしまうと、コード作成者が管理し続けなければならなくなるかもしれません。変更修正をコード作成者以外でも簡単にできる工夫として、私が使ったことのある2つの方法をご紹介します。(おまけつき)
1.ワークシートで設定管理する
使える人が多いワークシートを利用します。システムを動かす設定条件データ一覧をワークシートに作っておき、変更があった場合はシートのデータを変更する方法です。コードはシートの名前データを参照して動くように書きます。メンテナンスが必要な箇所はコードから出し、修正が簡単にできるようにしておくわけです。シートの図形やテキストボックスを使って使用説明書をつくるなどもできます。
しかし、うっかりデータを変更してしまった!みたいなイージーミスによってデータが崩れる事が心配されますが、設定シートを非表示にするなど工夫をすれば、少しは避けれるかと思います。
2.詳細設定変更の仕組みをいれておく
フォルダなどの名前は変更する前提で先に変更する仕組みを準備しておく方法です。変更専用の入力フォームや仕組みをを作っておき、メンテナンスもシステムの一貫として考えるというわけです。初期設定値をCSVで持っているでもいいですし、別ファイルにしてもいいです。製作者が作りやすい方法で良いと思います。結果的に1と同じ管理方法にするにしても、システムに組み入れる段階で、事前に起こりうる不具合を予測し設計できますし、入力補助や規制を入れて障害を回避させることもできます。
【おまけ1:未検証】フォルダ側でロックをかける
これはVBAではありません。変更させないという観点からフォルダ側の権限設定をします。名前変更や移動をさせないようにロックをかけるわけです。ただ変更権限があるVBAから簡単に操作されたり、PC自体を共有している場合、アクセス権限自体に意味がない可能性があるかもしれまえん。使う環境によって選べる方法かなと思います。この方法は私採用したこと無く、使ってみようかなと考えていただけなので使えるか自信ないです。無責任ですいません。アクセス権限に詳しい人はご検討ください(笑)
【おまけ2:ボツ】フォルダかどうかVBAで判定させる
これは実際に私がつくって、すぐにボツになった方法です。名前に関係なくフォルダかファイルかを判定(GetAttr(パス名))してフォルダなら実行する方法です。予想はつくと思いますが、操作するフォルダが、同じ階層に1つだけしか無い状態なら便利に使えますが、会社で複数人がPCを触る環境下ですと知らない間にフォルダが増えて、エラーが出たためボツにしました。

 

説明の続きです。

,カンマはそれぞれの条件を区切るのに使います。

_ アンダーバーは「改行後に続きがあります」マーク。VBAは1行で命令を書くルールがあるので、命令文を改行したいときに使います。半角スペースを前につけて改行です。
これはコードを見やすくするための処理ですので、単語が途中にならなければどこでも使えますし、使わずに1行で書いても大丈夫です。

ReadOnly:=True読み取り専用で開きなさいという命令。イコールのあとをFalseにするか、カンマ以降すべてを省略すると通常モードで開きます。

UpdateLinks:=Falseリンク無効で開きなさいという命令。イコールのあとをTrue、もしくはカンマ以降すべてを省略で通常モードで開きます。

モードの指定をなぜするのかはまた下のブロックで書きます。とりあえずコードだけという方は飛ばして読んでください。

◆「読み取り専用」にする理由
システムでファイルの内容を確認しようとした際に、目的のファイルが他の人により先に開かれている、もしくは自分と同時に開かれる可能性があります。複数人が同時に扱うシステムの場合はより高い確率で起こります。そうなった場合、みなさんもご経験があるかと思いますが、読み取り専用で開きますか?的なウインドウが出ますよね。こういったExcelから通知が来たものを拒まずにyesで進んでいけばエラーになりにくいのですが、キャンセルするなど別のことをすると、プログラムは「実行失敗」となり、エラーが発生し、止まってしまいます。これを回避するため、データを読み込むだけなら「読み取り専用」にしておくわけです。

◆「リンク無効」にする理由
上の読み取り専用の理由とほぼ同じです。開こうとするファイルの関数などで別のファイルにリンクしているものがあった場合、こちらも確認ウインドウが出ます。エラーになる確率は低いのですが、システムなのに開くファイルについてのメッセージで中断してしまうわけです。完璧なシステムと信じて利用している人からすれば、「なにか変なことしちゃったかも!!」とパニックになり、関係各所へ「すいません!システムが壊れました!!直しに来てください!!」と報告しまくるかもしれません。そういった煩わしさを無くすためのシステムなはずなのに効果が半減です。きっと作成依頼をした方が「なんだよ。すぐに壊れるなガッカリだ」とか思ってますよ(笑)・・・とまあ、そんなことにならないかもしれませんが回避したいですよね。それにリンク付きのファイルを取引先や別担当から受け取った時、大抵リンク先がないのでリンクできません。まあ、リンク付きのファイルって結局、最後に保存したデータを見てほしいものだと思うので、「リンク無効」にしておこうということです。

プログラムが止まると困るのは、計算途中のデータや変数に記憶しておいたデータが消えてしまうということです。一時記憶なので再度プログラムを動かせばいいですが、再度データを読み込んだり、止まるのを前提でいちいち読み込みをかけると動作が遅くなりストレスになります。できる限り止めたくないものです。「できる限り」と書いたのは、このままですと止まる可能性が残っているからです。それは開くファイル自体に問題があった場合。何らかの理由で修復が必要な時です。これをスルーする方法もありますが、そうなったときはシステムとは別次元の大問題が起きてると思いませんか?(笑)通知なしでプログラムすすめるよりも止めるほうがよいかと。。。

 

閉じる

2. ファイルを閉じる(保存せずに閉じる)

Workbooks("Staff.xlsx").Close savechanges:=False

開くときがOpenならそのままの文体でCloseかと思いきや書き方がが違います。説明しますと

Workbooks("Staff.xlsx").Closeワークブック名を指定して閉じる命令
開いているファイルはExcelさん側も戻す場所がわかるので、ファイル名だけ指定すればわかってもらえます。

savechanges:=False 閉じるときに保存はしませんという命令
これを指定すると保存を促すウインドウを開かずにそのままファイルを閉じてくれます。省略すると「保存しますか?」というExcelからの通知ウインドウが開きます。もし、閉じる前に保存をしている場合はウインドウが出ませんので省略できます。

わざわざ「保存しない」に指定するのは、開くときの設定理由と同じ、Excelからの通知ウインドウでプログラムが中断しないように回避するためです。エラー回避のためですね。これは読み取り専用でも同じ。詳細は「1.ファイルを開く」を読んでください。

 

閉じる

3. ファイルを保存する

Workbooks("Staff.xlsx").Save

閉じる命令と似てますね。解釈は同じです。ただし、読み取り専用でファイルを開いている場合、通知ウインドウが出てしまい、選択によってはエラーになりプログラムが止まるので、ファイルを保存したいときは通常モードで開いておきます。

名前を変えて保存するときは

Workbooks("Staff.xlsx").Save As Filename:="新しいフルパス名" 

もし、指定した場所に同じ名前のものがあった場合はエラーになってしまいます。回避するためにファイル名の後に日付と時間を差し込んだり、保存前に保存先のファイル名を調べれば解決します。ファイルを検索してみる方法は「5.ファイルの検索」で書きますのでそちらを参考にしてもらいまして、日付を差し込む方法の例をあげます。

Workbooks("Staff.xlsx").Save As _
     Filename:=ThisWorkbook.Path & "¥Staff" & format(now(),"yymdhns") & ".xlsx"

こんな感じになります。
format(now(),"yymdhns")この部分で実行された時間の西暦下二桁、月、日、時間、分、秒を出力しています。now()だけで、現在の日時を得ることができますが、ファイル名に/スラッシュが使えないので、フォーマット指定をして数字だけにしています。yyをyyyyにして西暦4桁にすれば完全にユニークな数字になりますが、下二桁でも100年後の全く同じ時間にならないと同じ数字にならないのでこのままで十分かと思います。
一時保存ならformat(now(),"s")の秒だけでも十分かもしれません。60分の1で数字がかぶりますが、出現頻度が少ないなら十分です。私が実際に作って、業務運用したものも、一時保存ファイルは秒だけにしてましたが、数字が重なることは無かったです。用途や頻度で使う数字は変えたらよいかと思います。

 

閉じる

4. ファイルを移動する

Name ThisWorkbook.Path & "¥DataBase¥Staff.xlsx" as ThisWorkbook.Path & "¥Staff.xlsx"

この命令でStaff.xlsxファイルがDataBaseフォルダの外に出て、システムと同じ階層に移動します。

でも、これ実は「移動する」命令ではなく、「名前の変更」によって結果的に移動しているという方法です。使い方は
Name 古い名前 as 新しい名前と書きます。
見たままで、古い場所と新しい場所をフルパスで指定すればよいだけです。簡単ですね!
。。。と、実はめんどくさい(笑)
エラーになる場面がいくつかあります。実行する前に確認しておくことは、

a.移動元にファイルがあるかどうか?
b.移動先に同じファイル名があるかどうか?
c.移動するファイルが通常モードで他の誰かに開かれていないか?

この3つです。
どうやって状況回避しましょうか??システムを操作する人にその都度事前に確認してもらうようにしますか??それともエラーがでないようにルール決めて、ディスプレイにふせんでも貼っておきますか??いやいや、「システム」にするなら可能性のあるものは潰しておきましょう。
まず、aとbについては、次の「5.ファイルの検索」を使います。下のサンプルコードでは、aとbのコードをあえて変えてありますが、どちらでも同じ結果が得られます。双方の違いですが、aはExcelファイル全般から該当ファイルを探す方法、bはファイルを断定してピンポイントで探す方法です。これについては次のファイルの検索で詳しく説明します。そちらをご覧ください。
そして、cを調べる方法ですが、実はいくつかあります。
いままでいろいろ実装してみたんですが、一番しっくり来た方法をこちらで使います。それは、Excelブックをファイル形式の追記モードで開いてみてエラーがでるかどうかで判断する方法です。追記というのは文字通り現在のファイル内容にデータを追加していく方法です。現在のファイル状況を「保持して継ぎ足す」わけなので、誰かが先にファイルを変更できる状態で開いていると内容を保持できませんのでエラーが出ます。これを利用します。
このファイル形式で開く方法はテキストファイル(.txtとか.csvとか)を開くための命令です。今回の記事ではこの部分は掘り下げません、この次のその④で「CSVファイルの操作」を取り上げ、そこで詳しく説明させていただきます。今回はそういうもんだと思ってください。
なので、ここでは「どうやってエラーを制御するか?」という視点で、上記abcを回避する方法をサンプルを使って説明します。

サンプルコードです。

Sub file_move()
Dim f_name As String, f1_check As Boolean, f2_check As Boolean, result As String, err_no As Integer 

f1_check = False
f2_check = False

f_name = Dir(ThisWorkbook.Path & "¥DataBase¥*.xls*")

Do While f_name <>""
   If f_name = "Staff.xlsx" Then
      f1_check = True
      Exit Do
   End If
   f_name = Dir()
Loop

If Dir(ThisWorkbook.Path & "¥Staff.xlsx") <>"" then
   f2_check = True
End If

If f1_check = True and f2_check = False Then
   
   On Error Resume Next
   Open ThisWorkbook.Path & "¥DataBase¥Staff.xlsx" For Append As #1
   Close #1
   err_no = Err.Number
   On Error GoTo 0
   
      If err_no >0 Then
         Msgbox "ファイルが使われています" & Chr(10) & "少し時間をおいて再実行してください", _
             vbOKOnly + vbExclamation, "ファイルの確認"
      Else
         Name ThisWorkbook.Path & "¥DataBase¥Staff.xlsx" As ThisWorkbook.Path & "¥Staff.xlxs"
         Msgbox "ファイルが移動されました", vbOKOnly + vbInformation, "ファイルの確認"
      End if
Else
   result = ""
   If f1_check = False Then
      result = "移動するファイルがありません" & Chr(10)
   End If
   If f2_check = True Then
      result = result & "移動先に同じ名前のファイルがあります"
   End If
   Msgbox result, vbOKOnly + vbExclamation, "ファイルの確認"
End If

End Sub

このコードで何をやっているのかをまとめますと、

f:id:hamochikuwa440:20210923202622p:plain


このようになっています。
特に注意が必要なのが、図の①、②、③のエラーを無視するポイントです。
まず、エラーを無視するということは、エラーの出る場所がわかっている上でエラーが他の動作に影響しない状態、つまり制御できている状態であることが必須です。

このサンプルでは、
On Error Resume Nextでエラーを無視する命令を入れ、
ファイルを追記モードで開いて、すぐ閉じる命令を入れます。その後、
err_no = Err.Numberでエラー番号を覚えておきます。この時、エラーが出ていなければ0。何かしらエラーが出ていれば0以外の番号が出ます。
そして、
On Error GoTo 0でエラー無視を解除させます。
このエラー無視解除をすると、Err.Numberでわかるエラー番号も一緒にリセットされるので、エラー無視解除前に覚えておかないといけません。
次にエラーの制御について見てみます。まず、エラー無視中にエラーが出るポイントは「ファイルを追記で開いて閉じる」箇所です。この処理はエラーの有無を調べる以外に利用しませんので独立しています。そして、エラー無視開始ポイントをまたぐ処理は存在しませんので開始前に起こるエラーはしっかり認知されます。また、無視中の処理で無視解除後に使うものはエラー番号だけです。ということは番号を得るタイミングさえ気をつければ想定の範囲で動くと思われ、仮に番号の把握が違っていた場合、エラー無視は解除されているのでエラーが認知されます。自分の想定範囲外のことはチェックできる体制に戻しておくということです。
エラー無視は、意図していないコードやアルゴリズムのミス、想定外のエラーが起きても無視されてしまいます。間違いや欠陥があっても気づきにくく、放置される恐れもあります。そのまま原因対処しないで、意図した動きになるまで処理を付け加え、コードばかりが膨れ上がり、原因がよくわからないままプログラム自体が制御不能に陥ることも考えられます。なので、私は、使うポイントを限定的にしたほうがよいと考えています。エラー処理が面倒だから「とりあえず全部止めておけ」みたいな使い方はやめ、ちゃんとデバック、コンパイルして原因を潰しておきたいですね。

 

閉じる

5. ファイルを検索する


Dim f_name As String,f_check As Boolean,result As String

f_name = Dir(ThisWorkbook.Path & "¥DataBase¥*.xls*")

f_check = False

Do While f_name <> ""
        If f_name = "Staff.xlsx” Then
            f_check = True
            Exit Do
        End if
    f_name = Dir()
Loop

If f_check = True then
    result = "ファイルが見つかりました"
Else
    result = "ファイルはありません"
End if

Msgbox result , vbOKOnly + vbInformation, "ファイル検索結果"

これは、DataBaseフォルダの中のすべてのExcelファイルの中からStaff.xlsxというファイルがあるか判断するものです。
説明をコードに併記してみます。

f:id:hamochikuwa440:20210921013458p:plain


ポイントはDir( )の使い方です。(以前Macで使えませんでしたが、2019版から使えるようになりました。)

まず、図のコード説明の中でAという場所で、f_name = Dir(ThisWorkbook.Path & "¥DataBase¥*.xls*")と書いて、DataBaseフォルダ内のExcelファイルを検索し、f_nameという変数にファイル名を覚えさせています。
使い方はDir(パス名)と書き、実行すると、指定したパス名で検索し、ヒットしたファイル名を1つ教えてくれます。もし該当なければ空白の値が返ってきます。そしてこのDirは、一度使った設定を覚えていて、カッコ内を空欄にすると、前回と同じ条件で、先にヒットしたファイルの「次」のファイル名を教えてくれます。便利ー。なので、上の説明図の2回めのDirは、カッコ内を空欄にしなくてはなりません。「省略できるから」空欄にしているわけではないのです!
さらに、検索ファイルがなくなれば、空白と教えてくれる特性を利用し、ループを抜ける条件を「空白になったら」にしておくことで、ファイル数(ループ回数)を気にせずにコードが書けるんですね。
そして、Excelファイルの絞り込み方法なのですが、「*」というワイルドカードを使っています。見やすいように全角で書いてますが、実際は半角アスタリスクです。
これは言い換えれば「なにか」とか「ホニャララ」とかいうものですね。このサンプルで説明すると「*.xls*」となっていますので、ファイル名に「.xls」が含まれていればOKということになります。なので、「.xlsx」や「.xlsm」、以前のファイル形式「.xls」と幅広くExcelファイルを探せるようになるわけです。Excelのフィルター機能にも「〜を含む」というのがありますね。あれと一緒です。

さて、今回のサンプルコードなのですが、実は探すファイルのフルパス名がわかっているので、ワイルドカードやループを使わずに直接パス名を指定すれば、もっと簡単に解決できます。例えば

Msgbox Dir(ThisWorkbook.Path & "¥DataBase¥Staff.xlsx")

と1行だけで、ファイルがその場所にあればファイル名がメッセージボックスで表示され、なければ無表示メッセージが出ます。直接指定する方法で、上のサンプルと同じような動きをするコードは、「4.ファイルの移動」でb対応の箇所で使ってます。この説明を照らし合わせてみてください。
まあ、断定してファイルを探す場面より、Excelファイルすべての中から探す場面や、ファイル名のキーワードを頼りに探す場面のほうが多いと思います。
なので、あえて今回はDirの便利な特性やワイルドカード検索も一緒に書きたかったので、面倒なサンプルになっています。本当にMacで使えるようになってよかった機能です(笑)便利な機能なのでみなさんも応用してみてください。

閉じる

6. ファイルを削除する

Kill ThisWorkbook.Path & "¥DataBase¥Staff.xlsx"

使い方は見ての通り
Kill フルパス名
これでファイルは削除されます。注意点はゴミ箱に行かないことです。ちょっとまった!が効きません。私はコードで書いたこと無いので、当初この記事では飛ばしてました。ファイル削除は手動でもいいかなと思いますよ。
また、これは該当ファイルが無いとエラーになります。最初にDir(パス名)で見ておくといいですね。詳細は「5.ファイルの検索」にあります。

閉じる

変数の宣言とコンパイルについて

VBAは宣言しなくても動きます。なので宣言しなくても問題は無いように感じますが、、、宣言はする癖をつけたほうがよいです。まず、他の言語ではほぼ宣言しなくてはならないですからね。
「いやいや、他の言語使わないよ!」って思っているかもしれませんが、、、、VBAだけですべて乗り切る、、、正直それは難しいです。VBAから他言語へ移植することも考えれば必ず宣言するくせはつけておくべきでしょう。
また、VBAのオプションに「宣言を強制」するものがあります。これは是非使いましょう。設定方法もありますが、コードの大外、一番始めにOption Explicitと記入すれば強制になります。
あえて面倒くさい規制を入れる利点はなにか??
それは、簡単な変数の書き間違い。。。これがしっかりエラーになってくれるんです!!デバッグが楽になりますよ〜!
ループを制御するカウンター変数名を間違えて入力し無限ループ⇒強制終了が効かずファイルがぶっ飛ぶ⇒今までの時間を返せ(泣)
これが無くなります(笑)

あと、コンパイル。これはVBAのリボンの「デバック」の中の一番上にあります。文法的な間違いが無いかどうかを判断してくれます。最低限コンパイルしてもエラーが出ない状態がスタートラインです。コードが大規模になってくると、どこに単純なエラーが隠れているかひとつひとつ確認するのは大変です。テスト前、運用前は必ずコンパイルしましょう。

とても長文になってしまいました。予定ではCSVファイルもここで説明する予定でしたが、、、、あまりに長すぎたので分けることにしました。なのでその④はCSVファイルの操作について書きます。

次は部分的に説明というより、実際に簡単なデータベースをCSVで管理するものをサンプルにして説明します。

もうサンプルは完成していますので、次はすぐに書けると思います!