Excel(エクセル)の操作が楽になる方法と便利な使い方を紹介しています。


menu

Excel(エクセル)が楽で便利になる方法

行や列の連続したセルを繰り返して処理したい!Excelマクロ(VBA)のFor~Next文

[ この記事の内容は Excel2013 でも使えます ]  
Excelのデータは、行と列のセルが集まってできています。
 
例えば、連続したセルの値を取得する時、
var 1gyoume = Cells(1,1).Value   ' 1行目のセルの値
var 2gyoume = Cells(2,1).Value   ' 2行目のセルの値
var 3gyoume = Cells(3,1).Value   ' 3行目のセルの値
のように一つ一つ指定しても良いですが、たくさんの行がある時は大変です。
 
面倒くさいですし。
 
そんな時、For~Next文を使うと繰り返し処理が簡単にできますよ。
 
 

スポンサーリンク

For~Next文の使い方

 
[書式]
For カウント用の変数開始番号 to 終了番号
   [繰り返したい内容を書く]
Next
 
 
カウント用の変数は、カウントするための変数です。
そのままですね。
適当に数字型の変数を定義しておけば問題ありません。
 
例えばこんな感じ。
Dim gyou As Integer
 
gyouという変数を数字型(Integer)で宣言しています。
 
プログラムの本などでは、i や j や k などの文字が使われることが多いようですが、gyou や gyou_no など、わかりやすい文字で良いと思います。
 
 
開始番号終了番号は、繰り返し処理を行う開始と終了の番号です。
 
例えば、
For gyou = 1 to 5 とすると、1から5までで5回、
For gyou = 1 to 10 とすると、1から10までで10回、
For gyou = 3 to 8 とすると、3から8までで6回、
繰り返します。
 
繰り返す時、カウント用の変数にはその時の番号が入っています。
上の例であれば、
For gyou = 1 to 5 の場合、gyouには「1, 2, 3, 4, 5」、
For gyou = 3 to 8 の場合、gyouには「3, 4, 5, 6, 7, 8」
が入ります。
 
 
このカウント用の変数をうまく使うことで、Excelの行や列の値を取得したり設定したりできるのです。
 
 

スポンサーリンク

ます

ちなみにですが、終了番号の後に
STEP 間隔を開けたい番号
とすると、
1, 2, 3・・・ではなく、1, 3, 5・・・のように番号を飛ばすこともできます。
 
例えば、
For gyou = 1 to 10 step 2 の場合、gyouには「1, 3, 5, 7, 9」
For gyou = 0 to 10 step 3 の場合、gyouには「0, 3, 6, 9」
が入ります。
 
 
STEPを省略すると、「STEP 1」と同じ意味になります。
 
ですので、普通は指定しなくても大丈夫ですよ。
 
 

For~Next文を使ったサンプルプログラム

以下のような表があります。
 
名前毎に点数が入っていますね。
 
 
3列目(C列)に、A列とB列の文字を使って
 ○○さんはXX点です
という文字を設定してみましょう。
 
 
このプログラムを実行します。
実行方法はこの記事を参考にしてくださいね。
 
Function test2()
 
    '変数を定義する
    Dim gyou As Integer     '行の番号
    
    '3~7行目を見ていきます
    For gyou = 3 To 7
    
        '各行の3列目(C列)に「○○さんはXX点です」という文字を設定します
        Cells(gyou, 3).Value = Cells(gyou, 1).Value & "は" & Cells(gyou, 2).Value & "点です"
    
    Next
 
End Function
 
 
簡単に説明します。
 
gyou変数には、3, 4, 5, 6, 7の番号が入ります。
 
gyou変数が3の場合、
Cells(gyou, 1).Value は Cells(3, 1).Value となり、3行目で1列目(A列)のセルの値(Aさん)が取得できます。
同じく、
Cells(gyou, 2).Value は Cells(3, 2).Value となり、3行目で2列目(B列)のセルの値(60)が取得できます。
 
 
これらの文字をつなげると、
Cells(gyou, 1).Value & “は” & Cells(gyou, 2).Value & “点です”
“Aさん” & “は” & “60” & “点です”
になります。
 
 
その結果、”Aさんは60点です”という文字が Cells(gyou, 3) に設定されます。
Cells(gyou, 3)は、Cells(3, 3) ですので、3行目の3列目(C列)ですね。
 
以降、gyou変数が 4, 5, 6, 7 の場合も同じようになります。
 
 
実行結果です。
 
 
結果列に表示されました!
 
 

(おまけ)Forの中にForを書くと、行と列が一度に扱える!

先ほどの例では、一つのFor文で行方向に値を取得しました。
Excelには「列」もありますので、同時に扱えると便利そうです。
 
そんな時は、Forの中にForをもう一つ書きます。
 
 
先ほどの表を少し変更して、点数を3列にしてみました。
算数・理科・社会ごとに点数が入ってますね。
 
 
3列目の「結果」に、3科目の合計点数を表示してみましょう。
 
 
このプログラムを実行します。
 
