• 締切済み

EXCEL VBAのFor...Nextについて

VBA初心者です。よく理解していませんので、質問も的を得ていないかもしれませんが、ご指導宜しくお願いいたします。  現在、For...Nextを使った表計算をしています。 A列に「す」という文字が含まれていたら、B列の「す」の行に「あ」と「い」と「え」「か」のセルの合計をだす。C列、D列・・・最終列まで計算する。 上記VBAを作成する方法を教えて下さい。 A  B  C  D  E   F  G  H  I  J  K  L 1 2    3    4   5    6    7    8    9    10    11 12 あ  1 2 3 4   5 6 7 8 9 10 11 い 10 20 30 40  50 60 70 80 90 100 110 う 20 30 40 50   60 70 80 90 100 110 120 え 40 50   60  70 80 90  10 20 120 130 30 お 50 60   70  80 90 10  20 30 130 140 40 か 60 70   80  90 10 20  30 40 140 150 50 す 私は表に1~12まで数字をインプットし下記のようなコードを考えました。 Sub 列合計() Dim i, k, l, m, n As Long j = 2 For i = 6 To 120 For k = 6 To 120 For l = 6 To 120 For m = 6 To 120 For n = 6 To 120 If Cells(i, 1) = "す" And Cells(k, 1) = "あ" And Cells(l, 1) = "い" And Cells(m, 1) = "え" And Cells(n, 1) = "か" Then Do While j <= Range("A2").End(xlToRight) Cells(i, j) = Cells(k, j) + Cells(l, j) + Cells(m, j) + Cells(n, j) j = j + 1 Loop Else: End If Next n Next m Next l Next k Next i End Sub この内容だとエラーが出てしまいます。 補足ですが、あいうえおかの順番はかわったり、間に他の行が入ったりします。 また今回はL列の間としましたが、もっと列が増え、最終列まで計算する方法を知りたいのですが、どうぞ宜しくお願い致します。 ※ofice2013です。

みんなの回答

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.2

計算目的なら、「す」の行のB列(下は8行目に)  =SUMPRODUCT((($A$2:$A$7="あ")+($A$2:$A$7="い")+($A$2:$A$7="え")+($A$2:$A$7="か"))*B2:B7)で計算できますが、 Forループの使い方ということで答えを書きました。     最初に要件の確認です。 >A列に「す」という文字が含まれていたら、  A列のあるセルが「す」だったら と解釈しました。    >B列の「す」の行に  「す」があったA列のセルの右のB列のセル   >「あ」と「い」と「え」「か」のセルの合計をだす。  この4つの文字の場合は集計するとしました。4つが必ず1回出てくるというのは作り手に都合のいいモジュールになります。全部「あ」でも「あいう」、「ああいい」でも全部「ん」でも計算します。そのために少し冗長になっています。「あいえか」の行を決め打ちにしていません。   >C列、D列・・・最終列まで計算する。  最後は1行目の入力されている一番右のセルとします。     シートのコードウィンドウを使っています。(Excel2010) まだ少しFor Nextの使い方に慣れておられないようなのでモジュールにコメントを追記しています。 Sub keisan()   Dim col As Integer '列カウンタ   Dim rw As Integer  '行カウンタ   Dim writeRow As Integer '書き出す行(「す」のある行)   Dim lastColumn As Integer  '最終列     lastColumn = Cells(1, Columns.Count).End(xlToLeft).Column   Dim Total As Double '計      '「す」の行を探す   'A列を入力が終わるまで調べます   rw = 2   While Cells(rw, 1) <> "" And writeRow = 0     If Cells(rw, 1) = "す" Then       writeRow = rw  'これが「す」のある行     End If     rw = rw + 1   Wend      '「あ、い、え、か」のある行を集計   If writeRow > 0 Then     ’「す」があれば正     '「す」の行があれば計算します     For col = 2 To lastColumn   '列方向       Total = 0   '計をクリア       For rw = 2 To writeRow - 1  '行方向         If Cells(rw, 1) = "あ" Or _          Cells(rw, 1) = "い" Or _          Cells(rw, 1) = "え" Or _          Cells(rw, 1) = "か" Then          'A列が「あいえか」なら加算           Total = Total + Cells(rw, col)         End If       Next       '出力行に書き出す       Cells(writeRow, col) = Total     Next   End If End Sub

