• 締切済み

エクセルVBAの繰り返し処理の質問

C列にある項目とG列にある項目を比較して、 一致し、H列にある数字が10以上ならば、B列にフラグ1を立てる という処理を行いたいんですが、 下記ぐらいまでしか作れず、うまくいきません・・・ Sub フラグを立てる処理() Dim i As Integer Dim j As Integer Dim k As Integer i = 1 j = 1 Do j = j + 1 Do i = i + 1 If Cells(j, 8) > 9 Then Cells(i - 1, 4) = 1 End If Loop Until Cells(i, 3) <> Cells(j, 7) Or Cells(i, 3) = "" Loop Until Cells(j, 7) = "" End Sub わかる方がいらっしゃいましたら、お願いします。

みんなの回答

  • kazu1973
  • ベストアンサー率40% (14/35)
回答No.7

こんな感じですかね^^ Dim CRow As Integer 'C列のカウンタ Dim GRow As Integer 'G列のカウンタ CRow = 2: GRow = 2 Do Until ActiveSheet.Cells(GRow, 7).Value = "" Do Until ActiveSheet.Cells(CRow, 3).Value = "" '比較(異なる場合は次へ) If ActiveSheet.Cells(CRow, 3).Value =        ActiveSheet.Cells(GRow, 7).Value Then If ActiveSheet.Cells(GRow, 8).Value = "" Then ActiveSheet.Cells(GRow, 8).Value = 1 Else ActiveSheet.Cells(GRow, 8).Value = ActiveSheet.Cells(GRow, 8).Value + 1 End If '10件以上の場合"F"にフラグを立てる If ActiveSheet.Cells(GRow, 8).Value > 9 Then ActiveSheet.Cells(GRow, 6).Value = 1 End If End If CRow = CRow + 1 Loop GRow = GRow + 1 '比較先カウンターの初期化 CRow = 2 Loop 文中のカラム数値は変更して下さい。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.6

#5です。そのお礼の内容に間して関して。 その「お礼」欄のようなことを書いてほしいのでなく、私を含めこの質問を、今後読む人や回答者を含め、私の疑問点に答えて(補足して、明確にして)ほしいと言うことだけです。 そうでないと、回答の正否も読者には判断できない。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.5

