- ベストアンサー
エクセルマクロで特定の範囲内の検索
A10からA100までのセルを上から順に調べて、セルにAという文字が入力されているときに、その隣にBという文字を入力するマクロを下記のように作りました。 「セルにAという文字が入力されているとき」という条件に加え、「検索しているセルから上の9個のセル(cells(i-9,1)からcells(i-1,1)まで)にAという文字が入力されていない」という条件を加えたいのです。 Sub 検索() Dim i As Integer For i = 10 To 100 If Cells(i, 1).Value = "A" Then Cells(i, 2).value = "B" End If Next i End Sub つまり If Cells(i, 1).Value = "A" Then の部分を If Cells(i, 1).Value = "A" かつ Range(cells(i-9,1),cells(i-1,1))にAが入力されていない Then という形にしたいのですが、表現の仕方がわかりません。 ご教示よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
Sub 検索() Dim i As Integer For i = 10 To 100 If Cells(i, 1).Value = "A" Then If WorksheetFunction.CountIf(ActiveSheet.Range(Cells(i - 9, 1), Cells(i - 1, 1)), "A") = 0 Then Cells(i, 2).Value = "B" End If End If Next i End Sub ではどうでしょう?
その他の回答 (2)
- masa_019
- ベストアンサー率61% (121/197)
こんにちは。 「Range(cells(i-9,1),cells(i-1,1))にAが入力されていない」 の部分を関数にしてしまうのが、簡単だと思います。 Sub 検索() Dim i As Long For i = 10 To 100 If Cells(i, 1).Value = "A" And myFunc(Cells(i, 1)) Then Cells(i, 2).Value = "B" End If Next i End Sub Function myFunc(ByVal rng As Range) As Boolean 'rngの上9セルをループして"A"が含まれていたらFalseを返す Dim r As Range myFunc = True For Each r In rng.Offset(-9).Resize(9) If r.Value = "A" Then myFunc = False Next End Function
お礼
ありがとうございます。 nobunorinobuの方法もそうですが、こちらに質問すると自分が期待していた以上の様々な方法を提示していただけるので、初心者の私にとってはとても勉強になります。
- nobunorinobu
- ベストアンサー率30% (19/63)
Sub 検索() Dim i,j As Integer For i = 10 To 100 If Cells(i, 1).Value = "A" Then flg=0 for j=1 to 9 if Cells(i-j,1)="A" then flg=1 Next j if flg=0 then Cells(i,2).Value ="B" End If Next i End Sub Range関数も使わず2重ループにしただけです。 多少遅いかもしれませんが参考に。
お礼
ありがとうございます。 いろいろな方法があるものですね。
お礼
ありがとうございました。 解決しました。