Excel (VBA)

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

 
(Windows 10全般 : Excel 2016)
選択範囲に名前を付ける際に名前を参照したい
投稿日時: 22/12/08 15:39:12
投稿者: manabu315

Range(Cells(2, 1), Cells(5, 1)).name = "範囲の名前"
でA2:A5のセルに「範囲の名前」という名前がつくところまではできたのですが、
A1セルに「範囲の名前」と入力しておいて
A2:A5のセルにA1セルの中身(「範囲の名前」)という名前を付けたいのですが
うまくいきません。
Range(Cells(2, 1), Cells(5, 1)).name = WorksheetFunction.Text(Cells(1, 1), "")
どのように指定すればよいでしょうか?

回答
投稿日時: 22/12/08 15:57:01
投稿者: simple

Cells(1, 1)には何が入っているんですか?
そして、“”という表示形式にする意図は?
Debug.Print WorksheetFunction.Text(Cells(1, 1), "")
などとして、正しい文字列が指定されているか確認されましたか?
 
コードの右辺は、単にCells(1,1).Textか、またはCstr(Cells(1,1)) ではまずいですか?

投稿日時: 22/12/08 16:29:31
投稿者: manabu315

Cells(1,1)には「範囲の名前」という文字列が入っています。
 
Dim blockname As String
blockname = WorksheetFunction.Text(Cells(1, 1), "")
Range("f2").Value = blockname
 
でf2セルに「範囲の名前」と表示されるのですが・・・。
 
右辺をCells(1,1).Textか、またはCstr(Cells(1,1))におきかえてみたところ
「この名前の構文が正しくありません」というエラーに変わりました。

回答
投稿日時: 22/12/08 16:51:02
投稿者: simple

引用:
名前を付けたいのですがうまくいきません。
うまくいかないというのは、
何をもってそう判断されたのか示してください。
名前の設定ができていないというのを、どのような事実をもとに判断したのかという点です。

回答
投稿日時: 22/12/08 16:54:53
投稿者: WinArrow
投稿者のウェブサイトに移動

>WorksheetFunction.Text(Cells(1, 1), "")
のような、まどろっこしいものではなく
すなおに
Range("A1"),Value
 
でよいと思いますが・・・・

投稿日時: 22/12/08 17:22:41
投稿者: manabu315

VBAを流してみるとエラーが発生するため、デバッグボタンを押すとこの行が黄色くハイライトされます。
Range(Cells(2, 1), Cells(5, 1)).name = WorksheetFunction.Text(Cells(1, 1), "")
 
したがって、VBAの文法に則っていない=うまくいかないと判断しています。
 
ちなみに
右辺を Range("A1"),Value としても変化有りませんでした。

回答
投稿日時: 22/12/08 18:10:33
投稿者: WinArrow
投稿者のウェブサイトに移動

>Range(Cells(2, 1), Cells(5, 1)).name = WorksheetFunction.Text(Cells(1, 1), "")
このコードは、掲示板に手入力したものですよね?
 
実際のコードを掲示して貰わないと、
判断できません。

回答
投稿日時: 22/12/08 18:41:43
投稿者: simple

エラーになるということであったのなら、最初から、
・正確なコードの提示(VBEからコピーペイストしてください)
・正確なエラーメッセージ
・関係する変数などの提示
をお願いします。質問にあたっての基本です。
私はここまでです。

回答
投稿日時: 22/12/08 20:24:57
投稿者: simple

「この名前の構文が正しくありません」をキーワードに、ネットで検索してください。
バグにからんだものである可能性があります。

回答
投稿日時: 22/12/08 22:49:09
投稿者: WinArrow
投稿者のウェブサイトに移動

>Range(Cells(2, 1), Cells(5, 1)).name = WorksheetFunction.Text(Cells(1, 1), "")
実際のコードは、エラーになっているということで、
このコードとは違います。
 
名前定義という観点で、検索すると、
つぎのようなコードが一般的ではないか・・と思います。
 

Sub 名前定義()
    With ThisWorkbook
        .Names.Add Name:=Range("A1").Value, RefersTo:=Range("A2:A5")
    End With
End Sub

 
結果は、同じです。
 
掲示のコードも
Range("A2:A5").Name = Range("A1").Value
こう書けば、可読性は向上します。
 
今回の名前定義は、ブックレベルで名前リストに登録されます。
仮に、アクテイブシートが"sheet1"だとして、
Sheet2をアクティブにして同じコードを実行すると、
「アプリケーションの定義、または、オブジェクトの定義のエラー」
というメッセージでエラーになります。
エラーメッセージだけでは、原因がよくわからないと思いますが、
「同じ名前」が既に定義されている・・・というエラーです。
 
つまり、ブックレベルでは、当該ブック内では、一意にする必要があります。
 
ここで、気をつけなくてはいけないことがあります。
 
セル範囲をA2:A5にしていますが、同じシートで、2回実行してもエラーにはなりません。
セル範囲を別の範囲を指定しても、同じシートならば、エラーになりません。
最後に実行した時の範囲が有効です。
事前に同一の名前が存在するか確認することをお勧めします。
 
 
 

回答
投稿日時: 22/12/08 23:02:01
投稿者: WinArrow
投稿者のウェブサイトに移動

気を付けること・・・その2
 
Sheet1のセル範囲に名前定義しっとして、
Sheet1を複写してSheet2を作成した時
名前複写されます。
前レスでは、ブック内では、一意という説明をしましたが、
Sheet2にも同じ名前になります。
但し、Sheet2は、シートレベルの名前になります。
 
意図的にシートレベルで名前を定義したのであれば、参照する時、注意すると思いますが、
複写時には気が付かないことがあります。
他ブックにシートお複写時でも同じことが言えます。
 
名前定義したシートを複写する場合は、思わぬところで、予想外の結果(落とし穴)が
あるとう言うことを覚えておきましょう。
 

投稿日時: 22/12/09 08:20:55
投稿者: manabu315

利用方法に不慣れなせいでご迷惑をおかけして申し訳ありませんでした。
また、ご丁寧な説明を頂けて感謝しております。
理解力が不足しており、これからご説明の内容を調べていく段階ですが
一旦クローズとさせていただきます。
ありがとうございました。