• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:名前付きセルの利用方法 Excel2013 VBA)

Excel2013 VBAで名前付きセルの利用方法

real beatin(@realbeatin)の回答

回答No.3

回答No.1補足欄への返信です。 > 激しくて混乱してますが、 > 試したら何の問題も無く動いてるので正しいんですよねコレ… ごもっともな感想だと思います。 私の方でも、説明が雑過ぎたなぁと思っていて、 追加補足を書いてはいたのですが、 ちょっと上げ難い雰囲気みたいなので、投稿ボタン押せませんでした。 今回のテーマ自体、Web上でも情報が少ない、ということもあって、 こちらもすべて自分の言葉で説明するよりないのですが、 細かい部分で説明や用語を間違うかもしれませんし、 重ねて下手な説明だったらゴメンナサイ。 概念的な理解への援けに少しでもなれば、と。 さて。 【Range】 例えばVBEでF2キーを押してオブジェクトブラウザーを表示して、 Rangeを検索すると、Range プロパティが 複数のクラスに在ることを確認できます。 つまり、親オブジェクトを省略した形の   Range ... という記述は、 その記述を書いた場所、実行時の状況によって、 どのクラスのRange プロパティを呼び出すか、 予めVBAで定義されたルールに従って変動します。 【Sheet1 モジュール】(Worksheetのシートモジュール) (この場合の"Sheet1"は、  シートタブに表示されている名前(Name)ではなくて、  VBProject内でのオブジェクト(クラス)名(CodeName)  を指します。) に、   Range ... 親オブジェクトを省略して、Range プロパティを呼び出すと、   Me.Range ...   Sheet1.Range ... Sheet1 クラスのRange プロパティを参照します。 コードを記入したモジュールから見て 一番近くにあるクラス=Sheet1のメンバーを参照することになります。 【標準モジュール】 に   Range ... 親オブジェクトを省略して、Range プロパティを呼び出すと、 関連付けされたクラス(オブジェクト)が標準モジュールにはないので、 一番近くにあるクラス=Excel.Applicationのメンバーを参照することになり、   Excel.Application.Range ... になるのですが、この場合の動作結果は、通常、   Activesheet.Range ... になりますので、  「標準モジュールに親オブジェクトを省略した形でRangeプロパティを呼び出すと、   アクティブシートのRangeオブジェクトを返します」 という説明をするのが一般的な慣習になっています。 Sheet1 モジュールで   Range("起動Path") ... を指定すると、 Sheet1に(シートレベルで)定義された名前が あれば、正常にセル範囲を返しますし。 無ければ、実行時エラーを返します。 仮に、ブックレベルで定義された名前として存在している名前であっても、 Sheet1 クラスに無ければエラー、ということです。 【Evaluate メソッド】 元々はVBAが生まれる前の古いマクロに用意されたものだったと記憶していますが、 Excelメニューの  [名前ボックス]  [数式バー]  [名前の定義] > [参照範囲] 等の参照や演算をメモリ上で再現するようなものです。 [名前ボックス]に  起動Path を記入(表示)した状態でEnterキーを押せば、 [起動Path]という名前で定義された名前の参照範囲にジャンプしますが、 これをシミュレートした結果として、  Evaluate("起動Path") ... は、Range オブジェクトとしてのセル範囲[起動Path]を返します。 意味合いとしては、  アクティブなシートにシートレベルで定義された名前の参照範囲、 もしシートレベルに該当する名前が無ければ、  アクティブなブックにブックレベルで定義された名前の参照範囲 もし、どちらにも該当する名前が無ければ  エラー といった感じになります。 【Application.Range】 名前の定義を参照する場合にはEvaluate メソッドとまったく同じ結果になります。 何故、Application.を付けるかというと、 Sheet1で親オブジェクトを省略して、Range プロパティを呼び出すと、 一番近くにあるクラス=Sheet1のメンバーを参照する為、 意図に沿うようにする為には、 親オブジェクトをApplication(実際の挙動としてはActiveSheet)として 正しく指定する必要があるからです。 今回は「Sheet1モジュールのダブルクリックイベント」ということでしたから、 アクティブなブックは自ブックである(アクティブなシートは必ずSheet1である) という(少なくとも今のVBAでは絶対的な)前提を利用した相対的な参照として、   MsgBox Evaluate("起動Path").Value   MsgBox Application.Range("起動Path").Value という例を紹介しています。 [起動Path]という名前が定義されていないブックがアクティブな場合には、 どちらも実行時エラーになりますのて、他の場面で扱う際は注意して下さい。 絶対的な参照としては、   MsgBox Workbooks("hoge").Names("起動Path").RefersToRange.Value のように、ブック>Namesオブジェクト>セル参照範囲、 階層を辿る形になります。 補足への返信としては以上です。 うまく整理できなくてすみません。 尚不明な点があれば遠慮なくお訊ねください。 、、、迷ったけど、一言、自分が書いておくべきと思うので、書いておきますね。 私は、 貴方の質問は、今回も、よく整理されていて、解り易い、 と感じています(実際、読んですぐ解答に着手できました)。 起動Pathという名前からしてShell関数を使う目的を理解するのも容易なことですし、 質問の趣旨からしてそれ以上説明する必要もなく、 といって全く目的に触れないでいては混乱を招く可能性があることを考えると、 ピッタリ必要十分だと、私は、思っています。 まぁ、人それぞれでいいのですけれどね、でもケチつけるのは違うと思います。 失礼しました、それではまた。