udonNo1
質問者

お礼

ご教授ありがとうございます。 モジュールにコメントを記入していただき、初心者の私には、とても助かりました。 コメントを参考に勉強致します。

noname#203218
noname#203218
回答No.1

for ~ Next 使用が条件であれば下記はVBAの一例です。 Sub test() Dim Myrow, Maxrow, Maxcol As Long Dim i, j As Long Dim Cols(1 To 4) As Long Maxrow = Cells(Rows.Count, 1).End(xlUp).Row 'A列最大行 Maxcol = Cells(2, Columns.Count).End(xlToLeft).Column '2行目最大列 For i = 2 To Maxrow If Cells(i, 1).Value = "す" Then Myrow = i Next If Myrow > 1 Then For i = 2 To Maxrow If Cells(i, 1).Value = "あ" Then Cols(1) = i If Cells(i, 1).Value = "い" Then Cols(2) = i If Cells(i, 1).Value = "え" Then Cols(3) = i If Cells(i, 1).Value = "か" Then Cols(4) = i Next Else 'す が見つからない場合はメッセージを表示し、subを抜ける。 MsgBox "「す」が見つかりません" Exit Sub End If '集計値を入力するセル範囲の数値を消去 Range(Cells(Myrow, 2), Cells(Myrow, Maxcol)).ClearContents '集計値入力セルに集計値を値として入力 For i = 2 To Maxcol For j = 1 To 4 If Cols(j) > 1 Then Cells(Myrow, i) = Cells(Myrow, i) + Cells(Cols(j), i) End If Next Next End Sub 検索する文字は完全一致でセルは重複しないものとしています。「す」は1つしかA列には存在しない。 他のあ、い、え、か も同様にA列に1つしか存在しないものとしています。 部分一致のセルも集計必要ある場合は、修正必要です。 最大行、最大列を取得方法出来るようにしてあります。 VBAはサイト上にサンプルコードはいくらでもありますので、質問するよりネット検索した方が解決は早いと思います。

udonNo1
質問者

お礼

コード実行したら、うまく計算されました。 他の表にも応用し使用させていただきました。 ありがとうございました。 今後はサンプルコードを検索し、使いこなせるようにしていきたいです。

