【Excel VBA】入力規則でアプリケーション定義エラー

事件勃発



問題のコードはコチラ

Sub test()
 With Range("A1").Validation
   .Delete
.Add Type:=xlValidateList , _
   Operator:=xlEqual, _
   Formula1:=strFormula
  End With
End Sub


.Addで出た
なんでーー???

同じモジュール内で、IMEのOn/OffとかxlValidateWholeNumber(指定した間の整数のみ)とかはエラー出ないのに。
それどころか、さっきはふつーに通ってたのに!



調査

とゆーかググっただけw

いろんなサイトやブログでの原因をまとめてみた

・シートの保護がかかっている
・すでに設定されている
・シートがActiveになっていない
・Formulaの式中のシート名が存在しない


うん。
どれも該当しない。
上記は全部イミディエイトで確認した。
わからん。

目下急ぎの仕事があったので、とりあえず放置。
んで翌日の朝回してみたら、エラー出なかった。

気のせいだったことにしておこうw



デバッグ

しばらくして、また回したら、嬉しくない再会。
2度と会いたくなかったんだけど。

仕方なくデバッグしてみる。

うんうん唸りながら3時間・・・。

ふと、strFormulaって何が返るんだ?って気になった。
他の人が作ったやつだし、エラー出ないときもあるから、strFormulaは絶対に合ってると思い込んでてちゃんと見てなかった。
COUNTIFだけども少々ややこしいんで、strFormulaをコピーしてセルに入れてみた。

アッ・・・!
035_1.png

そりゃそーだorz



答え

画像でわかるかな?

Excelの仕様です。

列の表示をR1C1形式にしてるときに、A1形式で式を入れるとエラー吐きます。
逆も然り。
このせいですね。

strFormulaはA1形式で書いてます。
んで、へなちょこは基本的にR1C1です。
VBAとゆーよりかはExcelそのものがエラー出してるんですねぇ。

それならもうちょっとわかりやすいエラー出してよ。
MSさんは、アプリケーション定義エラーをVariantと定義しているのだろうか。
なんかよくわからんエラーはとりあえずアプリケーション定義エラーにしとけ!みたいな・・・。



対策


入力規則を設定する直前に、コレを入れてみた
If Application.ReferenceStyle = xlR1C1 Then
 Application.ReferenceStyle = xlA1
End If

R1C1だったら強制的にA1に戻す。
これでおK♪



結論

入力規則をAddするときに出るアプリケーション定義エラーの原因
・シートの保護がかかっている
・すでに設定されている
・シートがActiveになっていない
・Formulaの式中のシート名が存在しない
Formulaと、現在のExcelの参照形式が異なっている



タグ: VBA Excel

2019年09月24日

Mobilize your Site
スマートフォン版を閲覧 | PC版を閲覧
Share by: