• ベストアンサー

エクセルVBAでアクティブセルから横に7個目のセルまでの範囲で、「欠勤

エクセルVBAでアクティブセルから横に7個目のセルまでの範囲で、「欠勤」と記入されているセルの列番号を取得する、範囲内に2つ以上あった場合は1番左側の列番号を取得する、なかった場合は取得しない、という文章を書きたいのですが、どなたか教えてください。

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

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

ここへ質問する前に、この課題の解決に必要な要素技術(大げさな表現だが許して)を考えて見るべきです。 (1)アクティブセル  ActiveCell、必要ならActivecel.row,ActiveCell.Columnで行、列をとらえる。 (2)横に7個目 Offsetが使えるかも知れないし、ActveCell.column+6が使えるかも Resizeなんていうのもある (3)範囲 RangeやRange(Cells(),Cells())ガ使えるかも。 (4)「欠勤」と記入されている セルの値を探すのはFind。その他には各列を舐める手もある(下記2番目のコード参照)。 (5)セルの列番号を取得する Columnプロパティ (6)範囲内に2つ以上あった場合は1番左側の列番号を取得する 1つ見つかれば探索をやめる。このほうが易しい課題。 (7)なかった場合は取得しない 当たり前だが、その場合何を返すべきなのか? ーー これらの全てがわからないというのかな。 ーー 参考に(欠勤をaに変えてテスト。データのある行にアクチブセルを置いて実行) Sub test01() Dim rng As Range MsgBox ActiveCell.Row r = ActiveCell.Row MsgBox ActiveCell.Column c = ActiveCell.Column MsgBox Range(Cells(r, c), Cells(r, c + 6)).Address Set rng = Range(Cells(r, c), Cells(r, c + 6)) rng.Select Set x = rng.Find("a") If x Is Nothing Then MsgBox "見つからず" Else MsgBox x.Column End If End Sub ーーーー >アクティブセル この処理は複数行を処理するのでは。 AciveCellという風に、変動化、相対化する必要が在る課題かな。 ではないように推測する。 プログラムではAciveCellやActivateは使わなくてすむものだ。 であればAciveCellなど考えずとも Sub test02() d = Range("C65536").End(xlUp).Row MsgBox d For i = 2 To d 'データ全行に亘り For j = 3 To 9 'C列からI列まで If Cells(i, j) = "a" Then MsgBox i & "," & j GoTo p1 End If Next j MsgBox "見つからず" p1: Next i End Sub が初心者にはこういうコードが参考になるのでは。

7-samurai
質問者

お礼

早速のご回答ありがとうございます。 非常に参考になりました!

その他の回答 (4)

  • TNK787
  • ベストアンサー率17% (25/141)
回答No.4

はは すみません 板汚しで・・。 Sub test() Dim i As Integer Dim col As Integer For i = 1 To 7 If ActiveCell.Offset(0, i).Value = "欠勤" Then col = i Exit For End If Next MsgBox col End Sub

7-samurai
質問者

お礼

早速のご回答ありがとうございました。 ”Exit For”ですね。覚えました。

  • TNK787
  • ベストアンサー率17% (25/141)
回答No.3

ANo.1 失礼 訂正します Sub test() Dim i As Integer Dim col As Integer For i = 1 To 7 If ActiveCell.Offset(0, i).Value = "欠勤" Then col = i Exit For End If Next MsgBox col & "" End Sub 投稿日時 - 2010-06-30 09:11:11

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

Sub test() Dim x As Range Set x = ActiveCell.Resize(, 7).Find("欠勤") If Not x Is Nothing Then MsgBox x.Column End If End Sub

7-samurai
質問者

お礼

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

  • TNK787
  • ベストアンサー率17% (25/141)
回答No.1

Sub test() Dim i As Integer Dim col As Integer For i = 1 To 7 If ActiveCell.Offset(0, i).Value = "欠勤" Then col = i End If Next MsgBox col & "" End Sub

関連するQ&A