- ベストアンサー
エクセルVBAでIDの有無を判定する方法
- Sheet1上のA1セルにIDプロパティでのIDを設定した場合、これをワークシート関数で取得する方法が見つけられなかったので、ユーザー定義関数を作成しました。
- 作成したユーザー定義関数は、指定されたセルのIDが設定されているかどうかを確認し、結果をTRUEまたはFALSEで返します。
- ただし、現在の実装では、IDを削除してもワークシート上の表示は変わらない問題があります。解決策としては、ワークシート関数でIDを取得する方法を探すか、ユーザー定義関数の実装を修正することが考えられます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
No.1です。 「Application.Volatile」が再計算の時しか働かないのなら、IDを操作するルーチンに、強制的に再計算をするコマンドを置けばいいのではと思い、試したところうまくいきました。 コード例です。参考にしてください。 IDを設定する。 Sub setID() Cells(1, 1).ID = "aaa" Calculate End Sub IDを削除する。 Sub delID() Cells(1, 1).ID = "" Calculate End Sub
その他の回答 (2)
失礼しました。勘違いをしておりました。 ところで、Application.Volatile メソッドについて調べたところ、下のような記述がありました。 ---------------------------------------------------------------- ユーザー定義関数を自動再計算関数にします。自動再計算関数は、ワークシートのいずれかのセルで計算が行われるたびに再計算を行います。これに対して非自動再計算関数では、入力した変数の値が変わったときにだけ再計算を行います。このメソッドは、ワークシートのセルを計算するユーザー定義関数の内部で使わなければ効果がありません。 ---------------------------------------------------------------- 「ワークシートのいずれかのセルで計算が行われるたびに」という部分から考えるに、セルIDの設定・削除は再計算の対象に入っていないのではないかと思います。 実際、私も下のようなコードを書き、確かめましたが、IDの設定・解除では変化はありませんでした。 Function checkID(c As Range) As Boolean Application.Volatile If c.ID <> "" Then checkID = True Else checkID = False End If End Function もし、私の再度の勘違いでしたらお許しください。
お礼
「ワークシートのいずれかのセルで計算が行われるたびに」という部分から考えるに、セルIDの設定・削除は再計算の対象に入っていないのではないかと思います。 なるほど、その通りですね。 ありがとうございました。
=A1<>"" ではいけませんか?
お礼
はい、残念ながらそれではセルのIDプロパティの有無は取得できません。
お礼
kozirou54さま、ありがとうございます。 たしかにIDの設定/削除はマクロでしかできないわけですから、そこで再計算させればいいわけで、これはすばらしい解決方法をご教示いただきました。 さすがPC歴30年ですね! ただ、わたしのは2000なので問題はないのですが、2003の場合だと http://support.microsoft.com/kb/919127/ja のサイトで、気になる記載を見かけたので、UsedRange プロパティを付記して以下のように変えてみました。 Sub setID() 'IDを設定する。 With Sheets("Sheet3") .Cells(1, 1).ID = "aaa" .UsedRange.Calculate End With End Sub Sub delID() 'IDを削除する。 With Sheets("Sheet3") .Cells(1, 1).ID = "" .UsedRange.Calculate End With End Sub Function IDCheck(CksCell As Range) As Boolean Application.Volatile (True) IDCheck = Sheets("Sheet3").Range(CksCell.Address).ID <> "" End Function 大変、お世話になりました。まだまだ駆け出しのわたくしめに今後ともご指導くださいませ。 (o。_。)oペコッ.