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

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

このQ&Aのポイント
  • ExcelでVBAで設定値を書いたシートを参照する際に、名前付きセルを利用する方法について教えてください。
  • 名前付きセル範囲を手動で作成し、それを参照するVBAコードを書いていますがうまくいきません。
  • 標準モジュールでは正しく動作するのに、Sheet1モジュールのイベントに同じコードを書くとエラーになります。理由がわかりません。お助けください。

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

  • ベストアンサー
回答No.1

こんにちは。 シンプルに、    MsgBox Evaluate("起動Path").Value または    MsgBox Application.Range("起動Path").Value という風に、参照先をExcelアプリケーション経由で取得します。 ブックレベルで定義した名前でしたらば、 Evaluateメソッドとの組み合わせが親和性が高いですね。 > Sheet1モジュール で > MsgBox Range("起動Path").Value がエラーになるのは、  Sheet1.Range("起動Path") のように親オブジェクトを省略しないで書けば、 解るのではないでしょうか。 標準モジュールに書いた場合は  Application.Range("起動Path") の省略形になりますから、エラーにはなりません。 以上です。

momono14
質問者

お礼

たびたびの補足を頂きありがとうございました。 お礼を分散させるのも読みにくいと思いましたので、 こちらに書かせて頂きます。 設問に対してコメントをいただけると面はゆいですが、 こちらこそ回答No.1の内容は完璧と思っていたので、 「説明が雑過ぎた」という内省にびっくりしました。 質問者が「わかってないであろう事」に目星を付けた上で、 端的な事例で挙げてみて観測気球として使い、 「理解がここに到達しているか」の確認をしつつ、 質問者は単語を検索すれば、調べるべき周辺知識が 広がるという感じでしたので、某囲碁漫画の指導碁のようで 思わず唸っておりました。 補足の方も、かゆいところに手が届くような内容で、 とても助かりました。 完全につかめたわけではないですが、補足前はわからなかった Application.Rangeとsheet1.Rangeはなんとなくわかりました。 気持ちとしては長文説明を頂いた回答3を持ち上げたいのですが、 QAとして他の人がわかりやすくなるように、こちらの回答をBAと させて頂きます。 また何かありましたらよろしくお願いします。 ありがとうございました。

momono14
質問者

補足

いつもお世話になります。 内容を読んでみて、 「Evaluateって何?ってevalの事か…ってなんでこのeval式で値が出てるの!?」 とか 「Applicationって初めて見た…ってシートもブックも超えてこのレベルからRangeって有効なの!?」 とか 「標準モジュールでの省略Rangeってアクティブシートにつながってるんじゃなかったっけ?なんでApplication?」 とか元々のうろ覚えからの齟齬が激しくて混乱してますが、 試したら何の問題も無く動いてるので正しいんですよねコレ… なんといいますか、ExcelVBAって少し欲を出して手を入れると途端に 絶壁のような知識の壁にぶち当たってなかなか厳しいですね

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

回答No.4

誤解を招きそうなので、訂正します。 No.3、最後から2(3)行め > ... 、でも ... これは、  ... 、でも、質問者に対して ... という意味で書きました。 それにしても私の文章の主述が乱れていることについてはスルーの方向ででお願いします。 重ねて失礼しました。

全文を見る
すると、全ての回答が全文表示されます。
回答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関数を使う目的を理解するのも容易なことですし、 質問の趣旨からしてそれ以上説明する必要もなく、 といって全く目的に触れないでいては混乱を招く可能性があることを考えると、 ピッタリ必要十分だと、私は、思っています。 まぁ、人それぞれでいいのですけれどね、でもケチつけるのは違うと思います。 失礼しました、それではまた。

全文を見る
すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

何を聞いているのかよくわからない。 ーー エクセルVBAで名前を設定して参照するのは、(私が言う「名前」とは、セル範囲に名前を付けるという意味です) Sub test01() Names.Add Name:="範囲A", RefersTo:="=$A$2:$C$5" 'Worksheets("Sheet1").Range("範囲A").Select 'Sheet1において Range("範囲A").Select ’ActiveSheetにおいて End Sub のようにするのが骨子ではないでしょうか。 >テスト関数で 関数ではありません。関数ならFunction aaa()  End Function のようになるはずです。 >Shell ここでShellを使う意味がわからない。 ーー Range("起動Path").Value は1セルだけに、名前を定義したのかな。 複数セルだとValueプロパティを使う意味が分からない。 Sub test02() Names.Add Name:="範囲A", RefersTo:="=$A$2:$a$3" MsgBox Range("範囲A").Value End Sub はエラー(Msgboxの関連?) ーー Sub test02() Names.Add Name:="範囲A", RefersTo:="=$A$2" MsgBox Range("範囲A").Value End Sub を実行してみるとOKのよう。 ーー 1セルだけの名前定義の場合 Sheet1のイベントで Private Sub Worksheet_SelectionChange(ByVal Target As Range) MsgBox Worksheets("Sheet2").Range("範囲A").Value End Sub はOK ・イベントを登録しているシートと名前範囲を指定しているシート ・名前定義が、ブックレベルかシートレベルか などチェックしてみては。 ーー わたしが無知のおそれもあるので、その際は後免。

momono14
質問者

補足

すいません、何を書かれているのかよくわかりません…

全文を見る
すると、全ての回答が全文表示されます。

関連する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 ============================= 宜しくお願いします。

専門家に質問してみよう