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

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

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

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

Q&A

解決済

4回答

1397閲覧

for毎に値を渡したい

beginner_t

総合スコア716

VBA

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

0グッド

0クリップ

投稿2018/05/31 05:13

いつも勉強させて頂いております。
現在プログラムを勉強しており、引数や戻り値について学んでいます。

【実現したい処理】
・function str2()のfor毎にstr2の値をsub color()に渡したい

【起こっていること】
・function str2()の処理のforの最後の繰り返し時の値がsub color()に渡してしまう。

どうしてそうなっているのかというのは、デバッグのステップインで確認し、
理解していますが、どうすれば正しい処理ができるかがわかりません。

別の列に一度出力すれば問題なく、処理できることはわかっていますが、
値の渡し方の勉強をしたいので、宜しくお願い致します。

namecolor
りんご
みかん
ぶどう
なし
オレンジ
スイカ
きゅうり
いちご

VBA

1Sub color() 2 Dim max_row As String 3 Dim i As Integer 4 5 max_row = Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Row 6 7 For i = 2 To max_row 8 Dim color_code As String 9 10 color_code = str2() 11 MsgBox str2 12 13 14 Next i 15End Sub 16Function str2() As String 17 Dim max_row As String 18 Dim i As Integer 19 20 max_row = Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Row 21 22 For i = 2 To max_row 23 Dim str1 As String 24 25 26 27 str1 = Sheets("Sheet1").Cells(i, 2) 28 29 30 Select Case str1 31 Case "赤" 32 str2 = "red" 33 Case "黄" 34 str2 = "yellow" 35 Case "紫" 36 str2 = "purple" 37 Case "茶" 38 str2 = "brown" 39 Case "オレンジ" 40 str2 = "orange" 41 Case "緑" 42 str2 = "green" 43 Case Else 44 str2 = "不明" 45 End Select 46 47 48 49 Next i 50End Function

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

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

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

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

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

guest

回答4

0

プログラミングする場合は、
まず、自分がやりたいことを論理的な言葉で他人に誤解なく伝わるように言語化しましょう。

・function str2()のfor毎にstr2の値をsub color()に渡したい

これはやりたいことではなく手段ですよね。やりたいことが明確化していないのに、手段を考えてる時点で出発点がずれてます。

提示のデータ等から推測すると、やりたいことは下記ではないですか。

項目color(Sheet1 の B列)の値(日本語の色)を、2行目から順に最後の行まで英語に変換してメッセージで表示したい。

これができたら、これを実現する手段の手順(フロー)を考えます。
下記のようなフローになります。

  1. 項目color(Sheet1 の B列)の値を、2行目から順に取得する。
  2. 取得した値を英語に変換する。
  3. 変換した値をメッセージとして表示する。
  4. 次の行に移動。
  5. 上記を最後の行まで繰り返す。

2.を Function を使って部品化します。
Function は引数で受け取った値を変換して戻り値で返します。
名前は機能を表す適切なものにします。例えば、GetColorCode とか。

vba

1Function GetColorCode(pStr) As String 2 Select Case pStr 3 Case "赤" 4 GetColorCode= "red" 5 Case "黄" 6 GetColorCode= "yellow" 7 Case "紫" 8 GetColorCode= "purple" 9 Case "茶" 10 GetColorCode= "brown" 11 Case "オレンジ" 12 GetColorCode= "orange" 13 Case "緑" 14 GetColorCode= "green" 15 Case Else 16 GetColorCode= "不明" 17 End Select 18End Function

これを1. ~ 5. のループに組み込みます。

vba

1Sub やりたいこと() 2 Dim i As Integer 3 For i = 2 To Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Row 4 MsgBox GetColorCode(Sheets("Sheet1").Cells(i, 2)) 5 Next i 6End Sub

コードは、saziさんのものとほぼ同じです。コーディングするときの、考え方、手順を書いてみました。

投稿2018/05/31 06:20

編集2018/05/31 06:27
hatena19

総合スコア33620

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

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

beginner_t

2018/05/31 06:45

大変丁寧に教えてくださってありがとうございます。 しっかりと自分のやりたいことを整理できていなかったと思います。 やりたいことをしっかり明確化し、処理を考えたいと思います。 ありがとうございました。
guest

0

まず、関数名はちゃんと付けましょう。

str2って関数、何やってるか中を見ないと分からないし、
中を見ても分からない。

一般的には GetColor とか、ConvertColor なんて名前になるんじゃぁないでしょうか。

で、関数には、引数(材料)を渡して、それを元に「何か」を返すべきなんじゃぁないでしょうか。

ステップ実行されているなら、自分の意図と全く違う動きをしてるのは分かってると思いますから、
関数の概念を理解されるのが早いでしょうね。

シート上で使う「SUM」関数は知ってますよね?
SUM関数にセルを幾つか渡すと、合計値が返ってきますよね?
そういう感じです。

関数がちゃんと作れるようになれば、
飛躍的に実力が上がるので、がんばってください~
※名付けは重要ですから、無精しないように~

投稿2018/05/31 06:18

ExcelVBAer

総合スコア1175

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

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

beginner_t

2018/05/31 06:32

ご回答ありがとうございます。 関数の命名についても勉強したいと思います。 ご指摘ありがとうございます。
guest

0

どちらもループしてるので結局最後のものしか結果になりません。
また、こういった構造の場合、シート操作をするレベルとシートの値について処理するものとかに、
スコープを統一すると簡潔になります。

VBA

