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

わかる方がいらっしゃいましたら、お願いします。

「エクセルVBAの繰り返し処理の質問」の質問画像

このQ&Aに関連する最新のQ&A

A 回答 (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
文中のカラム数値は変更して下さい。
    • good
    • 0

#5です。

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

>C列にある項目とG列にある項目を比較して、・・


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

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

今後、勉強して、わかるようになっていきたいと思っています。
すみませんでした。

お礼日時:2009/05/22 09:23

こんな感じでは?



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
    • good
    • 0

・「C列にある項目とG列にある項目を比較して、一致し」という条件分岐がありません。



・ Cells(i - 1, 4) = 1  なぜ i - 1 なのでしょうか? i で良いと思いますけど。

・内側のループの条件は、Cells(i, 3) = "" だけで良いと思います。
 内側のループでは、一致するものを探しているのに、Cells(i, 3) <> Cells(j, 7) これも条件にしてしまうと、一度違ったらループが終了してしまって、一致するところまで辿り着けなくなります。

とりあえず、この3点を直してみてください。
    • good
    • 0
この回答へのお礼

解答ありがとうございます。
>Cells(i - 1, 4) = 1  なぜ i - 1 なのでしょうか? i で良いと思いますけど。

確かに私もそう思ったんです。
でも、i - 1にするとうまくいくんです。
なんか不安は残りますが・・・。

次に、
>内側のループの条件は、Cells(i, 3) = "" だけで良いと思います。
 内側のループでは、一致するものを探しているのに、Cells(i, 3) <> Cells(j, 7) これも条件にしてしまうと、一度違ったらループが終了してしまって、一致するところまで辿り着けなくなります。

文章が足りていませんでした。すみません。
このデータは、すでに並び替えられているので、大丈夫だと思います。

いろいろ、ご教授ありがとうございます。

お礼日時:2009/05/22 09:49

一例です。


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
    • good
    • 0

この手の処理は「決めウチ」にしてしまうと汎用性がなくなりますので、


セルを選択した位置を基準に処理を継続していくように作るのが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列が空白に
なるまで継続して実行します。なお、この程度なら敢えて変数の宣言
などはしなくて良いと思うので、宣言は入れていません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング

おすすめ情報