Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5230 / 13644 ツリー ←次へ | 前へ→

【51822】ユーザー定義関数のエラー?(調査依頼) G-Luck 07/10/6(土) 14:08 発言[未読]
【51834】Re:ユーザー定義関数のエラー?(調査依頼) ichinose 07/10/6(土) 19:55 発言[未読]
【51912】Re:ユーザー定義関数のエラー?(調査依頼) G-Luck 07/10/10(水) 23:14 発言[未読]
【51929】Re:ユーザー定義関数のエラー?(調査依頼) ichinose 07/10/12(金) 9:49 発言[未読]
【52007】Re:ユーザー定義関数のエラー?(調査依頼) G-Luck 07/10/16(火) 8:15 発言[未読]
【52008】Re:ユーザー定義関数のエラー?(調査依頼) ichinose 07/10/16(火) 8:38 発言[未読]
【52010】Re:ユーザー定義関数のエラー?(調査依頼) ichinose 07/10/16(火) 9:20 発言[未読]
【52012】Re:ユーザー定義関数のエラー?(調査依頼) G-Luck 07/10/16(火) 10:15 お礼[未読]

【51822】ユーザー定義関数のエラー?(調査依頼)
発言  G-Luck  - 07/10/6(土) 14:08 -

引用なし
パスワード
   確認をお願いたします。
ちなみに、私の環境は、WinXP Excel2003 SP3, VB V6.5

Sheet1のA1セルに、名前を定義 仮に「mm」 A1に適当に Sheet1と入力
Sheet2のA1セルに、名前を定義 仮に「Sheet2!mm」 A1に適当に Sheet2と入力

Sheet1のA2セルに 「=m()」と入力

以下VBA
標準モジュールに以下入力

Public Function m()
  m = ThisWorkbook.mm.Value
End Function

ThisWorkbookに以下入力

Public Property Get mm() as Range
  Set mm = ThisWorkbook.Names("mm").RefersToRange
End Property

それで、Sheet1のA2セルを見ると、Sheet1と表示される。
そこで、Sheet1とSheet2の順番を入れ替えると、Sheet2と表示される。

シート別に同じ名前を多用しようと考えていたので、少々困っています。
ご存知のことがありましたら教えてください。

【51834】Re:ユーザー定義関数のエラー?(調査依頼)
発言  ichinose  - 07/10/6(土) 19:55 -

引用なし
パスワード
   ▼G-Luck さん:
こんばんは。

>確認をお願いたします。
>ちなみに、私の環境は、WinXP Excel2003 SP3, VB V6.5
確認した環境は、Win2000 Excel2002 SP3です。

提示された現象を確認しました。

Names("mm")の指定での検索順序とシート位置に因果関係があるのでしょうかねえ!!

>シート別に同じ名前を多用しようと考えていたので、少々困っています。

シート別の名前なら、

Worksheets("sheet2").Names("mm").RefersToRange



ThisWorkbook.Names("Sheet2!mm").RefersToRange

というようにシート名からの指定ではっきり指定すると言う方法では
いけないのですか?

【51912】Re:ユーザー定義関数のエラー?(調査依頼)
発言  G-Luck  - 07/10/10(水) 23:14 -

引用なし
パスワード
   ▼ichinose さんへ
確認ありがとうございます。
新たに、発見
セルに =Sheet1!mm と入力するとに =Book.xls!mm に
=Book1.xls!mm と入力すると =Sheet2!mm 書き変わる。

>シート別の名前なら、
>
>Worksheets("sheet2").Names("mm").RefersToRange
>
>や
>
>ThisWorkbook.Names("Sheet2!mm").RefersToRange
>
>というようにシート名からの指定ではっきり指定すると言う方法では
>いけないのですか?

Book全体のmmを持ちつつ使い分けたいと考えていたのです。(あっしの思想的に)
VBA上で ThisWorkbook.Names("Book1.xls!mm").RefersToRange
というのもうまくいかないようですし。
名前を変えて運用しますかね〜