1Sub color() 2 Dim i As Integer 3 For i = 2 To Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Row 4 MsgBox str2(Sheets("Sheet1").Cells(i, 2)) 5 Next i 6End Sub 7Function str2(pStr) As String 8 Select Case pStr 9 Case "赤" 10 str2 = "red" 11 Case "黄" 12 str2 = "yellow" 13 Case "紫" 14 str2 = "purple" 15 Case "茶" 16 str2 = "brown" 17 Case "オレンジ" 18 str2 = "orange" 19 Case "緑" 20 str2 = "green" 21 Case Else 22 str2 = "不明" 23 End Select 24End Function

投稿2018/05/31 05:41

sazi

総合スコア25138

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

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

beginner_t

2018/05/31 06:55

ご回答ありがとうございます。 自分のやりたいことを明確化できていないので、 まず、処理の流れをしっかりと考えたいと思います。 ありがとうございました。
guest

0

ベストアンサー

呼び出し方向が逆じゃないですか?
str2関数の中からcolor関数を呼ばないと。
str2関数の中で戻り値に何度も値を入れても、蓄積されるわけではありません。
color関数からstr2関数を呼んでも、最後に設定した戻り値を受け取るだけです。

呼び出し方向を逆にしたサンプル。

VBA

1Sub color(str As String) ' str2関数から引数で受け取る 2' 何をやりたいのかわからないのでコメントアウト 3' Dim max_row As String 4' Dim i As Integer 5' 6' max_row = Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Row 7' 8' For i = 2 To max_row 9' Dim color_code As String 10' 11' color_code = str2() 12' MsgBox str2 13' Next i 14 15 ' 受け取った値を表示 16 MsgBox str 17End Sub 18 19Function str2() As String 20 Dim max_row As String 21 Dim i As Integer 22 Dim str As String ' color関数に渡す用の変数 23 24 max_row = Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Row 25 26 For i = 2 To max_row 27 Dim str1 As String 28 29 str1 = Sheets("Sheet1").Cells(i, 2) 30 31 Select Case str1 32 Case "赤" 33 str = "red" 34 Case "黄" 35 str = "yellow" 36 Case "紫" 37 str = "purple" 38 Case "茶" 39 str = "brown" 40 Case "オレンジ" 41 str = "orange" 42 Case "緑" 43 str = "green" 44 Case Else 45 str = "不明" 46 End Select 47 48 Call color(str) ' strの値を引数に指定して渡す 49 50 Next i 51End Function 52

追記

VBA

1Sub color() 2 Dim max_row As String 3 Dim i As Integer 4 5 max_row = Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Row 6 7 For i = 2 To max_row 8 Dim color_code As String 9 ' 行数をstr2に渡す 10 color_code = str2(i) 11 MsgBox str2 12 Next i 13End Sub 14 15' 何行目の情報が欲しいのかを受け取る 16Function str2(r as Integer) As String 17 18 Dim str1 As String 19 20 ' 引数で受け取った行の値を得る 21 str1 = Sheets("Sheet1").Cells(r, 2) 22 23 Select Case str1 24 Case "赤" 25 str2 = "red" 26 Case "黄" 27 str2 = "yellow" 28 Case "紫" 29 str2 = "purple" 30 Case "茶" 31 str2 = "brown" 32 Case "オレンジ" 33 str2 = "orange" 34 Case "緑" 35 str2 = "green" 36 Case Else 37 str2 = "不明" 38 End Select 39 40End Function 41

投稿2018/05/31 05:27

編集2018/05/31 05:46
ttyp03

総合スコア16996

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

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

beginner_t

2018/05/31 05:41

やりたいこととしては、str2()を部品として、Select caseで抽出した値をつかって、color()のforの中の値として使いたいと思っています。説明がなんとも難しいのですが、起こっていることはforの中にforが入っている状態なので、おっしゃる通り、最後の値のみが戻り値として渡されているだけになっています。これをstr2のfor毎にcolorに渡したい場合はどうすればよいでしょうか?
ttyp03

2018/05/31 05:47

str2に何行目のデータが欲しいのかを渡す必要があります。 何をしたいのかは良く考えないで書いていますが、おそらくstr2でループは必要ありません。 サンプルを追記したので確認してみてください。
beginner_t

2018/05/31 06:26

サンプルありがとうございます。 追記のコードで希望の動作をしていることを確認しました。 質問させて頂きたいのですが、 str1 = Sheets("Sheet1").Cells(r, 2)はどのような動作で動いているのでしょうか?値が入っていないのにどうやって行数をとっているのでしょうか? 稚拙な質問で恐縮ですが、よろしくお願いいたします。
ttyp03

2018/05/31 06:29

rは引数です。 ってコメントも入れておいたつもりなんですけど…。 colorで回している変数iの値をstr2を呼ぶときの引数に与えています。 それをstr2の引数rが受け取って(引き継いで)いるので、rの値は空ではありません。
beginner_t

2018/05/31 06:40

すみません。コメントの意味がわからず質問しました。 説明頂いたことを理解しきれていないので、理解できるよう、いろいろ書いてみたいと思います。大変勉強になりました。ありがとうございます。
ttyp03

2018/05/31 06:44

ん~、「引数」という概念がわかってないのでしょうかね。 関数に引数はつきものなので(VBAに限らず)いろいろ書いて勉強してみてください。
beginner_t

2018/05/31 06:46

引数と戻り値について、まだしっかりと理解できていないです。 色々書いていきたいと思います。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問