• ベストアンサー

エクセルマクロで特定の範囲内の検索

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 という形にしたいのですが、表現の仕方がわかりません。 ご教示よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.1

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 ではどうでしょう?

brownjune
質問者

お礼

ありがとうございました。 解決しました。

その他の回答 (2)

  • masa_019
  • ベストアンサー率61% (121/197)
回答No.3

こんにちは。 「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

brownjune
質問者

お礼

ありがとうございます。 nobunorinobuの方法もそうですが、こちらに質問すると自分が期待していた以上の様々な方法を提示していただけるので、初心者の私にとってはとても勉強になります。

回答No.2

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重ループにしただけです。 多少遅いかもしれませんが参考に。

brownjune
質問者

お礼

ありがとうございます。 いろいろな方法があるものですね。

関連するQ&A

専門家に質問してみよう