初めての投稿になります。
ワークブックを開くスクリプト
私は日常業務でエクセルファイルを自動で開いて処理していますが、エクセルファイルを安定して開くためのスクリプトをFunctionプロシージャにまとめて活用しています。
以下のような観点で設計しています。
- 開いたエクセルファイルをWorkbookオブジェクト変数に格納する。
- 新しく開くファイルは読み取り専用で開く。
- ファイルの閉じ忘れがあっても処理を続行したい。
ファイルが既に開かれた状態で同じファイルを開こうとするとエラーになるので、ファイルが既に開かれているならそれをそのまま利用したい。 - このプロシージャで処理できない場合はNothingを返す。
Function wbOpen(ByVal fullpath_WB As String) As Workbook
Dim L As Long, filename_WB As String
L = InStrRev(fullpath_WB, "\", , vbBinaryCompare)
filename_WB = Mid(fullpath_WB, L + 1)
On Error GoTo ERR1
Set wbOpen = Workbooks(filename_WB)
Exit Function
ERR1:
On Error GoTo ERR2
Set wbOpen = Workbooks.Open(Filename:=fullpath_WB, UpdateLinks:=0, _
ReadOnly:=True)
Exit Function
ERR2:
Set wbOpen = Nothing
End Function
上記のコードを利用すれば、ファイルのフルパスさえ正しければファイルはほぼ確実に開けます。
Workbooks.Open
メソッドではUpdateLinks:=0
、つまりリンクを更新しない設定にしています。これは以下の理由によります。
- 業務のエクセルファイルではリンク(外部参照)で更新される意味のあるデータはない。
- その代わりに無意味なリンク(リンク先が存在しないファイルになっていてエラーを吐いているリンクなど)が大量にある。これは長年の安易なコピペ操作の繰り返しで蓄積されたもの。他人が作業したファイルには高確率でこれが含まれるので、この無意味なリンクを避けることは難しい。
-
UpdateLinks:=3
などとしてリンクを更新設定にした場合、無意味なリンクを延々と更新しようとする。時間を食うだけで何にもならないので、最初からリンクは更新しないことにしている。
私はこのプロシージャを別のプロシージャの繰り返し文(For文など)の中に組み込むなどして、効率的にエクセルファイルを操作しています。
端末環境によってはフォルダ区切り文字が「¥」ではなく「/」だったり「\」だったりしますが、上記コードを流用される場合は端末環境に合わせて適宜調整してください。