関連するQ&A

  • VBAにおけるセルの名前の参照方法

    現在、Aシート、Bシートがあり、BシートのA1セルに test という名前を付けました。(範囲はブック) Aシートが再計算されれば、BシートのA1セルをメッセージボックスで表示したいのですが、調べましたが、よくわかりませんでしたので、詳しい方教えてください。 範囲はブックになっているし、他に同じセルの名前もつけれないようになっているので、 このような記述で大丈夫かと思いましたがエラーが出でしまいました。 なぜでしょうか?やはりわざわざ毎回シート名から記述が必要なのでしょうか? Private Sub Worksheet_Change(ByVal Target As Range)      MsgBox (Range("test").Value) End Sub このようにシート名から書けば表示されました。 Private Sub Worksheet_Change(ByVal Target As Range)      MsgBox (Worksheets("B").Range("test").Value) End Sub

  • EXCEL 名前の定義 VBA参照の方法

    EXCELの名前の定義を、VBAから参照する方法を教えていただきたいのですが  名前を定義する    シートA  名前:TEST 範囲:シートA    シートB  名前:TEST 範囲:シートB    シートC  名前:Pass 範囲:ブック  それぞれをVBAから参照する場合    Range("TEST").Value: シートA内のVBA    Range("Pass").Value  では、参照できず。    Worksheets("シートA").Range("TEST").Value    Worksheets("シートC").Range("Pass").Value  にて、参照できました。 明示的なシート名入力が必要なのでしょうか? よろしくお願いいたします。

  • エクセルVBAで定義したセルを使う時

    シート1のセルA1にTESTと定義して、標準モジュールでRange("TEST")と書いています。 同じプログラムを別のシートでも使おうと思ったのですが、 同じブックで別のセルに同じ名前を定義できないようです。 そこで、シート2のセルA1にはTESTAという名前を定義しました。 アクティブなシートがシート1の時は、Range("TEST") アクティブなシートがシート2の時は、Range("TESTA")としてプログラムを書いていますが、 シート名を変えられたら、使えなくなります。 何か良い方法は無いでしょうか?

  • 〖緊急〗エクセルのVBAについて質問です。

    エクセルのVBAを使用して、下記の動作を実行したいのですがうまくいきません。 おしえてください。 sheet1に移動したいシート名の一覧を作成し、一覧を参照してシートを移動したいです。 RangeにカーソルをあてるとA1に入力したシート名前が反映しているようなのですが・・・。 sheet1のセルA1に移動させたいシート名を入力しています。 Sub Worksheet() Worksheets(Range("A1")).Activate End Sub ※❝インデックスが有効範囲にありません❞とエラーがでます。 ※同一のBOOK内での作業です。 よろしくおねがいします。

  • エクセルVBAで他のbookのセルcellsで参照

    エクセルVBAで他のbookのセルの値(一定の範囲)を参照したいのですが、変数を使いたいため、cellsを使用したいのですがうまくいきません。方法はないでしょうか。 下記に例を示します。 rangeを使用すればすべてok((2)(5))(この場合はset文を使用しなくてもok(5))。同じbookならcells使用ok(4)。 他のbookをcells文使用する方法はないでしょうか(もちろんできれば、Thisbookの方もcellsを使用したい)。 よろしくお願いします。 sub test() Dim ThisBook As Workbook Dim Workbook2 As Workbook 'マクロを実行しているワークブック Set ThisBook = ThisWorkbook '他のワークブック Set Workbook2 = Workbooks("test11.xlsx") ' 'ThisBook.Worksheets(1).Range("A1:B2").Value = Workbook2.Worksheets(1).Range(Cells(1, 1), Cells(2, 2)).Value  '(1)だめ 'ThisBook.Worksheets(1).Range("A1:B2").Value = Workbook2.Worksheets(1).Range("a1:b2").Value '(2) OK 'Workbooks("test1.xlsm").Worksheets(1).Range("A1:B2").Value = Workbooks("test11.xlsx").Worksheets(1).Range(Cells(1, 1), Cells(2, 2)).Value '(3) だめ 'Workbooks("test1.xlsm").Worksheets(1).Range("A1:B2").Value = Workbooks("test1.xlsm").Worksheets(1).Range(Cells(3, 3), Cells(4, 4)).Value  '(4)だめ 'Workbooks("test1.xlsm").Worksheets(1).Range("A1:ii8000").Value = Workbooks("test11.xlsx").Worksheets(1).Range("a1:ii8000").Value  '(5) ok End Sub

  • 2つのvbaを統合したい

    はじめまして、vba初心者のものです。 よろしくお願いします。 以前こちらに質問させて頂いたことがあります。 その以前質問して回答して頂いた2つのソースを一つに統合したいです。 1、参照元ブックと貼り付けブックの2つが存在します。 2、参照元ブックの名前の指定する必要はあると思いますが、 貼り付け先ブックは新規作成にしたいです。 3、「▼質問タイトル:vba ブック間でシート名のコピーをするには」の動作は、 貼り付け先ブックの各シートに反映されるようにしたいです。 何卒よろしくお願いします。 「▼質問タイトル:vba ブック間でシート名のコピーをするには」 http://okwave.jp/qa/q8727280.html sub macro1()  dim wb1 as workbook  dim w2 as worksheet  dim i as long ’2つのブックは既に開いている事  set wb1 = workbooks("オリジナルブック.xlsm") ’拡張子まで正しく指定する事  set w2 = workbooks("貼り付け先ブック.xlsx").worksheets(1) ’同上 ’準備  w2.range("A:A").clearcontents  w2.range("A:A").numberformat = "@"  w2.range("A1") = "シート名一覧" ’転記  for i = 1 to wb1.worksheets.count  if wb1.worksheets(i).name = "Sheet1" then exit for  w2.range("A65536").end(xlup).offset(1) = wb1.worksheets(i).name  next end sub 「▼質問タイトル:セルの項目をシート名にしたい」 http://okwave.jp/qa/q8727637.html sub macro1()  dim h as range  dim s as long, i as long  s = worksheets.count + 1 ’シートを作る  for each h in range("C3:B" & range("C65536").end(xlup).row)  worksheets.add after:=worksheets(worksheets.count)  activesheet.name = h.value  next ’別のブックにする  for i = worksheets.count to s step -1  worksheets(i).select false  next i  activewindow.selectedsheets.move end sub

  • Excel2007VBA ブックのアクティブ化

    ●質問の主旨(2点) 1.以下のコードは、なぜエラーが返されるのでしょうか? 2.タスクバーにあるアクティブ状態ではないブックの1枚目シートを 選択するためには、以下のコードをどのように書き換えれば良いでしょうか? ●質問の補足 タスクバーにはエクセルブック「Book1」と「Book2」を表示させ、 「Book1」の「sheet1」がアクティブになっています。 Book1の標準モジュールに以下のコードを記述しています。 Sub sample1() Workbooks("Book2.xlsx").Activate Worksheets("sheet1").Select End Sub しかし実行すると「実行時エラー9インデックスが有効範囲にありません」と エラーが返されます。なぜそうなるのかが分かりません。 ご存知の方がいらっしゃればご教示よろしくお願い申し上げます。 私はVBA初心者です。

  • Excel VBAで他のワークブックからのコピぺの仕方について

    Excel VBAで開いている全てのワークブックから決められたセルの中身とそのシート名をそれぞれ決められた一つのワークブックにコピぺする マクロを作りたいのですが、どうやって作って良いのかが分かりません。 例えば、 Sub Mac() For i = 1 To 100 Workbooks("Book1.xls").Worksheets("sheet1").Range(Cells(2108, 2), Cells(3108, 2)).Cut Destination:=Workbooks("Book1.xls").Worksheets("sheet1").Cells(13, 2) End Sub みたいにすれば良いと思うのですが、開いている全てのファイルからのコピぺってどうやって記述するのでしょうか? 何卒よろしくお願い致します。

  • Excel2003VBA

    お世話になっております。 手作業マクロの記録で下記作業を行い、一部修正をして一度はうまく動作していたのですが 1点 問題が御座いまして独自に色々試していたのですが、どうにもうまくいかないので どなたかご教授いただけませんでしょうか。 Sub ●●用() ' ' ●●用 Macro ' 12月1月の店舗を抽出し新しいブックに移動する。 ' Selection.AutoFilter Field:=3, Criteria1:="=12月", Operator:=xlOr, _ Criteria2:="=1月" Selection.AutoFilter Field:=8, Criteria1:="(店名)" Range("A4:W2076").Select Selection.Copy Sheets.Add ActiveSheet.Paste Application.CutCopyMode = False Worksheets("Sheet1").Select Worksheets("Sheet1").Move Workbooks("営業部まとめ.xls").Sheets("全件表示").Activate Selection.AutoFilter Field:=3 Selection.AutoFilter Field:=8 Range("A5").Select ActiveWorkbook.Save End Sub まず、 >Worksheets("Sheet1").Move ここだけあれば >Worksheets("Sheet1").Select こっちは必要ないでしょうか? あと、上記の中で > Worksheets("Sheet1").Select この部分なのですが、毎回「Sheet1」とは限らないので「アクティブシート」にしたいと思い色々試してみましたが 全てエラーとなり、結局元にもどしてしまいました。 > Worksheets("Sheet1").Move あと出来ればこれも移動させた後でデスクトップに名前を付けて保存までしたいのですが どのようなコードを追加すればよろしいでしょうか。 宜しくお願い致します。

  • Excel VBAでの初期設定

    Excel VBA 初心者です。Excelは2013です。VBAでBookを開いたときにあるシートの初期設定をしたいと考えています。Activateイベントを使おうと思いましたがイベントが発生しないことがあるため質問しています。 例として以下のようなコードを記述したとき、sheet1以外を開いて保存している場合にはActivateイベントは発生しますが、sheet1を開いて保存している場合にはイベントが発生しないため初期設定の処理ができませんでした。 対応方法をお分かりの方ご教授いただけないでしょうか。 ============================= '"以下をThisWorkbook"に記述 Private Sub Workbook_Open() '②Worksheets("sheet2").Activate も入れれば Activateイベントは発生する Worksheets("sheet1").Activate '①もともと sheet1がActiveで保存されていた場合、Activateイベントは発生しなかった End Sub ============================= '"以下をsheet1"に記述 Private Sub Worksheet_Activate() '初期設定処理 MsgBox "sheet1の初期設定をしました" End Sub ============================= 宜しくお願いします。