Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 11 Home : Excel 2019)
列に名前を付けてrangreやcellsで参照したい
投稿日時: 25/06/27 09:36:25
投稿者: otake@inpac.jp
投稿者のウェブサイトに移動

例えばA列に名前を付けて Range(付けた名前 & ”5”)の様にするとエラーになってしまいました。
この様な使い方は出来ないのですか?

回答
投稿日時: 25/06/27 10:22:03
投稿者: 半平太

>Range(付けた名前 & ”5”)の様にするとエラー
 
「付けた名前」と云うのが何なのか、エクセルには分からないですからねぇ。
 
    Debug.Print Range("付けた名前").Cells(5, 1)
    Debug.Print Range("付けた名前").Cells(5)
    Debug.Print Range("付けた名前")(5)
などですかね。

回答
投稿日時: 25/06/27 12:28:50
投稿者: MMYS

otake@inpac.jp さんの引用:
例えばA列に名前を付けて Range(付けた名前 & ”5”)の様にするとエラーになってしまいました。

「名前の定義」機能はセル範囲に名前を付ける機能です。この場合、「付けた名前 」のセル範囲はA列全体を指定したことになります。「名前の管理」でご確認すると分かりますが、=Sheet1!$A:$A となっているはずです。
つまり、提示の記述では、下記のように解釈されます。
 
 Range("Sheet1!$A:$A" & "5")
 
ですので、
 
 Range("Sheet1!$A:$A5")
 
となり、当然エラーです。
 
 
なお、解決方法は、すでにレスが付いている通り、指定範囲内てRangeオブジェクト指定。さらにその範囲内をRangeオブジェクトで指定します。つまり、最初のRangeオブジェクト。その直後に、ピリオドでつなげて、Rangeオブジェクトで、セルアドレスを指定する。
 
  Debug.Print Range("付けた名前").Item(3).Value
  Debug.Print Range("付けた名前").Range("A3").Value
  Debug.Print Range("Sheet1!$A:$A").Item(3).Value
  Debug.Print Range("Sheet1!$A:$A").Range("A3").Value
 
 

回答
投稿日時: 25/06/27 13:14:44
投稿者: simple

エラーメッセージを正確に示してもらうと良かったと思います。
 
(1)冒頭に Option Explicit を書いておくと、
    変数が定義されていません、というエラーになります。
(2)そうでない場合は、実行時エラーになります、たぶん。
    付けた名前
    は、構文解釈上はVBA変数と解釈されますが、ワークシート上で定義された名前と
    VBA変数の名前は無関係です。
    付けた名前 と言う変数は Variant型で値は""ですから、Range("5")と指定したことになります。
    こういうRangeの使い方は許されていません。
 
名前定義した範囲名を指定するなら、既に指摘いただいているように
Range("付けた名前")とする必要があります。
そこが出発点ではないですか?
 
ちなみに、moduleを作ったときに自動的に Option Explicitを挿入する設定が、
VBEのツール - オプション にあります。変数の宣言を強制する、にチェックを入れることを推奨します。
一生に?一度だけでOKです。
こうすれば、タイプミスによる変数間違いのようなことが起きません。定義せずに使えないからです。
またVariant型はできるだけ避けて、具体的な型を指定するほうが好まれます。
Rubyなどとは違います。

投稿日時: 25/06/27 14:25:44
投稿者: otake@inpac.jp
投稿者のウェブサイトに移動

皆様 色々ありがとうございます。
debug.print を使ったことが無いので、よくわからないのですが、これはイミディエイトウィンドウに出力するようですが、この得られたデーターをVBAの中で変数に代入する事は出来るのですか?

投稿日時: 25/06/27 15:15:35
投稿者: otake@inpac.jp
投稿者のウェブサイトに移動

大変失礼をいたしました。皆様のメッセージは理解できました。
又、イミディエイトウインドウに、データーを表示することは出来ております。
特に、Range("付けた名前")とする にあるダブルコーテーションがご指摘の通りでした。
そもそも 付けた名前 はストリング変数と解釈したところがあって、なんでまたダブルコーテーションを付けるのかわかりませんでした。
 
質問を入れた目的はVBAの変数のへの代入に名前を付けた列を使う事でしたので、皆様のご指摘を理解したうえで、どうやって代入するのかわかりませんでしたので、このような質問になり申し訳ありません。

回答
投稿日時: 25/06/27 15:26:31
投稿者: MMYS

Debug.Print ですが、
 
Debug (デバッグ)
Print (プリント)
 
とある通り、Debug.Print はデバック時に、変数の値が想定どおりか確認するためのもの。デバック時に怪しい動きをする部分に
 

Sub Method
 コード
 コード
 コード  (バグと疑われる怪しい部分)
  Debug.Print 変数
 コード  (バグと思われる怪しい部分)
 コード
 コード
Sub Method

とDebug.Print コードを埋め込み、実行時にイミディエイトウィンドウに変数の値を表示させます。そして変数の値が、想定と違う値が表示されたら、その部分にバグが潜んでいると絞り込むために使います。
 
 
otake@inpac.jp さんの引用:
この得られたデーターをVBAの中で変数に代入する事は出来るのですか?

「この得られたデータ」とは何を指してのことですか。たとえば、先の
  Range("付けた名前").Item(3).Value
も、イミディエイトウィンドウの表示値は、セル値ですよね。
 
 

投稿日時: 25/06/27 15:34:37
投稿者: otake@inpac.jp
投稿者のウェブサイトに移動

ありがとうございます。難しく考えすぎたようですね、おっしゃる通り単純に
変数名=Range("付けた名前").Item(3).Value
とすればいいだけでね。
お騒がせしました。 これでクローズしますので、お答えいただいた皆様に再度、お礼をいたします。