>C列にある項目とG列にある項目を比較して、・・ 添付画像のデータの様子を見ると。上記質問表現は適切でなく、 「G列の各行のコードがC列に見つかれば・・」と表現すべきでは。 ーー ただし、そうすると例では41111の行は4つあり、その行のH列の「カウント」データはバラバラなので、どこを見ればよいのか迷う。 === 逆にC列からG列を見るとC41111はG列ではひとつで、H列カウントも1つなのでC列41111の4行は同じ結果が並ぶことになるが、無駄な気がするが、よいのか。 === 根本的にC列からG列を見るのか、GれつからC[列を見るのか大切なことが説明されていないのでは。 またC列、G列の中で同じ重複したコードが有るかを書かないといけないと思う。この大切さがわかって無い初心者の質問が多い。 この添付画像の例で、例だけ挙げるのでなく、処理はどうなるか文章で説明すべきだ。

shu-goo
質問者

お礼

はい、初心者です。 わかりにくい、大切なことが明記されていない、確かにその通りです。 でも、始めたばかりで、どう説明していいかも、わからないんです。 これでも自分なりに、考えて質問しました。 わかりにくい説明でも、例を挙げれば、わかってもらえるかもしれないなど・・・。 それとも、わからない人、聞いてはいけない場所なんでしょうか? それならば、本当にスミマセンでした。 今後、勉強して、わかるようになっていきたいと思っています。 すみませんでした。

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.4

こんな感じでは? Sub Macro1() Dim i As Long For i = 2 To Range("C65536").End(xlUp).Row If Evaluate("countif(G:G," & Cells(i, 3).Value & ")") > 0 Then If Cells(i, 8).Value >= 10 Then Cells(i, 4).Value = 1 End If Next i End Sub

  • nattocurry
  • ベストアンサー率31% (587/1853)
回答No.3

・「C列にある項目とG列にある項目を比較して、一致し」という条件分岐がありません。 ・ Cells(i - 1, 4) = 1  なぜ i - 1 なのでしょうか? i で良いと思いますけど。 ・内側のループの条件は、Cells(i, 3) = "" だけで良いと思います。  内側のループでは、一致するものを探しているのに、Cells(i, 3) <> Cells(j, 7) これも条件にしてしまうと、一度違ったらループが終了してしまって、一致するところまで辿り着けなくなります。 とりあえず、この3点を直してみてください。

shu-goo
質問者

お礼

解答ありがとうございます。 >Cells(i - 1, 4) = 1  なぜ i - 1 なのでしょうか? i で良いと思いますけど。 確かに私もそう思ったんです。 でも、i - 1にするとうまくいくんです。 なんか不安は残りますが・・・。 次に、 >内側のループの条件は、Cells(i, 3) = "" だけで良いと思います。  内側のループでは、一致するものを探しているのに、Cells(i, 3) <> Cells(j, 7) これも条件にしてしまうと、一度違ったらループが終了してしまって、一致するところまで辿り着けなくなります。 文章が足りていませんでした。すみません。 このデータは、すでに並び替えられているので、大丈夫だと思います。 いろいろ、ご教授ありがとうございます。

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.2

一例です。 Do~Untilは余り利用したことがないので別の方法です。 フラグはD列にしています。 Sub ファイルの存在を調べる() For Each c In Range("C:C") If c.Value = "" Then Exit Sub For Each g In Range("G:G") If g.Value = "" Then Exit For If c.Value = g.Value And Range("H1").Offset(g.Row - 1) > 9 Then Range("D1").Offset(c.Row - 1) = 1 Exit For End If Next Next End Sub

  • FEX2053
  • ベストアンサー率37% (7987/21354)
回答No.1

この手の処理は「決めウチ」にしてしまうと汎用性がなくなりますので、 セルを選択した位置を基準に処理を継続していくように作るのがVBAの 基本です(その点、VBなどとは発想が違います)。たとえば Sub test() Do Data1 = Selection.Value Data2 = Selection.Offset(0, 3).Value Data3 = Selection.Offset(0, 4).Value If Data1 = Data2 Then If Data3 >= 10 Then Selection.Offset(0, 1) = 1 End If End If Selection.Offset(1).Select Loop Until Selection.Value = 0 End Sub 質問者さんの図で言えばセルC2にあわせて実行すれば、C列が空白に なるまで継続して実行します。なお、この程度なら敢えて変数の宣言 などはしなくて良いと思うので、宣言は入れていません。

関連するQ&A

  • VBA 九九 Do While

    VBAのDo Whileステートメントを使って九九の表をつくりたいのですが、何度やっても途中で詰まり、実行に至りません。 For NextとDo untilではできたと思うのですがDo Whileがどうしてもわからなくて… どなたか助けてください。お願いします。 Sub 九九計算_for() Dim i, j As Integer For i = 1 To 9 For j = 1 To 9 Cells(i, j).Value = i * j Next Next End Sub Sub 九九計算_do_until() j = 1 Do i = 1 Do Cells(j, i).Value = i * j i = i + 1 Loop Until i = 10 j = j + 1 Loop Until j = 10 End Sub

  • VBAでの質問

    お世話になります。 下記の記述で、「←」の矢印の記述で、 Cells.(5,2)がブランクでなければ、 「→」から進めたいのですが、 どの様に記述すれば宜しいでしょうか ご教示お願いします。 Sub 表記入() Dim Data As Range Dim i As Integer Dim j As Integer Dim k As Integer Set Data = Sheets("集計").Range("A2").CurrentRegion j = 16 k = 0 With Sheets("表") For i = 3 To Data.Rows.Count If Data.Cells(i, 51) <> "" Then .Cells(5, 2) = Data.Cells(i, 3)  ← .Cells(5, 7) = Data.Cells(i, 4) → .Cells(j, 2) = Data.Cells(i, 10) .Cells(j, 6) = Data.Cells(i, 11) & Data.Cells(i, 12) .Cells(j, 14) = Data.Cells(i, 51) Else End If k = k + 1 If k = 10 Then j = j + 18 k = 0 Else j = j + 1 End If End If Next i End With End Sub

  • エクセルVBAについて

    エクセルVBA初心者です。 左の表からある一定以上の売上を得た人を抽出し、右の表に表示したいのですが以下のプログラムだと上手くいきません。 どこがダメなのでしょうか? Private Sub cmdUriken_Click() Dim k As Integer Dim l As Integer Dim m As Integer k = 2 l = 2 m = 2 Do Until Cells(m, 32) = "" Range(Cells(m, 19), Cells(m, 34)).Select Selection.ClearContents m = m + 1 Loop Do Until Cells(k, 14) = "" If Cells(k, 14) >= txtUriken.Text Then Range(Cells(k, 1), Cells(k, 16)).Select Selection.Copy Range(Cells(l, 19), Cells(l, 34)).Select ActiveSheet.Paste l = l + 1 Application.CutCopyMode = False End If k = k + 1 Loop End Sub ちなみに If Cells(k, 14) = txtUriken.Text Then とするとちゃんと同等の売上が表示されるので >= の使い方が間違っていると思うのですが よろしくお願いします。

  • エクセルVBAで複数セルをコピーの制御構文

    エクセルVBAで A8~I8のセルをコピーしてJ7~R7にコピーし、2行下に移り空白セルまで繰り返すという 処理をしたいと考えています Sub copy() Dim i As Integer i = 7 Do Until Cells(i, 1) = "" Cells(Cells(i,10),Cells(i,18).Value = Cells(Cells(i+1,1),Cells(i+1,9).Value i = i + 2 Loop End Sub と作ってみたところエラーで動きませんでした。 上記のプログラムはどこら辺がおかしいでしょうか? よろしくお願いします。

  • ExcelのVBAで質問です。

    以下のようなシートがあります。 A列  B列  C列  D列  E列  F列  G列  H列 NO  名前  確認 日付1 日付2  確認 日付1 日付2 6行目からデータを入れる予定です。 C列には○印を入力します。 C列~E列までデータが入った行は、 F列~H列まで同じ処理をします。 (セルの背景色を変えます。) 以後同じことを列方向で繰り返します。 以下のようなVBAを組みましたが、 ○の個数を数える部分でエラーがでます。 Private Sub Worksheet_Change(ByVal Target As Range) Dim staff As String Dim kakunin As String Dim date1 As Date Dim date2 As Date Dim i As Long Dim j As Long Dim cnt As Long '100件分ループ For i = 6 To 105 '○の数をカウント cnt = WorksheetFunction.CountIf(ActiveSheet.Range(Cells(i, 2), Cells(i, 256)), "○") 'jとは確認の列番号のこと j = 3 * cnt staff = Cells(i, 2) kakunin = Cells(i, j) date1 = Cells(i, j + 1) date2 = Cells(i, j + 2) 'スタッフ名が入力されたら If staff = "" Then Range(Cells(i, j), Cells(i, j + 50)).Interior.ColorIndex = 15 Else Cells(i, j).Interior.ColorIndex = xlNone '○が入力されたら If kakunin = "○" Then Range(Cells(i, j + 1), Cells(i, j + 2)).Interior.ColorIndex = xlNone Else Range(Cells(i, j + 1), Cells(i, j + 2)).Interior.ColorIndex = 15 End If If Cells(i, j + 1) <> "" And Cells(i, j + 2) <> "" Then Cells(i, j + 3).Interior.ColorIndex = xlNone End If End If Next i End Sub ご教授いただけたら、幸いです。 よろしくお願いいたします。

  • エクセルVBAの二重ループについて

    今月VBAを勉強し始めた初心者です。 Webにて入力されたcsvファイルを編集する際に 最新投稿を残して表に出力する目的で 下記のマクロを作成して実行してみたところ 変数i、jが0になるまでループが繰り返されてエラーになってしまいます。 ループ範囲指定のどこに問題があるのでしょうか? こちら側の環境が OS:Windows7 64bit Ultimate Office2007 です。 ご教授宜しくお願い致します。 Sub namaesakujo() Dim i As Integer Dim j As Integer Dim mct As Integer Dim Name1 As String Dim Name2 As String Dim Time1 As Long Dim Time2 As Long Worksheets("result").Activate mct = Worksheets("result").UsedRange.Rows.Count '最大行数を指定 Name1 = Cells(i, 2).Value '名前1 Name2 = Cells(j, 2).Value '名前2 Time1 = Cells(i, 1).Value '時間1 Time2 = Cells(j, 1).Value '時間2 '変数iを最終行数~2行目まで指定 i = mct Do While i > 2 '変数jを最終行数~2行目まで指定 j = mct Do While j > 2 '2列目iと2列目jが等しい(名前が同じ)場合、日時が小さい方を削除する If Name1 = Name2 And Time1 > Time2 Then Cells(j, 1).EntireRow.Delete End If j = j - 1 Loop i = i - 1 Loop MsgBox "更新完了" End Sub

  • VBAで空欄にデータに表示

    エクセルVBAのIFを使って、シートaのA列に値があって、B列が空欄の場合のみ、空欄のセルにシートbの値を表示させたいです。 上手くできませんでしたので、教えてください。 Sub Do文2() Dim i As Integer i = 1 If Worksheets("a").Cells(i, 2) = "" Then Do While Worksheets("a").Cells(i, 1) <> "" Worksheets("a").Cells(i, 2) = Worksheets("b").Cells(1, 1) i = i + 1 Loop End If End Sub

  • VBA エクセル 列の並び替え

    左から右にA、B、Cと値が入っています。 ABC以外の文字が列に入っていたら、削除するというマクロを組みましたが、範囲を設定するところでエラーが出てしまいました。 なぜでしょうか? 教えて下さい。 Sub arrange() Dim rg As Range Dim i As Long i = 1 Do rg = Cells(i, 1) If rg <> "A" And rg <> "B" And rg <> "C" Then Range(i & ":" & i).Delete End If i = i + 1 Loop Until (i & "1") = "" End Sub

  • VBA ループ文

    お手数ですが、回答お願いします。 VBAでループ文を勉強しております。 最初のfor 文で1000行、1000列に文字を入力、 次のdo 文でその文字を全部消したいのですが、うまくいきません。 またfor 文で1000行、1000列で文字を入力しているのですが、 時間がかかるのは仕方がないことなのでしょうか? お手数ですが、ご教授お願いします。 Sub 文字入力() Dim i As long Dim t As long For i = 1 To 1000 For t = 1 To 1000 Cells(i, t) = "wooo" Next t Next i End Sub ================================================================= Sub 文字入力消し() Dim i As long Dim t As long i = 1 Do t = 1 Do Cells(i, t) = "" t = t + 1 Loop Until Cells(i, t) = "" i = i + 1 Loop Until Cells(i, t) = "" End Sub

  • エクセル VBA リストボックス 一覧処理

    エクセル VBA リストボックス 一覧処理 シートから文字列を検索 ↓ リストボックス表示 ↓ 表示結果をクリック ↓ 空欄時入力 ↓ 更新 上記の流れをVBAで行いたいのですが、結果表示されたリストを選択 詳細を表示し、空欄においては都度入力した物を更新ボタンでセルへ 反映させるにはどの様にすればいいのでしょうか? Public Sub 検索(ByVal Namae As String, ByRef MeNamae As Object) Dim Nagasa As Integer Dim i As Long Dim MaxRows As Long Dim SAGASU As Object Dim KensakuChar As String Dim ListNamae As String Dim ListChar As String Dim KBanme As Integer Dim LBanme As Integer Set SAGASU = Worksheets("2月") MaxRows = SAGASU.UsedRange.Rows.Count Nagasa = Len(Namae) MeNamae.ListBox1.Clear For i = 3 To MaxRows ListNamae = SAGASU.Cells(i, 3) KBanme = 0 LBanme = 0 Do Do While Nagasa >= KBanme KBanme = KBanme + 1 KensakuChar = Mid(Namae, KBanme, 1) If KensakuChar <> " " Then Exit Do End If Loop Do While Nagasa >= LBanme LBanme = LBanme + 1 ListChar = Mid(ListNamae, LBanme, 1) If ListChar <> " " Then Exit Do End If Loop If KensakuChar = ListChar Then If Nagasa = KBanme Then With MeNamae .ListBox1.AddItem (ListNamae) End With End If Else Exit Do End If Loop Until Nagasa <= KBanme Next End Sub --------------- Private Sub UserForm_Initialize() Set SAGASU = Worksheets("2月") Maxl = SAGASU.UsedRange.Rows.Count End Sub --------------- Private Sub CommandButton1_Click() Dim Namae As String Dim MeNamae As Object Namae = TextBox1.Text Set MeNamae = KensakuForm Call 検索(Namae, MeNamae) End Sub ---------------- Private Sub CommandButton2_Click() End End Sub ---------------- Private Sub ListBox1_Click() ListIdx = ListBox1.ListIndex Namae = ListBox1.List(ListIdx) End Sub 文字数制限の為、一部抜いていま

専門家に質問してみよう