関連するQ&A

  • ExcelのVBAがオーバーフローに!?

    読んで頂きありがとうございます。 以前に質問しました時に回答を頂き凄く助かっていたのですが、何故か「オーバーフロー」と表示されてしまいます。 ひょっとしたら桁なのかも知れません。 下記のVBAを教えて頂きしようしていました。 Option Explicit Sub Test() Dim c(), p(), q(), i, j, l, r, k As Long r = Range("B2").End(xlDown).Row l = Range("D2").End(xlDown).Row ReDim c(r - 2), p(r - 2), q(r - 2) For i = 1 To r - 2 c(i) = Cells(i + 2, 2).Value p(i) = Cells(i + 2, 3).Value q(i) = i + 2 Next i For i = 1 To r - 3 For j = i + 1 To r - 2 If c(i) > c(j) Then k = c(i) c(i) = c(j) c(j) = k k = p(i) p(i) = p(j) p(j) = k k = q(i) q(i) = q(j) q(j) = k End If Next j Next i For i = 1 To r - 2 Cells(i + 2, 7).Value = c(i) For j = 3 To r If Cells(j, 4).Value = c(i) Then Cells(i + 2, 8).Value = p(i) - Cells(j, 5).Value If p(i) - Cells(j, 5).Value <> 0 Then Range("B" & q(i)).Interior.ColorIndex = 6 Range("D" & j).Interior.ColorIndex = 6 End If Exit For End If Next j Next i For i = 3 To r k = 0 For j = 3 To l If Cells(i, 2).Value = Cells(j, 4).Value Then k = 1 Exit For End If Next j If k = 0 Then Range("B" & i).Interior.ColorIndex = 35 End If Next i For i = 3 To l k = 0 For j = 3 To r If Cells(i, 4).Value = Cells(j, 2).Value Then k = 1 Exit For End If Next j If k = 0 Then Range("D" & i).Interior.ColorIndex = 35 End If Next i End Sub デパックのClickすると15行目辺りの「k = c(i)」が黄色くなります。 正直言ってマクロとか全く解りませんが、コピーして使っていました。 どこをどう変更すれば良いのか教えて頂ければ助かります。 よろしくお願いします。

  • VBA For~Next 

    「wsData」の値を「wsInv」の指定セル(=●●●=16)から4つおきに処理したい。 01:Cells(16 + i * 4, 1) とすると「i」が大きいときに   「""」があると16からスタートしない 02:「For k = 0 To 50」を作成したが、何処に入れても上手く処理出来ない。 For i = 0 To 50 '行 For j = 6 To 28 '列 If wsData.Cells(10 + i, 3).Value = "" Then wsInv.Cells(●●●, 1).Value = wsData.Cells(10 + i, 1).Value wsInv.Cells(●●●, j - 2).Value = wsData.Cells(10 + i, 23 + j).Value End If Next j Next i お力添えをお願いいたします。

  • エクセルVBAの配列について

    エクセルVBAの配列について VBAをはじめたばかりの初心者です。 現在、下記のようにデータを配列の中に入れ、 別シートに書き出そうとしております。 (配列へ読み込むところのみ) Dim 配列(1 To 件数, 1 To 9) As Variant For j =1 To 件数 For i = 2 To L If Cells(i, 2).Value = Tx_month Then For k = 3 To 11 配列(j, k - 2) = Cells(i, k).Value Next k End If Next j,i 現状では、データの最終行のみを「件数」分書き出してしまいます。 jとiのForが重なっているからだと思うのですが、どう書き直したら良いか分かりません。 質問をさせていただくのも初めてなので、分かりづらく恐縮ですが お力添え頂けますと幸いです。 どうぞ宜しくお願い致します。

  • For Next構文を使ったVBA

    こんにちは、VBAについて質問をさせてください!(>_<) 同じブックにシート「テスト」と「Sheet1」があり、「テスト」にはデータの入力欄、「Sheet1」には「テスト」に入力するためのデータが入っています。「テスト」の入力欄は「Sheet1」のデータの並び順と同じですが、入力したデータ同士に4行3列ずつデータを入力しないセルを作らなくてはなりません。 また、データを入力するセルは「テスト」の5列目8行目=「Sheet1」3列目2行目~「テスト」の20列目8行目=「Sheet1」8列目2行目のように、まず列番号を増やし、列番号が最大になったら行番号が増え、列番号はまた初期値から増えます。したがって、次は「テスト」の5列目9行目=「Sheet1」の3列目3行目~「テスト」の20列目9行目=「Sheet1」の8列目3行目になります。 上記を踏まえてVBAを作成してみたのですが、このままではi,j,k,l全ての値がNextで増えてしまいます。Ifを使ったりするのかと色々ネットで調べて考えてみましたが、行き詰まってしまいました。どなたかご教授いただけるととても嬉しいです。説明が長く申し訳ないです、わかりづらければ補足させていただくので、おっしゃってください! Dim i, j, k, l As Integer For i = 5 To 20 Step 3 'シート「テスト」の列 For j = 8 To 116 Step 4 'シート「テスト」の行 For k = 3 To 8 'シート「Sheet1」の列 For l = 2 To 39 'シート「Sheet1」の行 Cells(j, i).Value = Sheets("Sheet1").Cells(l, k).Value Next l Next k Next j Next i

  • 合計値がある範囲の場合に印をつけるには?

    どなたかご存じでしたらご回答をお願いします。 【質問】 下記のVBAを実行すると、「異なる 25個のものから 5個を選ぶ組み合わせ の総数 nCr (53,130通り)」を作成します。A列~E列の合計をF列に表示しておりますが、 F列の値が58~102の場合、G列に”●”をつけるには、 下記VBAのソースはどのように修正すればよいでしょうか? ●VBAソース ub test() Const MaxNum = 25 Dim s(25) As String Dim i As Integer Dim r As Integer Dim c As Integer i = 1 For r = 1 To 5 For c = 1 To 5 s(i) = Cells(r, c).Value i = i + 1 Next Next Dim j, k, l, m Dim rowX As Long rowX = 0 rowX = rowX + 1 For i = 1 To MaxNum - 4 For j = i + 1 To MaxNum - 3 For k = j + 1 To MaxNum - 2 For l = k + 1 To MaxNum - 1 For m = l + 1 To MaxNum Cells(rowX, 1).Value = s(i) Cells(rowX, 2).Value = s(j) Cells(rowX, 3).Value = s(k) Cells(rowX, 4).Value = s(l) Cells(rowX, 5).Value = s(m) Cells(rowX, 6).Value = Application.WorksheetFunction.Sum(s(i), s(j), s(k), s(l), s(m)) rowX = rowX + 1 Next m Next l Next k Next j Next i End Sub ●VBA実行結果(やりたいこと) A    B     C     D     E     F  G 1     2     3     4     5     15       1     2     3     4     6     16       1     2     3     4     7     17  1     2     3     4     8     18 1     2     3     4     9     19             :             : 1     5     12    19     20    57 1     5     12    19     21    58  ● 1     5     12    19     22    59  ● 1     5     12    19     23    60  ●             :             : 20    21    22     24    25    112 20    21    23     24    25    113 20    22    23     24    25    114 21    22    23     24    25    115   【注意事項】   ・使用するエクセルは2010です。 以上、よろしくお願いします。

  • EXCEL VBA2010 MsgBox

    Sub 重複() Dim i As Long, j As Long For i = 6 To 500 For j = 3 To 3 If WorksheetFunction.CountIf(Range("C6:C500"), Cells(i, j)) > 1 Then Cells(i, j).Interior.ColorIndex = 6 End If Next j Next i End Sub このVBAに重複が何件ありますよというメッセージを出したいです。 MsgBoxの入れ方を教えてください。

  • 以前に回答いただいたVBAですが、理解できない部分があったので、抜粋し

    以前に回答いただいたVBAですが、理解できない部分があったので、抜粋して質問に投稿したところ、多くの方々から、「これでは、わからない」などの指摘をいただき、これでは、以前に回答していただいた回答者様の名誉にかかわると思い全文を記載させていただくことにしました。  あわせて、この、VBAの詳しい説明を快くしていただける方は回答よろしくお願いします。以下のとうりです。  A列  B列 1 期間  90 2 人数  21 3 4 氏名  回数 5 A   23 6 B   23 7 C   19 8 D   16 9 E   12 10 F   9 11 G   8 12 H   7 13 I   7 14 J   6 15 K   6 16 L   6 17 M   5 18 N   5 19 O   4 20 P   4 21 Q   4 22 R   4 23 S   4 24 T   4 25 U   4 Sub 当番割当() Dim 期間 As Integer Dim 人数 As Integer Dim 氏名() As String Dim 回数() As Integer Dim i As Integer Dim j As Integer Dim k As Integer Dim m As Integer Dim n As Integer Dim n1 As Integer Dim n2 As Integer Dim p As Single Dim q As Single Dim 当番() As String Dim 担当() As Single 期間 = Cells(1, 2) 人数 = Cells(2, 2) ReDim 氏名(人数) ReDim 回数(人数) For i = 1 To 人数 氏名(i) = Cells(4 + i, 1) 回数(i) = Cells(4 + i, 2) Next i ReDim 当番(期間 * 2) ReDim 担当(期間 * 2) n = 0 For i = 1 To 人数 n1 = 0 n2 = 0 For j = 1 To 人数 If 回数(j) = 回数(i) Then n1 = n1 + 1 If j <= i Then n2 = n2 + 1 End If Next j p = 期間 / 回数(i) For j = 1 To 回数(i) q = p * (n2 - 0.5) / n1 + p * (j - 1) m = 1 For k = n To 1 Step -1 If 担当(k) <= q Then m = k + 1 Exit For End If 当番(k + 1) = 当番(k) 担当(k + 1) = 担当(k) Next k 当番(m) = 氏名(i) 担当(m) = q n = n + 1 Next j Next i Range("E:G").Clear For n = 1 To 期間 Cells(n, 5) = n & "日" Cells(n, 6) = 当番(n * 2 - 1) Cells(n, 7) = 当番(n * 2) Next n End Sub

  • EXCEL VBA の For・・・Next 小数のときに動きがおかし

    EXCEL VBA の For・・・Next 小数のときに動きがおかしい。 <例>  Sub テスト()   Dim i As Single   Dim j As Long   For i = 0.025 To 0.03 Step 0.0025   j = j + 1   Cells(1, j) = i   Next i  End Sub 上記コードを実行すると、セル(1,1)~(1,3) にそれぞれ 0.025、0.0275、0.03 が入るはずです。 しかし、0.03が入らないまま処理が終了します。 デバックすると、 Next i で、iに0.03が設定されたら、    j = j + 1 に戻らず、そのまま終わっています。 シートに表示された0.025、0.0275を数式バーで見るとそれぞれ     0.025000000372529、0.0274999998509884 となっています。 同様にNext i で0.03が設定されたように見えて、実際は0.03よりも少しだけ大きな数値が入ったのでしょうか?(debug.printを使いイミディエイトウインドウに表示させても0.03でしたが) 期待どおりi=0.03でも処理を実行させるにはどうしたらいいのでしょうか? よろしくお願いします。

  • エクセル重複行統合マクロの意味

    Tom04さんの回答で 以下のとても素晴らしいマクロがあり、 使用させていただきたいのですが、 詳細がわかりません。 少々編集して自分の書類に反映させていただきたく、 マクロの内容を教えていただけませんか? Sub test() 'この行から Dim i, j, k, L As Long Application.ScreenUpdating = False For i = Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1 For j = 2 To Cells(1, Columns.Count).End(xlToLeft).Column + 1 For k = Cells(Rows.Count, j).End(xlUp).Row To 2 Step -1 If Cells(k, j) <> "" And WorksheetFunction.CountIf _ (Range(Cells(2, 1), Cells(k, 1)), Cells(k, 1)) > 1 Then L = WorksheetFunction.Match(Cells(k, 1), Columns(1), False) Cells(k, j).Cut Destination:=Cells(L, j) End If Next k Next j Next i For i = Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1 If WorksheetFunction.CountA(Rows(i)) = 1 Then Rows(i).ClearContents End If Next i Application.ScreenUpdating = True End Sub 'この行まで

  • Excel VBAで検索する

    Excel VBAで、Sheet1に貼り付けたテキスト内から Sheet2に記載した(1列ごとの)キーワードを検索し キーワードが含まれている行をSheet3に貼り付ける処理をしているのですが、始めたばかりなので上手くいきません。 下記がソースです。 Dim moji As String Dim word As String Dim result As Integer For i = 3 To 103 For j = 2 To 21 moji = ThisWorkbook.Worksheets("Sheet1").Cells (i, 1).Value word = ThisWorkbook.Worksheets("Sheet2").Cells (j, 2).Value result = InStr(moji, word) If doResult <> 0 Then For k = 1 To 100 ThisWorkbook.Worksheets("Sheet3").Cells (k, 1).Value= moji Next k End If Next j Next i このソースでは上手くいかないのですが、どこがダメなのか分からないので、解決の糸口がつかめません。 アドバイスなどお願いします。

専門家に質問してみよう