お世話になります。
Excel2013で、添付のように例えばB2:B6まで穀物と入っていれば、D2:D6セルに「穀物」という名前を定義し、以下同様にB7:B9は野菜なのでD7:D9に「野菜」という名前を定義する、みたいにしたいのですが、どうすればよろしいでしょうか?対象は、2行目から最終行までです。定義する数が多いので、なるべく高速で処理できる書き方の方がありがたいです。
VBAでの名前の定義は、あまり向いていないという話はありますが、名前の定義のやり方が分からない方に使っていただくので、申し訳ございませんがよろしくお願いいたします。
No.1ベストアンサー
- 回答日時:
面倒なアルゴリズムなど使わずに、Dictionary オブジェクトでやってみました。
'//
Sub RegistNames()
Dim dic As Object
Dim c As Variant, i As Long
Dim adr As String, aRng As Range
Dim n As String, buf As String
Set dic = CreateObject("Scripting.Dictionary")
'2行目から
For Each c In Range("B2", Cells(Rows.Count, 2).End(xlUp))
'種類の名目が存在してない時
If Not Dic.exists(Trim(c.Value)) Then
dic.Add Trim(c.Value), c.Address(0, 0) '
Else
dic.Item(c.Value) = dic.Item(c.Value) & "," & c.Address(0, 0)
End If
Next c
'以下で名前の登録が始まる
For i = 0 To dic.Count - 1
buf = dic.Items()(i)
If buf <> "" Then
'範囲をつなぎ合わせる
Set aRng = Application.Union(Range(buf), Range(buf))
adr = ActiveSheet.Name & "!" & aRng.Offset(, 2).Address(1, 1) 'Offset(,2)は、B列の2つ右先
n = dic.Keys()(i)
Names.Add Name:=n, RefersTo:="=" & adr
adr = "": n = ""
End If
Next i
Set dic = Nothing
End Sub
「VBAでの名前の定義は、あまり向いていないという話」
たぶん、これは、教えて!gooでの言い出しっぺは私だと信じています。トラブった時の処理の仕方がややこしいからです。たぶん、そういう場合は、過去ログにその対処法が出ていると思います。
No.5
- 回答日時:
それは、良かったでした。
>adrに少し付け足して、
>adr = "'" & ActiveSheet.Name & "'!" & aRng.Offset(, 2).Address(1, 1)
>のようにすると、()付きのシートも通常のシートもどちらも動作しました。
うーん、やはり私の場合は、Nameの取り扱いは、1000回に1つ程度しか使わないから、いつまでも分からなかったと思います。このシングルクォートは、自ブックの自シート(ActiveSheet)では入らなかったような気がしたのですが、正直なところ、これについては、私の守備範囲外です。ただ、この件については、覚えておくようにします。
No.4
- 回答日時:
ANo2です。
自己解決なさったとのことなので良かったです。
私が質問文を見落としていました。申し訳ありませんでした。
No.3
- 回答日時:
#1の補足についてです。
もちろん、標準モジュールで書いているかとは思いますが、今のところ、このぐらいしか思いつきません。
Application. という単語を先頭に入れてください。
Application.Names.Add Name:=n, RefersTo:="=" & adr
後は、ローカルウィンドウで、その変数の中身を調べてみないとなんとも言えません。ここで、矛盾が生じていたら、それを直さないといけません。
VBEditor 内のローカルウィンドウの状態
No.2
- 回答日時:
こんにちは
回答しようとしたら、もう#1様の回答がありましたね。
私もDictionariyで考え始めたけれど、プリミティブにチェック用配列にしてみました。
あまり要領のよい方法ではありませんが、作ってみたので載せておきます。
Sub Sample()
Dim r As Long, rw As Long, rMax As Long
Dim nam As String, rng As Range, chk() As Boolean
rMax = Cells(Rows.Count, 2).End(xlUp).Row
ReDim chk(rMax)
For r = 2 To rMax
chk(r) = True
Next r
For rw = 2 To rMax
If Cells(rw, 2) = Empty Then
chk(rw) = False
ElseIf chk(rw) Then
Set rng = Cells(rw, 2)
nam = rng.Text
For r = rw To rMax
If Cells(r, 2) = nam Then
Set rng = Application.Union(rng, Cells(r, 2))
chk(r) = False
End If
Next r
Names.Add Name:=nam, RefersTo:="=" & rng.Address
End If
Next rw
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 別シートの表の値を参照したい 2 2022/03/30 15:11
- Visual Basic(VBA) ExcelのVBAを使い、複数シートの同一箇所を、同一条件にて一括でソルバーを回す方法について 1 2022/04/23 11:49
- Visual Basic(VBA) Excel VBA 最終行を取得しVlookup関数をコピーする方法をコーディングで教えてください。 3 2023/05/11 13:14
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 1 2022/06/18 21:20
- 父親・母親 認知症の義母に泥棒呼ばわれされ際の私の対応について 8 2023/08/05 06:54
- Excel(エクセル) ExcelデータをWebページに保存した場合の名前定義 1 2023/08/01 15:38
- Excel(エクセル) エクセルで”入力シート”の文字書式の変更を”出力シート”で同じ文字書式で印刷したいです。VBA希望 4 2023/04/24 11:07
- Excel(エクセル) エクセルで名前の定義で使える文字 3 2022/08/24 09:46
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- Visual Basic(VBA) エクセルのマクロで対象ごとにシート分けしてその内容をセルに書き込みたい 9 2022/08/24 13:23
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
べき乗
-
無限から無限を引いたら何にな...
-
皆さん定義を教えてください 「...
-
1未満と1以下の違い
-
ACCESS VBAでインポート定義の場所
-
eの0乗は1ってどういう原理です...
-
p⇒q=(¬p)∨qについて
-
「logx^2=2logx」が間違って...
-
ACCESS IIF関数 複数条件の設...
-
なぜ、直角三角形ではないのにs...
-
Excelファイルの「数式」タブ→...
-
0^1(0の1乗)はいくつでしょ...
-
-2は2の倍数ですか?
-
日本語 ことば ひとまわり ふた...
-
「互いに素」の定義…「1と2は互...
-
正方行列ではない行列にも行列...
-
e<3の証明を教えてください。
-
2変数関数の極値について
-
なぜ小数は自然数ではないので...
-
ノルム空間
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
皆さん定義を教えてください 「...
-
べき乗
-
1未満と1以下の違い
-
無限から無限を引いたら何にな...
-
理論物理学でよく用いられる地...
-
(-1) ^2πってなんで1じゃないん...
-
ACCESS VBAでインポート定義の場所
-
変数の宣言の名称を教えてくだ...
-
「互いに素」の定義…「1と2は互...
-
日本語 ことば ひとまわり ふた...
-
ACCESS IIF関数 複数条件の設...
-
質問の定義が分からないので確...
-
なぜ、直角三角形ではないのにs...
-
min関数 一橋大学過去問
-
質問の定義が分からないので確...
-
ヘシアンが0の場合どうやって極...
-
excel vba 名前付きセルが存在...
-
数字の1とは何なのか?
-
マイナス7は素数ですか?
-
「logx^2=2logx」が間違って...
おすすめ情報
どうもありがとうございます。
申し訳ございませんが、
Names.Add Name:=n, RefersTo:="=" & adr
で、実行時エラーが出てしまいました。
どのように修正すればよろしいでしょうか?
中身を見ていて気になるのは、シート名がSheet3 (2)となっていたのでシート名のかっこを消去したらエラーがでなくなりました。"Sheet3!$D$2:$D$6"は大丈夫ですが、"Sheet3 (2)!$D$2:$D$6"となっているとダメみたいですね。なぜでしょうかね?
Application.Names.Add Name:=n, RefersTo:="=" & adrにしても同じでした。
とりあえず、実際に使う部分ではそのようなシート名では使用しないので大丈夫だとは思います。
どうもありがとうございました。
考えて下さりどうもありがとうございました。
動作に問題ないと思っていたら、参照範囲が思っていたのと違っていました。
例えば、D2:D6の品名の方を取得したいところが、B2:B6を取得するようになっていました。
どうすればよいでしょうか?
先ほどのfujillinさんへの補足ですが、自己解決しました。
Names.Add Name:=nam, RefersTo:="=" & rng.Offset(, 2).Address
Offset(, 2)を追加変更することで解決しました。
どうもありがとうございました。
№3の補足に対して。
あれから、自己解決しました。
adrに少し付け足して、
adr = "'" & ActiveSheet.Name & "'!" & aRng.Offset(, 2).Address(1, 1)
のようにすると、()付きのシートも通常のシートもどちらも動作しました。
どうも、ありがとうございました。