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

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

ただいまの
回答率

90.75%

  • VBA

    1634questions

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

for毎に値を渡したい

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 159

beginner_t

score 87

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

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

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

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

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

name color
りんご
みかん
ぶどう
なし
オレンジ
スイカ
きゅうり
いちご
Sub color()
    Dim max_row As String
    Dim i As Integer

    max_row = Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Row

    For i = 2 To max_row
        Dim color_code As String

        color_code = str2()
        MsgBox str2


    Next i
End Sub
Function str2() As String
    Dim max_row As String
    Dim i As Integer

    max_row = Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Row

    For i = 2 To max_row
        Dim str1 As String



        str1 = Sheets("Sheet1").Cells(i, 2)


        Select Case str1
            Case "赤"
                str2 = "red"
            Case "黄"
                str2 = "yellow"
            Case "紫"
                str2 = "purple"
            Case "茶"
                str2 = "brown"
            Case "オレンジ"
                str2 = "orange"
            Case "緑"
                str2 = "green"
            Case Else
                str2 = "不明"
        End Select



    Next i
End Function
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+2

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

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

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

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

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

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

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

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

Function GetColorCode(pStr) As String
    Select Case pStr
        Case "赤"
            GetColorCode= "red"
        Case "黄"
            GetColorCode= "yellow"
        Case "紫"
            GetColorCode= "purple"
        Case "茶"
            GetColorCode= "brown"
        Case "オレンジ"
            GetColorCode= "orange"
        Case "緑"
            GetColorCode= "green"
        Case Else
            GetColorCode= "不明"
    End Select
End Function


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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/31 15:45

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

    キャンセル

checkベストアンサー

+1

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

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

Sub color(str As String)    ' str2関数から引数で受け取る
' 何をやりたいのかわからないのでコメントアウト
'    Dim max_row As String
'    Dim i As Integer
'
'    max_row = Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Row
'
'    For i = 2 To max_row
'        Dim color_code As String
'
'        color_code = str2()
'        MsgBox str2
'    Next i

    ' 受け取った値を表示
    MsgBox str
End Sub

Function str2() As String
    Dim max_row As String
    Dim i As Integer
    Dim str As String    ' color関数に渡す用の変数

    max_row = Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Row

    For i = 2 To max_row
        Dim str1 As String

        str1 = Sheets("Sheet1").Cells(i, 2)

        Select Case str1
            Case "赤"
                str = "red"
            Case "黄"
                str = "yellow"
            Case "紫"
                str = "purple"
            Case "茶"
                str = "brown"
            Case "オレンジ"
                str = "orange"
            Case "緑"
                str = "green"
            Case Else
                str = "不明"
        End Select

        Call color(str)    ' strの値を引数に指定して渡す

    Next i
End Function

追記

Sub color()
    Dim max_row As String
    Dim i As Integer

    max_row = Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Row

    For i = 2 To max_row
        Dim color_code As String
        ' 行数をstr2に渡す
        color_code = str2(i)
        MsgBox str2
    Next i
End Sub

' 何行目の情報が欲しいのかを受け取る
Function str2(r as Integer) As String

    Dim str1 As String

    ' 引数で受け取った行の値を得る
    str1 = Sheets("Sheet1").Cells(r, 2)

    Select Case str1
        Case "赤"
            str2 = "red"
        Case "黄"
            str2 = "yellow"
        Case "紫"
            str2 = "purple"
        Case "茶"
            str2 = "brown"
        Case "オレンジ"
            str2 = "orange"
        Case "緑"
            str2 = "green"
        Case Else
            str2 = "不明"
    End Select

End Function

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/31 14:41

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

    キャンセル

  • 2018/05/31 14:47

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

    キャンセル

  • 2018/05/31 15:26

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

    キャンセル

  • 2018/05/31 15:29

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

    キャンセル

  • 2018/05/31 15:40

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

    キャンセル

  • 2018/05/31 15:44

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

    キャンセル

  • 2018/05/31 15:46

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

    キャンセル

+1

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

Sub color()
    Dim i As Integer
    For i = 2 To Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Row
        MsgBox str2(Sheets("Sheet1").Cells(i, 2))
    Next i
End Sub
Function str2(pStr) As String
    Select Case pStr
        Case "赤"
            str2 = "red"
        Case "黄"
            str2 = "yellow"
        Case "紫"
            str2 = "purple"
        Case "茶"
            str2 = "brown"
        Case "オレンジ"
            str2 = "orange"
        Case "緑"
            str2 = "green"
        Case Else
            str2 = "不明"
    End Select
End Function

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/31 15:55

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

    キャンセル

+1

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

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

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/31 15:32

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

    キャンセル

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

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    VBAで対象セル内に”NG”が表示されている場合、その列を別シートにコピーする

    VBA初心者です。教えてください。 VBAで対象セル内に"NG"が表示されていた場合、その列の対象セルを別シートにコピーする処理を作成したいです。 例)Sheet1のA2,

  • 解決済

    excelの文字列に違う文字列を挿入する

    A列にhtmlの文字列が入っており、<img src="">というも文字列の中に B列のランダムなURLを5000行一気に挿入したいと考えています。 他の列に記載したものをA列

  • 解決済

    VBA高速化について

    20個のエクセルファイルを読み込み、特定のシートにあるテーブルから特定の値を探し出し、その右横にあるセルの値を取り出します。 集計用のエクセルのテーブルでも、同じ特定の値をテーブル

  • 解決済

    指定範囲内のセルから数字を含まないセルを削除したい

    VBAを使ってエクセルの指定範囲内のセルから数字を含まないセルを削除したいと考えています。 具体的にはシート名”抽出”のJ列2行目から最終行までで、セル内に0~9の数字が入って

  • 解決済

    VBAにてGoogle検索結果を転記したい。

    本サイトでは、いつも教えて頂き、感謝をしております。 さて、本日も教えて頂きたく。 ■ やりたい事。 下記の様に、B列に会社名が入っており、C列が空欄のシートがあります。

  • 解決済

    【VBA】最終行に転記

     前提・実現したいこと (同一book) 【入力】シートに入力したものを【点検履歴】シートの最終行に転記したいです。 ↓入力シート(sheet9) ↓点検履歴(sheet8)

  • 解決済

    VBA 条件分岐 while文?

     VBAで背景色をつけたい。エクセルの範囲を指定せずに、複数の条件分岐を実現したい ここに質問の内容を詳しく書いてください。 かなり長文になると思いますが、色々試した結果、手詰まり

  • 解決済

    VBAの配列についての質問

    エクセル2007を使用しています。 VBAを使って以下の事がやりたいです。 「シート1」に以下の表があります。 A列に商品、B列にロットNoとあります。 CD列、EF列、

同じタグがついた質問を見る

  • VBA

    1634questions

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