【AccessVBAの意外な落とし穴】Excel操作すると使えないユーザーが出てくる!?
業務でAccessVBAを書いているエンジニアは、VBA上からのExcel操作を行うケースが多いです。
しかし、意気揚々とリリースしたのに現場から「開けない!」との声が…
その原因はなんと、参照設定にExcelライブラリが追加されていることでした。
なんで!?どうして!?と困っているそこのアナタ
安心してください。
今回は、参照設定でExcelライブラリにチェックつけずAccessVBAでExcel操作する方法を伝授します。
AccessVBAでExcel変数を宣言には参照設定が必要?
VBAでプログラムを書く際に、1番最初行うことと言えば宣言ですよね。
まずはExcelライブラリの参照設定ありバージョン宣言例を書いてみましょう。
Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet
上記のようなExcel系の変数宣言をする場合には、事前に参照設定でExcelライブラリを追加しなければなりません。
参照設定でMicrosoftExcelLibraryみたいな名前のやつにチェックつけないと、プログラム書いても自動クイックヒントが出ないんです。
こういうやつ↓
引用:https://tonari-it.com/excel-vba-vbe-editor-code-setting/
逆に参照設定でExcelライブラリを追加しないと、前述の宣言方法ではたちまちエラーになります。
それじゃあ当然、参照設定でExcelライブラリ追加した方がいいんじゃね?と思いますよね。
ところが…
Excelライセンスがない端末でAccessが開けない!
参照設定でExcelライブラリを追加したAccessファイルは、Excelライセンスのない端末で開くことができません。
今どきExcelが入っていないPCなんかないって思うかもしれませんが、コールセンターや事務局センター等では結構あり得る話なんです。
最低限のツールで業務を回している規模の大きなセンターでは、一部の管理者のみがエクセルを扱い、各担当者たちのPCにはライセンスが入ってないこともあります。
じゃあどうするか?
ライブラリなしで書くしかないっしょ!
AccessVBAでネイティブなVBAを書いてExcel操作
カッコ良い言い方をすればネイティブなコーディングで、ライブラリなしのExcel操作が可能です。
まずはネイティブな宣言から
Dim xlApp As Object
Dim xlBook As Object
Dim xlSheet As Object
このようにExcel.ApplicationとExcel.WorkbookとExcel.Worksheetは全てObject(オブジェクト)として宣言します。
めっちゃ曖昧で抽象的な「型」なので、変数名を分かりやすくしてあげましょう。
もう、ここに書いている変数決め打ちでOKです。
それでは、この変数を使って一通り書いていきましょう。
当然のことですが、ライブラリを使わないので自動クイックヒントは出ません。
ヒントが出なくても合っていればちゃんと動くので、自信を持って進めていきましょうね。
ExcelライブラリなしのVBAコード例
まずは見た方が早いと思うので、Excelライブラリなしのコード例を紹介しましょう。
ここでは「C:¥test.xlsx」を開いて、セル範囲に文字列「A」を入力させています。
Dim xlApp As Object
Dim xlBook As Object
Dim xlSheet As Object
Dim ran As Object
Dim rans As Variant'ForEachで使うときはオブジェクト型かバリアント型'
Set xlApp = CreateObject("Excel.Application")'Excelアプリ生成'
xlApp.Visible = True'Excel可視化'
Set xlBook = xlApp.Workbooks.open("C:¥test.xlsx")'Bookを開く'
Set xlSheet = xlBook.WorkSheets(1)
With xlSheet
Set ran = .Range(.Cells(1, 1), .Cells(3, 10))
'.Range(.Range("A1"), .Range("C10"))でもOK'
For Each rans In ran
rans.Value = "A"
Next rans
End With
xlBook.Close True'保存して閉じる'
xlApp.Visible = False
Set ran = Nothing
Set xlSheet = Nothing
Set xlBook = Nothing
Set xlApp = Nothing
注目すべき点は、エクセルマクロで使われるRangeが使える部分。
cellsかrangeどっちでも使用可能です。
しかし、型宣言ではやはりObjectになるので、Excelアプリケーション系の宣言と区別が付けれるように命名規則をちゃんとしておきましょう。
ネイティブな書き方を覚えておけばめっちゃ便利!
今回は、Excel操作に関する部分でVBAのネイティブな書き方を紹介しました。
参照設定とかライセンス状況に左右されない書き方をすれば、不特定多数が使うツールでも安心してリリースできますよね。
自動クイックヒントが出ないので、本当に動くのか心配になるかもしれませんが、エクセルマクロで使うVBAはほとんど動きます。
ぜひ試してみてください!
DeepBlueでは、VBAに関する質問や要件定義の相談を受け付けています。
今回、この記事を読んで登録してくれた方には初回のみ無料でVBAマクロに関する相談を承りますよ。
興味ある方は、是非チェックしてみてくださいね。
この記事が気に入ったらサポートをしてみませんか?