Function test3()
 
    '変数を定義する
    Dim gyou As Integer     '行の番号
    Dim retsu As Integer    '列の番号
    Dim goukei As Integer   '合計
    
    '合計を初期化する
    hyouji = 0
    
    '3~7行目を見ていきます
    For gyou = 3 To 7
    
        'ある行で「2~4列目」を見ていきます
        For retsu = 2 To 4
        
            'ある行の「2~4列目の数字」を足します。
            goukei = goukei + Cells(gyou, retsu).Value
            
        Next
        
        '各行の5列目(E列)に「○○さんは合計XX点です」という文字を設定します
        Cells(gyou, 5).Value = Cells(gyou, 1).Value & "は合計" & goukei & "点です"
    
        '次の行で使うために合計を0にしておく
        goukei = 0
        
    Next
 
End Function
 
 
簡単に説明します。
 
赤い部分で「2~4列目」の値を取得しています。
ここ、Forの中にForが入ってますね。
 
ここで大事なことを。
「カウント用の変数」は、Forごとに別なものを使うのがポイントです!
 
今回は、列の値を取得したいので、retsu変数を追加してます。
 
 
gyou変数には、3, 4, 5, 6, 7 が入ります。
 
例えば、gyou変数が3の時、
もう一つのFor文によって、retsu変数は 2, 3, 4 という値が入っていきますので、
Cells(gyou, retsu).Value と書いておけば、
Cells(3, 2).Value は 算数の点数である 60、
Cells(3, 3).Value は 理科の点数である 80、 
Cells(3, 4).Value は 社会の点数である 90
が入ります。
 
これらを合計すると 230 となります。
 
以降、gyou変数が 4, 5, 6, 7 の場合も同じようになります。
 
 
実行結果です。
 
 
行と列の値をうまく使って表示できてますね。
 
 

まとめ

いかがでしたでしょうか?
 
For~Next文を使うと、Excelで行と列の値をうまく扱うことができます。
 
Forを2つ使うのでちょっと頭が混乱しがちですが、落ち着いてじっくり考えると大丈夫ですよ。
 
使いこなせるととても便利です!
 
一度、お試しくださいね。
 

スポンサーリンク

コメント

  • トラックバックは利用できません。

  • コメント (0)

  1. この記事へのコメントはありません。

だーしゅ
IT関係のお仕事してます。
Excel大好き。

[当ブログについて]

最近のコメント

  • kongaragatta { だーしゅさん、ご返事ありがとうございます。 まずは、だーしゅさん案で自分なりにできるかどうかトライしてみます。 } – 7月 03, 6:35 AM
  • だーしゅ { 言葉が良く無かったですね。 「O列がFOR文の最初の位置になる」のような意味でした。 実現するにはいろんな方法があると思います。ご参考まで。 } – 6月 29, 5:37 PM
  • kongaragatta { だーしゅさん、案をありがとうございます。 なるほど!月数を取得するやり方は考えていませんでした。やはり自分だとスキルに限界があるのでどうも柔軟に考えにくいですね。 ひとつ質問ですが、「O列を起点とし、年月を固定的に設定」の”固定的に設定”とはどのように設定するということでしょうか? } – 6月 29, 8:04 AM
  • だーしゅ { kongaragattaさん、コメントありがとうございます。 いろんな方法があると思いますが、思いついた案を書いておきますね。 ・DATEDIF関数で開始年月日と終了年月日の月数を取得 ・O列を起点とし、年月を固定的に設定 ・FOR文で「月数」の数分、セルを右方向に移動 →開始日と同じ年月の場合、●を表示 →IF文で一つ目と判断した場合、〇を表示 →3ヵ月単位はMOD関数で判定 いろいろお試しくださいね。 } – 6月 28, 4:59 PM
  • kongaragatta { だーしゅさん、こんにちは 現在、手作業でExcel作表しているものを少しでも自動化したいと考えています。但し、VBAやマクロは初心者のため、だーしゅさんに是非アドバイスやお力添えをいただければと思います。 L列:開始年月日(原則、当該月の1日)、M列:終了年月日(原則、開始年月日より2年後の月末)、O列~:L列の開始年度及び1~12月の各列があります。L及びM列は、更新されます。 全体件数としては、250件程度。 L列の開始月をキーにO列以降の3か月ごとに黒丸の記号を入力したい。但し、初回の月は、白丸の記号。たとえば、開始年月日が2018/6/1ならばO列には2018年度の6月列に白丸の記号がつき、9月列及び12月列、翌年の2019年度3月に黒丸記号のように、それがM列の終了年月日まで表示したい。 何か良い案があったらご教示ください。よろしくお願いします。 } – 6月 28, 6:11 AM
  • MIZUMIZU { だーしゅさん ご連絡ありがとうございます。こちらで試してみます。また解らないときはご連絡いたします。お手数をお掛けいたします。 } – 6月 04, 2:23 AM