質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

863閲覧

ワークシートから検索してきた値を定数名として扱いたいです。

sumire_cl

総合スコア228

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2017/10/18 06:00

###前提・実現したいこと

Excelのワークシートに、こういうような、人名と守備位置が一覧になっている表を作っておいて

Excelシート名「選手一覧」 A B 荒木 二塁 高橋 三塁 藤井 左翼 平田 右翼 森野 一塁 大島 中堅 福 投手 桂 捕手

定数として以下のように定義します。

VBA

1const 投手 = "1" 2const 捕手 = "2" 3const 一塁 = "3" 4const 二塁 = "4" 5const 三塁 = "5" 6const 遊撃 = "6" 7const 右翼 = "7" 8const 中堅 = "8" 9const 左翼 = "9" 10const 不明 = "0"

これで、たとえば
「大島」
って入力したら
「8」
って返ってくるようにしたいのです。

「大島」って入れたら「中堅」って返ってくるのは、こんなのを書きました。
これで「findDP("大島")」ってやったら「"中堅"」って返ってきます。

VBA

1Function findDP(men) 2 3 Dim dbSh As Worksheet 4 Set dbSh = ThisWorkbook.Worksheets("選手一覧") 5 dbSh.Activate 6 7 Dim tmpStr As String 8 Dim dbEndRow As Long 9 dbEndRow = dbSh.Cells(Rows.Count, 1).End(xlUp).Row 10 11 Const dbFindCol As Integer = 2 ' 戻り値にする列 12 13 'Match関数で検索する範囲とIndex関数で返答する範囲を指定する 14 Dim dbRng, codeRng As Range 15 Set codeRng = Range(dbSh.Cells(2, dbFindCol), dbSh.Cells(dbEndRow, dbFindCol)) 16 Set dbRng = Range(dbSh.Cells(2, 1), dbSh.Cells(dbEndRow, 1)) 17 18 'Match関数で、引数で指定した人名が入力されている行数を求めた後、Index関数で対象行に格納された守備位置を取り出す 19 tmpStr = Application.WorksheetFunction.Index(codeRng, Application.WorksheetFunction.Match(men, dbRng, 0), 1) 20 On Error Resume Next 21 If Err.Number <> 0 Then ' みつからなければ「不明」と返す 22 tmpStr = "不明" 23 Err.Clear 24 End If 25 26 findDP = tmpStr 27 28End Function

###発生している問題

この返ってきた「中堅」を、定数として扱って「8」と読むためにはどうしたらいいか
というところがわかりません。

###補足情報(言語/FW/ツール等のバージョンなど)
Win10、Excel2016です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

質問のように文字列をキーにして、値を取得したい場合は、ディクショナリを使うのが良いです。

ディクショナリを用意するコードは、以下のような感じです。

Dim baseballPositionDict as Object 'ディクショナリの変数を定義 set baseballPositionDict = CreateObject("Scripting.Dictionary") 'ディクショナリのオブジェクトを作って、変数に代入 「CreateObject("Scripting.Dictionary")」のところは、おまじないだと思って覚えてください。 ` ディクショナリに、キー(検索に使う値)と、それに対して返される値の組を、加えていきます baseballPositionDict.Add "投手","1" ' "投手"がキー、"1"がそれに対応する値です。 baseballPositionDict.Add "捕手","2" baseballPositionDict.Add "一塁","3" baseballPositionDict.Add "二塁","4" baseballPositionDict.Add "三塁","5" ' 途中は省略 baseballPositionDict.Add "中堅","8" ' 途中は省略 baseballPositionDict.Add "不明","0"

このようにしてディクショナリに守備位置と背番号の組を登録した後は、Itemメソッドで値を取得することが出来ます。
例えば、baseballPositionDict.Item("中堅")は、"8"を返します。

このディクショナリを使って、「大島」って入力して「8」って返ってくるようにするには

baseballPositionDictionary.Item(findDP("大島"))

投稿2017/10/18 06:41

coco_bauer

総合スコア6919

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sumire_cl

2017/10/18 07:06 編集

つまり、ディクショナリって連想配列ですね! ってことはプロシジャの中でオブジェクトを作って変数に代入して…という作業が必要になり…。 守備番号の一覧表は標準モジュール内のいろんなプロシジャで使うのでPublicで定数にしたんですが ここんとこがまずかったということですね…。 プロシジャの外でディクショナリに値を入れて、いろんなプロシジャで参照できる方法ってあるでしょうか?
guest

0

選手一覧を作っているのなら、
守備位置一覧を作ればよいかと。

選手一覧のC列に、数式(Vlookup等)を追加し、
守備位置を検索して値を出しておけば、
わざわざプログラムで処理する必要が無いかと。

投稿2017/10/27 03:17

ExcelVBAer

総合スコア1175

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Const "1" = 投手 にすればよいのでは?
↑すいません。試してみたら無理でした。

投稿2017/10/18 06:05

編集2017/10/18 06:07
King_of_Flies

総合スコア382

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

King_of_Flies

2017/10/18 06:24 編集

findDP("大島")で取得した中堅はConstで定義した中堅=8になっているので、 Debug.Print(中堅)で8が帰ってきているか見てみてください。
King_of_Flies

2017/10/18 06:24

イミディエイト ウィンドウで出力が見れます。
sumire_cl

2017/10/18 06:32

イミディエイトウィンドウで ?中堅 ってやると、8が返ってきます。
sumire_cl

2017/10/18 06:35

わからないのは findDP("大島")で返ってきた「中堅」は、定数で定義されている「中堅」と同じものですよ とExcelにわかってもらうための方法です…。
King_of_Flies

2017/10/18 06:40

tmpStrが大島になっているのを8にしたいってことでしょうか?
King_of_Flies

2017/10/18 06:42

findDpの呼び出し元のコードを見せてください。
sumire_cl

2017/10/18 06:57

したいことは 「大島」 って入力したら 「8」 って返ってくるようにしたいので 外のコードはどんなんでもかまいません。 findDPは 大島→中堅→8 っていう参照をしたいためにとりあえず書いてみたものなので なんならfindDP自体使わなくてもいいと思っています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問