• ベストアンサー

エクセルVBAのIDプロパティ?

今日初めて知ったのですが「セルに識別用ラベルを設定する」IDプロパティというのがあるようです。ただVBEの「ヘルプ」を見ただけでは「Web ページとして保存し、HTML 行を Web ページに追加」するもののようで、Web ページ保存になど縁のないわたしにはさっぱりわかりません。でも、面白そうなので試してみると、 Sub ID_Wt() ActiveSheet.Range("V10").ID = "ABC" End Sub で、セルV10に"ABC"が設定され、 Sub ID_Rd() MsgBox ActiveSheet.Range("V10").ID End Sub で、読むことができました。 ◎ IDはセルのどこに保存されたのでしょうか?セルのどこを見ても見当たりませんし、そのセルはそれまでのUsedRange外に設定した場合でもUsedRangeは拡張されまれません。とても不思議です。 ◎ VBA以外の方法でIDを読むことは出来るのでしょうか? ◎ 一旦終了すると設定したIDは消えてしまうようですがそういうものなのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.2

こんにちわ #1さんのご回答に共感するところも多いので、出てこないつもりでしたが、 今回話題の ID プロパティを持ち出したのは私なので、少しだけ。 私が ID プロパティを使うようになったのは、 ここOKWaveで何度か紹介されたのがキッカケだったと記憶しています。 その時も、プロパーな技術情報には触れられていなかったし、 私も今回ご質問の点に興味を持って調べたことは今までありませんでした。 「エラーやユーザー操作などでプロジェクトが中断しても」 「失われない」 「バッファを」 「簡易的に実現する方法」 という、目的、用途、に主眼を置いて紹介されたものだったと思います。 「カスタムな設定を変更したら」 「必ず」 「元に戻す」 などの目的において、 Staticな変数(PublicやPrivate)では、 プロジェクトの中断によって情報が失なわれるし、 テンポラリなファイルに書き込んでを保存するのは、 管理面で色々な工夫が必要になって大がかりです。 他にも幾つか方法はあるけれど、 「エラーによる中断で失なわれず」 「ブックを閉じたら残らない」 (且つ、見かけ上ブック、シート、セルを変更しない) という意味では、最もコンパクトに目的を実現するもの、 という理由で、あくまで「簡易的に」用いたりします。 私が No4900090 に書いたソースでは、コメント表示設定を変更する必要 (それ以外で書くと必要以上に記述が長くなるので)があり、 また、実験が目的のソースですから、ユーザーによる書き換えなどによって エラーが起こる場面が容易に想像できるので、 元々の設定が損なわれない方法を加える必要を感じたのでした。 ただ、書き方がちょっと不十分で、本来は、 If Cells(1).ID <> "" Then Cells(1).ID = prop ↓ prop変更 ↓ 処理 ↓ prop = Cells(1).ID ↓ Cells(1).ID = "" のようにしないと、目的通りに機能しないので、 この点、誤解を与えたかな? 上述の目的以外の用途では、まったく興味を持ったことがないので、 (相当数のテスト実験を重ねてきたものの)お訊ねの件に関して 確かなことは何も言えません。 どんな用途を想定してのご質問なのかな、とも思うのですが、 答にならなくてすみません。 行儀よいソースにしようとした結果が お行儀悪かったですね。

merlionXX
質問者

お礼

cj_moverさま、いつもいつもありがとうございます。 「エラーによる中断で失なわれず」 「ブックを閉じたら残らない」 (且つ、見かけ上ブック、シート、セルを変更しない) 前回の質問で、求める回答に加えて、上記のすばらしい方法をご伝授いただき、とても感謝いたしております。 前回のお礼の際、質問しようかなと思ったのですが、今回あらためて質問をたてさせていただきました。 今後ともご指導お願い申し上げます。

その他の回答 (2)

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.3

間違えましたm(_)m If Cells(1).ID = "" Then Cells(1).ID = prop です。 んー、最悪かも

