• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excelマクロで不要な行を繰り返し処理で削除する)

Excelマクロで不要な行を削除する方法

このQ&Aのポイント
  • Excelマクロを使用して、不要な時間帯のデータを行ごと削除する方法をご紹介します。
  • 削除対象の条件は9:00:00~18:00:00以外の夜間や早朝の時間帯です。
  • 繰り返し処理を使用して、データが入力されている行数分を処理します。秒数と分数はすべて0に設定します。

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

  • ベストアンサー
  • CC_T
  • ベストアンサー率47% (1038/2202)
回答No.2

hour(シリアルデータ)で、時刻が取り出せます。 以下、ベーシックなものですけどお望みの処理が出来るはずです。  Lastが検出したシート中の最下行  Lが現在の処理行 Lastから2行目までをfor~nextで回しているだけです。 ~~~ Sub Macro1() Dim L As Integer last = Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row For L = last To 2 Step -1 If Hour(Cells(L, 1)) <= 18 Then If Hour(Cells(L, 1)) >= 9 Then GoTo Label0 End If Rows(L).Delete Label0: Next L End Sub

fxlateengineer
質問者

お礼

ご教示頂きました内容で希望通りの動作を得ることができました。ご回答下り誠にありがとうございました。

その他の回答 (5)

  • kkkkkm
  • ベストアンサー率66% (1725/2595)
回答No.6

No3です。参考までに データを削除するので、No3のコードでは念のためにシートを指定するようにしています。 (なお、A列にはyyyy/mm/dd 09:00:00のような形式のデータしか入っていないものとしてます) With Sheets("現実のシート名") とシートをシート名で指定してするようにしていますが、シートの指定にはシート名で指定する方法以外に 左端からの順番で指定する例 With Sheets(1) シート名が変わってもコードを変更しなくてもよいが、順番が変わるとコードを変更しなくてはいけない オブジェクト名で指定する例 With Sheet1 シート名が変わっても順番が変わつてもコードを変更しなくてよい。 という指定の方法があります。 詳細な説明は以下のページ(シートを開く説明ですが)を参考にしてください。 http://officetanaka.net/excel/vba/sheet/sheet01.htm

  • weboner
  • ベストアンサー率45% (111/244)
回答No.5

こんなのも Sub 削除() Dim m_Cell As Range Dim m_Union As Range For Each m_Cell In Range("A1", Range("A1").End(xlDown)) If Hour(m_Cell.Value) < 9 Or Hour(m_Cell.Value) > 18 Then If m_Union Is Nothing Then Set m_Union = m_Cell Set m_Union = Union(m_Union, m_Cell) End If Next If Not m_Union Is Nothing Then m_Union.EntireRow.Delete End Sub

fxlateengineer
質問者

お礼

今回は、CC_T様にご回答頂いた内容で正しく動作できましたのでそちらを採用させて頂きますが、weboner様から頂いた内容についても勉強のため試してみたいと思います。ご回答下さり誠にありがとうございます。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

こんばんは! タイトルにあるような「繰り返し処理」でなく、行毎一気に削除してみました。 データは1行目からあるとします。 Sub Sample1() Dim lastRow As Long Range("A:A").Insert Rows(1).Insert Range("A1") = "ダミー" lastRow = Cells(Rows.Count, "B").End(xlUp).Row With Range(Cells(2, "A"), Cells(lastRow, "A")) .Formula = "=HOUR(B2)" .Value = .Value End With Range("A1").AutoFilter field:=1, Criteria1:="<9", Operator:=xlOr, Criteria2:=">18" Range(Cells(1, "A"), Cells(lastRow, "A")).SpecialCells(xlCellTypeVisible).EntireRow.Delete shift:=xlUp Range("A:A").Delete End Sub ※ オートフィルタを使っているだけです。 ※ 1行目が何らかのタイトル行で、データは2行目以降にある場合は 1行目の行挿入は不要になります。m(_ _)m

fxlateengineer
質問者

お礼

今回は、CC_T様にご回答頂いた内容で正しく動作できましたのでそちらを採用させて頂きますが、tom04様から頂いた内容についても勉強のため試してみたいと思います。ご回答下さり誠にありがとうございます。

  • kkkkkm
  • ベストアンサー率66% (1725/2595)
回答No.3

Sub Example() Dim i As Long With Sheets("Sheet1") 'Sheet1には現実のシート名を記載してください。 For i = .Range("A" & Rows.Count).End(xlUp).Row To 1 Step -1 If Hour(.Range("A" & i).Value) < 9 Or Hour(.Range("A" & i).Value) > 18 Then .Rows(i).Delete Shift:=xlUp End If Next End With End Sub でいかがでしょう。

fxlateengineer
質問者

お礼

今回は、CC_T様にご回答頂いた内容で正しく動作できましたのでそちらを採用させて頂きますが、kkkkkm様から頂いた内容についても勉強のため試してみたいと思います。ご回答下さり誠にありがとうございます。

  • weboner
  • ベストアンサー率45% (111/244)
回答No.1

マクロじゃなくてもフィルタ掛けて抽出も可能ですが、どうしてもマクロがいいですか?

関連するQ&A

専門家に質問してみよう