• ベストアンサー

エクセル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/17068)
回答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

  • エクセル並べ替え VBA

    ActiveSheet.UsedRange.Addressで 並べ替えの範囲名を指定することはできないのでしょうか? Sub Sample() Cells(1, 1).AutoFilter ActiveSheet.AutoFilter.Range.Sort Key1:=ActiveSheet.UsedRange.Address, Order1:=xlAscending, Header:=xlYes End Sub を動かすと、実行時エラー1004になってしまいます。 Key1:=Range("A1")にするとうまく行きますが、 キチンと範囲を指定してあげたいのですが、その場合どうすればいいでしょう?

  • EXCEL VBAのRangeプロパティについて

    EXCEL VBAのRangeプロパティについて 下の2つのプログラムで表示されるメッセージは、 プロシージャAは"$B$1" プロシージャBは"$A$1" なのですが、Rangeプロパティはどういう使われ方をしているのでしょうか? お教えくださいませ。 ・プロシージャA Sub test1() Cells(1, 2).Activate MsgBox ActiveCell.Range("A1").Address End Sub ・プロシージャB Sub test2() Cells(1, 2).Activate MsgBox ActiveSheet.Range("A1").Address End Sub

  • エクセルVBAでLockされてないセルをClearContents

    エクセル2000です。 シートでロックされていないセルだけ中身を削除するマクロを作っています。以下でも一応作動はするのですが、いちいちForNextでまわさずにできないものかと質問させていただきました。 よろしくお願いします。(o。_。)oペコッ Sub クリアテスト() Dim c As Range For Each c In ActiveSheet.UsedRange If c.Locked = False Then c.ClearContents End If Next End Sub

  • Excel VBA 超初心者 困っています。

     Excelで見積書を作成しています。  マクロでページを追加できるようにしたいのですが、貼り付け先のセルを指定する方法をインターネットで探しながら作ってみると  実行時エラー1004 Range クラスの PasteSpecial メソッドが失敗しました。 となります。  ワークシートを指定すればいいのかなと思いますが、どういう風に指定するのかがわかりません。    どうか、教えてくださいませんでしょうか。宜しくお願いします。 Sub 頁追加() ActiveSheet.Unprotect ActiveSheet.Range("A42:AZ84").Copy Dim a As Range Set a = Application.InputBox( _ Prompt:="セル範囲を選択してください", _ Title:="セル選択ダイアログ", _ Type:=8) a.PasteSpecial Application.CutCopyMode = False EndSec: Set Rng = Nothing ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True End Sub

  • excel  vba  シートの取り扱い

    Sub   aaa() Worksheets.Add ActiveSheet.Name = "Namefile" ((質問)ここへ適当なコードを追加することによって 以下のThisWorkbook.Sheets(1)というのを、上で追加した Namefileシートを処理することとしたい。 つまり  Namefileシート=ThisWorkbook.Sheets(1) どうすればいいか。よろしくお願いします。) ThisWorkbook.Sheets(1).UsedRange ThisWorkbook.Sheets(1).UsedRange.Delete ThisWorkbook.Sheets(1).Range("B2") = "ファイル名" ThisWorkbook.Sheets(1).Range("C2") = "最終更新日" End Sub

  • エクセルVBAで DirectPrecedentsプロパティ

    DirectPrecedentsプロパティが同一シート内しかトレースできないことを利用して、他シートを参照しているセルを判定できないかと思い、下記のマクロを書いてみました。 残念ながら他シートを参照しているセルでエラーになってしまいます。 どのよに修正すればよいでしょうか? なお、他シート参照の判定に"!"の存在を使わないのは、「名前定義」されたセルを参照している場合を想定しているためです。 Sub TEST01() With ActiveSheet On Error GoTo line For Each c In .UsedRange.SpecialCells(xlCellTypeFormulas, 23) On Error GoTo 0 c.Select If c.DirectPrecedents.Address = "" Then'ここでエラー MsgBox c.Address & "は他シート参照" Else MsgBox c.Address & "は" & c.DirectPrecedents.Address & "参照" End If Next End With line: MsgBox "数式がありません。" End Sub

  • VBAがうまくうごきません。

    以下のプログラムを書きました。 以下のプログラムではA1~C108を1ページ、A109~C216を2ページ目、A217~C325を3ページ目として印刷するようにページ設定したいのですが、うまく動きません。 どうしてでしょうか? わかるかたがいたら教えていただけないでしょうか? よろしくお願いします。 Sub 改ページ設定() ActiveWindow.View = xlPageBreakPreview '改ページプレビュー Set ActiveSheet.HPageBreaks(1).Location = Range("C109") '水平改ページ位置1を変更 Set ActiveSheet.HPageBreaks(2).Location = Range("C217") '水平改ページ位置2を変更 Set ActiveSheet.HPageBreaks(3).Location = Range("C326") '水平改ページ位置2を変更 End Sub

  • エクセルVBAで

    いつもお世話になります。 Sub ボタン_Click() Sheets("別紙1").Range("E1") = ActiveSheet.Name Sheets("別紙1").Activate Range("B65536").End(xlUp).Offset(1).Select End Sub Sub ボタン1_Click() i = Range("B65536").End(xlUp).Offset(, -1).Value na = Range("E1") Sheets(na).Activate ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", _ SubAddress:="別紙1!B" & i + 2, TextToDisplay:=Str(i) End Sub 上記モジュールで、ボタンをクリックすると別紙1に飛んで、その中に必要事項を記入後、ボタン1をクリックすると、ボタンをクリックしたときにアクティブだったセルに、ハイパーリンクを貼るものを利用していました。 先日、これらモジュールが貼られているシートを保護をかけて再度保護を解除したら、今までボタンを押したときにアクティブだったセルにハイパーリンクが貼れていたのに、A1のセルに記入してしまうようになりました。 そこで、不具合を改善すべく、上記モジュールを書き換えて、ボタンをクリック時にアクティブセルを別紙1のE2の保存しておいて、ボタン1をクリックするとそのE2のセルに戻ってハイパーリンクを貼るというものにしなおしたいと思います。 そこで質問ですが、ボタンをクリックした時点で、アクティブであるセルの座標(表現の方法が不適切かもしれませんが)を取得するにはどのようにすればいいでしょうか? ちなみに、E1にはクリックした時点でアクティブであるシート名を記録し、ボタン1をクリックしたときにそのシートへ戻るようにしてあります。 以上、ご教示の程よろしくお願いします。

  • Excel VBA UsedRange範囲ソート

    図のような中抜の一覧ができているとき、商品コードで空行を飛ばして並び替えをしたいのですが、下記だと空行まで(チョコからわたがしまで)しか対象になりません。 ---------------------------- Sub 並べ替え() With ActiveSheet.Sort .SortFields.Clear 'Key:=Range("A3")でソートする列とタイトル位置を指定 .SortFields.Add Key:=Range("A3"), SortOn:=xlSortOnValues, _ Order:=xlAscending '.「商品コード」("A3").でソート .SetRange Range("A3").CurrentRegion ' 先頭行をタイトル行と見なす .Header = xlYes .Apply End With End Sub ------------------------- 範囲をCurrentRegion ではなくUsedRangeに広げるには、どこをいじったらいいでしょうか。 求める結果としては「商品コード」の列が登り順に揃ってほしいのです。 データ処理としてはソートをかければいいだけですが、UsedRange(範囲内のセルを選択し、Ctrl+Shift+Endキーで選ばれる範囲)をみつけてソートをかける方法を知りたいのです。

  • エクセルVBA

    エクセル2003です エクセルの印刷レビュ-までのマクロをおしえてください *A列からQ列までで行は1~150で伸縮します  最終行をA5より下のA列のセルに値が連続で入っている最後が最終印刷範囲行とします *罫線ありです *1ページを30行とします *2ページ目からの先頭行に(A7:Q7)を印刷に入れたい *ヘッダーは右上に日付 *フッダーは右下にページ 現状では罫線で最終行が決まってしまいます 現状コード Sub 印刷() With ActiveSheet.PageSetup .PrintTitleRows = "$7:$7" .PrintTitleColumns = "" End With ActiveSheet.PageSetup.PrintArea = Range("A1:Q1").Resize(Range("A" & Rows.Count).End(xlUp).Row).Address With ActiveSheet.PageSetup .RightHeader = "&""MS Pゴシック,太字 斜体""&14&D" .RightFooter = "&""MS Pゴシック,太字 斜体""&14&P/&N" .PaperSize = xlPaperA4 .Zoom = 75 .PrintErrors = xlPrintErrorsDisplayed End With ActiveWindow.SelectedSheets.PrintPreview End Sub 罫線ではなくA列のセルに文字列等が入っている行を最終行にしたいのですが 教えて頂けないでしょうか? 出来れば説明付きでよろしくお願いします

専門家に質問してみよう