【51929】Re:ユーザー定義関数のエラー?(調査依頼)
発言  ichinose  - 07/10/12(金) 9:49 -

引用なし
パスワード
   おはようございます。

>新たに、発見
>セルに =Sheet1!mm と入力するとに =Book.xls!mm に
>=Book1.xls!mm と入力すると =Sheet2!mm 書き変わる。
>
>>シート別の名前なら、
>>
>>Worksheets("sheet2").Names("mm").RefersToRange
>>
>>や
>>
>>ThisWorkbook.Names("Sheet2!mm").RefersToRange
>>
>>というようにシート名からの指定ではっきり指定すると言う方法では
>>いけないのですか?
>
>Book全体のmmを持ちつつ使い分けたいと考えていたのです。(あっしの思想的に)
>VBA上で ThisWorkbook.Names("Book1.xls!mm").RefersToRange
>というのもうまくいかないようですし。
>名前を変えて運用しますかね〜
独自の名前関数を作るのは? いかがですか!!

一例ですが、標準モジュールに
'===================================================
Function myname(nm As String)
  myname = Names(nm).RefersToRange.Value
End Function

として、
シートでは

=myname("mm")

とか

=myname("sheet2!mm")

等として運用する

検討してみてください。

【52007】Re:ユーザー定義関数のエラー?(調査依頼)
発言  G-Luck  - 07/10/16(火) 8:15 -

引用なし
パスワード
   ▼ichinose さん:
回答ありがとうございます

>一例ですが、標準モジュールに
>'===================================================
>Function myname(nm As String)
>  myname = Names(nm).RefersToRange.Value
>End Function
>
>として、
>シートでは
>
>=myname("mm")
>
>とか
>
>=myname("sheet2!mm")
>
>等として運用する
>
>検討してみてください。

残念ですが、上記プログラムでも同じような現象が起こってしまいます。
sheet2が並びの先頭で、「mm」を読み出す場合は、Sheet2!mmが優先されてしまいます。

問題点を整理すると
Bookレベル、Sheetレベルで同名の定義がある場合
Sheetの並びに依存されず、どのSheetからでも、Bookレベル、Sheetレベルの定義を使いわけれるようにしたい。
といったところでしょうか。

【52008】Re:ユーザー定義関数のエラー?(調査依頼)
発言  ichinose  - 07/10/16(火) 8:38 -

引用なし
パスワード
   おはようございます。

>残念ですが、上記プログラムでも同じような現象が起こってしまいます。
>sheet2が並びの先頭で、「mm」を読み出す場合は、Sheet2!mmが優先されてしまいます。
>
>問題点を整理すると
>Bookレベル、Sheetレベルで同名の定義がある場合
>Sheetの並びに依存されず、どのSheetからでも、Bookレベル、Sheetレベルの定義を使いわけれるようにしたい。
>といったところでしょうか。

あらっ、本当だ!! よく検証していませんでした。
失礼しました(だいたい、最初のご質問にそう書かれていましたね)。

また、何か気が付いたら投稿します。

【52010】Re:ユーザー定義関数のエラー?(調査依頼)
発言  ichinose  - 07/10/16(火) 9:20 -

引用なし
パスワード
   Function myname(nm As String) As Variant
  Dim nn As Name
  myname = [na()]
  For Each nn In Application.Names
   If UCase(nm) = UCase(nn.NameLocal) Then
     myname = nn.RefersToRange
     Exit For
     End If
   Next
End Function

関数を上記のするとどうですか?

=myname("mm")
=myname("sheet2!mm")

等。

【52012】Re:ユーザー定義関数のエラー?(調査依頼)
お礼  G-Luck  - 07/10/16(火) 10:15 -

引用なし
パスワード
   ichinose さんへ

お〜、すばらしー。
力技っすね。Excelが信用ならんなら、作ってしまえって感じすね。

勉強になりました。ありがとうございます。

5230 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free