merlionXX
質問者

お礼

何をおっしゃいます、大先生。 でも、IDが値貼り付けでも張り付くんですねえ。

  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.1

私も意識するのは初めてです。 ツールバーアイコンのIDやヘルプコンテキストIDなどは目にしますが。 過去のWEBに http://www.moug.net/faq/viewtopic.php?t=35708 の後半 が唯一言及がありますね。さすがMoug。 Sub test01() Worksheets("Sheet1").Range("D5").ID = "A" Worksheets("Sheet1").Range("C3").ID = "A" MsgBox Range("D5").ID For Each rng In Range("A1:D10") If rng.ID = "A" Then MsgBox rng.Address End If Next End Sub をやってみても動きました。Rangeのプロパティにある。 rangeのプロパティはたくさんあります (1)値 (2)数式 (3)コメント (4)書式 (5)入力規則 参考 「形式を選択して貼り付け」の「貼り付け」の中の一部 そのセルのプロパティの中に IDが有ると思いますが、途中のバージョン(2002?)から出来たのではないかと思います。 でも「形式を選択して貼り付け」のメニューにもないところから、余り公になってないのかも。 ーー 用途はセルの区別(識別レッテル貼り、しおり)に使えるということではないでしょうか。 値はその都度変わるわけですが、あるとき識別としてIDをつけると値とは連動しない識別として使える用途があると思います。 ーー ただし、FindメソッドでLoolInでxlIDなどやってみたが、上記VBAコードのようには「A」を入れた番地を返しませんでした。そもそも不可。 ーー WEB(HTML)との関連で使われるのが主なのか、これが使われるのはなぜかは不勉強です。 ーーー > IDはセルのどこに保存されたのでしょうか 私のよそうですがセルのプロパティは、画像のレイヤーのように 重畳的になっていて、独立しているイメージ(各々独立して別々)で、実行中はメモリ上に情報をもたれているのではないでしょうか。 値用  A1:IV65536に対応する連続エリア 数式用 A1:IV65536に対応する連続エリア ・・ しかし利用されないセルの分のメモリーがもったいないので、技術的に工夫されていると思う。増えたときにメモリに増やすなどの工夫も有ると思う。2007になればなおさらか? 特にセル範囲で設定されるものが多いもの(書式、数式)は、各セルに同じ情報を持つのはもったいない。IDがどうなっているかは、エクセルのインサイド情報ですから判りません。 >一旦終了すると設定したIDは消えてしまうようですがそういうものなのでしょうか ファイル保存時には保存フォーマットにこの項目がなく、メモリに有るID情報は、捨てられるのかも知れません。 >UsedRangeは拡張されまれません Usedrangeを広げるきっかけとなる材料にIDは含めてないのでしょう。 「値」の設定の拡がりだけ重視しているようなこともないとはいえないが、書式の設定(ほか上記5プロパティ)でもUsedrangeは増えるものと思います。 全てマイクロオフとのエクセル処理の詳細がわからないと、いえないことです。私は長年の素人としての使用経験からイメージしてます。 その程度のものとして読んでください。私はエクセル全般において、発展は望めないのですが、質問者自身が、アンテナを張って勉強されんことを祈ります。

merlionXX
質問者

お礼

imogasiさま、長いご経験をふまえたご丁寧な回答、まことにありがとうございます。 大変勉強になりました。 感謝申し上げます。

merlionXX
質問者

補足

テストした結果 値貼り付けでもIDが張り付くことを確認しました。 Sub test02() With Worksheets("Sheet1") For Each rng In Range("A1:D20") rng.ID = "" Next .Range("D5").ID = "A" .Range("C3").ID = "A" .Range("A1:D10").Copy .Range("A11:D20").PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False For Each rng In .Range("A1:D20") If rng.ID = "A" Then MsgBox rng.Address End If Next End With End Sub

関連するQ&A