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

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

Excelマクロで不要な行を繰り返し処理で削除する

下記の図表【事前】のA列に時間(シリアル値)が入力されていますが、 これをマクロを使って不要な時間帯のデータを行ごと削除したいです。 それを実行するためのマクロをご教示頂けますでしょうか? 削除対象の条件 ・9:00:00~18:00:00以外の夜間や早朝の時間帯は削除する。 その他 ・データが入力されている行数分繰り返し処理 ・秒数、分数は全て0 ・列は3列(B、C列は任意) ・Excelのバージョンは2007 【事前】   A                        B      C 1 yyyy/mm/dd 01:00:00 ※削除対象 2 yyyy/mm/dd 23:00:00 ※削除対象 3 yyyy/mm/dd 09:00:00 4 yyyy/mm/dd 15:00:00 5 yyyy/mm/dd 17:00:00 6 yyyy/mm/dd 19:00:00 ※削除対象 7 yyyy/mm/dd 04:00:00 ※削除対象 【事後】   A                        B      C 1 yyyy/mm/dd 09:00:00 2 yyyy/mm/dd 15:00:00 3 yyyy/mm/dd 17:00:00

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

  • ベストアンサー
  • CC_T
  • ベストアンサー率47% (1038/2201)
回答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
  • ベストアンサー率65% (1608/2445)
回答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
  • ベストアンサー率65% (1608/2445)
回答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

  • Excel VBAで教えてください。

    Excel VBAで教えてください。 テキストデータをExcelで読み込んだ後、Sheet1に以下のデータが入っており、 A列 B列   C列 氏名 開始日(yyyy/mm/dd) 終了(yyyy/mm/dd) テキストボックスに開始日(yyyy/mm/dd)、終了日(yyyy/mm/dd)、を入力し、入力した開始日から終了日のデータ検索し、A列からのデータをコピーし、Sheet2に貼り付けしたい。 テキストデータをExcelで読み込むコードはできたのですが、その後の処理ができずに困っています。 ユーザーフォームに入力するコードも教えてください。

  • エクセルマクロの質問です。

    こんばんわ!! エクセルマクロのデータ形式で、うまく設定できず困っています。 下記のようにA1セルにユーザーフォームのデータを入力しました。 Range("a1") = UserForm1.TextBox1 TextBox1にはyyyy/mm/dd形式でデータを入力しています。 0を1899/12/31にするのはできるのですが、1899/12/31を0とするデータ(シリアル値?)に直したいのですが、どうすればよいでしょう? アドバイスの程よろしくお願いいたします。

  • yyyy/mm/ddの日付に一括変換するマクロ

    [セルの書式設定] の [表示形式]が標準(日付ではない)で単なる文字列となっている「mm-dd-yyyy」や「mm/dd/yyyy」のデータをマクロで「yyyy/mm/dd」の日付データに一括変換するマクロを教えてください。 たとえば、日付データが列Aにある場合にはDATE関数で、 =DATE(RIGHT(A2,4),LEFT(A2,2),MID(A2,4,2)) でも変換可能ですが、対象ファイルが多数、各ファイルにも対象の列が多数、そしてファイルの更新頻度も多いため、DATE関数を使用することは現実的ではない事情があります。 このためマクロを使用して処理させたいです。 添付のサンプルの例で一括変更するマクロを教えてください。 なお、Excelは2007を使用しています。

  • マクロによる条件での行の入力と削除

     初めまして、よろしくお願いします。  次のような二枚のシートがあります  シート1      A  B  C   1     2       ・      99      100 23    101 25   102 31   103 34  104 43  105 44  106 49  107 50  108 55  109 60  110  111  ・  ・  シート2      A  B  C   1     2       ・      99      100 23  1 2 3   101 25  4 5 6 102 31  7 8 9     103 34  0 1 2  104 43  3 4 5     105 44  6 7 8 106 49  9 0 1 107 50  2 3 4 108 55  5 6 7 109 60  8 9 0 110  111  ・  ・ シート1とシート2のA列に入っている数字が通し番号です。シート2では加えてその通し番号のデーター数字がB列、C列、D列に入っています。 のこシート1の通し番号31が削除、代わりに通し番5番と51番を追加し、  シート1      A  B  C   1     2       ・      99      100  5 101 23    102 25     103 34  104 43  105 44  106 49  107 50  108 51 109 55  110 60  111  112  ・  ・ マクロを実行すると  シート2      A  B  C   1     2       ・      99      100  5 101 23  1 2 3   102 25  4 5 6    103 34  0 1 2  104 43  3 4 5     105 44  6 7 8 106 49  9 0 1 107 50  2 3 4 108 51 109 55  5 6 7 110 60  8 9 0 111  112  ・  ・ シート2がこように通し番号31が入っていた行番102行が削除され、新たに通し番5番が行番100に、51番が行番108に挿入追加されるマクロを教えていただきたく、よろしくお願いします。

  • 行削除のマクロ

    B列~F列にデータが入っていてB列の最終行の下セルを選択しクリップボードのデータを貼り付けた後、貼り付けたデータの最初の3行を削除するマクロを作っています。 Sub Macro1() ''Worksheets("Sheet1").Activate ' addrw = Range("b65536").End(xlUp).Offset(1).Row Cells(addrw, 2).PasteSpecial end sub これでB列の最終行の下にデータを貼り付けることまで出来たのですが貼り付けた最初の3行の削除の仕方がわかりません。 いい方法があれば教えていただけないでしょうか。  例えばB列の10行目まで既に入力されていた場合、11行目からクリップボードのデータを貼り付け(ここまでは上のプログラムで出来ました。)、11行目から13行目を削除したいのですがどうしたらいいでしょうか?

  • マクロでの条件判断について

    A行に何かデータを入力した場合、同じ列のとなりの行のセルに入力時間を残したいと思い、 例 A1:あ B1:2006/5/9/16:00 A2:い B2:2006/5/10/18:00 以下のマクロを教えて頂いたのですが、 Private Sub Worksheet_Change(ByVal Target As Range) '///A列のセル以外ならマクロ終了/// If Target.Column <> 1 Then Exit Sub '///1行目のセルならマクロ終了/// If Target.Row = 1 Then Exit Sub '///内容がブランクならB列のセルをブランクにする。/// If Target.Value = "" Then Target.Offset(0, 1).Value = "" Else Target.Offset(0, 1).Value = Format(Date + Time, "yyyy/mm/dd hh:mm:ss") End If End Sub A列以外にもC列に入力した値の入力時間をD列にE列に入力した値の入力時間をF列にと、全部で6箇所値を入力したとなりのセルに入力時間が出るようにしたかったのですが、 '///A列のセル以外ならマクロ終了/// If Target.Column <> 1 Then Exit Sub の部分を '///A,C列のセル以外ならマクロ終了/// If Target.Column <> 1 Or Target.Column <> 3 Then Exit Sub のように変更してまずはA列とC列に値を入れて挑戦したのですが、時間が表示されなくこまっておりました。 解決方法をご存知のかたがいらっしゃいましたら、ぜひよろしくお願いいたします。

  • エクセルのマクロ

    教えてください。   A     B   C 1 部品番号  ○   済印 2 111111   ○   済 3 222222   ○   済 4 333333   ○ という表があるとします。 B列にマクロのボタンを作っておき、 A列に部品番号を入力したら、マクロのボタンを押して、 C列に済、という字を表示したいのです。 1部品入力するごとに、その表示をさせたいです。 2行目、3行目・・・と一つずつマクロを登録して いく方法は、(マクロについては詳しくないので、マクロの記録、マクロの停止、という方法しかわかりません)入力するデータが100件以上あるため、それもどうかな・・と悩んでいます。超初心者なのですが、何とか完成したいと思っています。 よろしくお願い致します。

  • マクロでオートフィルターの抽出が出来ない

    下記のデーターをマクロで作成しましたが、2010/03/01は抽出するが、2010/03/02以降は デバッグが発生して上手くいきません。 どの様にすれば解決できるのか、ご教授お願いします。 現状) AファイルのA列のオートフィルタオプションで、抽出条件の指定にBファイルの C6をコピーして、「Ctrl」+「V」で貼り付け抽出すると2010/03/01の24時間分の データーが抽出されます。2010/03/02を抽出するとデバッグが発生する。 データーの詳細) Aファイルに「元データー Sheet」があり、A6~A44647に、 1ヶ月分の日付が記載されてます。 (B6~B44647には、24時間を1分間隔でのデーターがあります) A列の日付は、2010/03/01~2010/03/31のデーターがあり、 「セルの書式設定」を確認すると、「標準」設定で表記されてます。 オートフィルタによりA列の、各1日分のデーターを抽出させます。 Bファイルの「作成日指定 Sheet」のB3に2010/3/1を入力すると C6には「=$B$3」で「2010/03/01」と表示する様に「セルの書式設定」 「ユーザー定義」で「yyyy/mm/dd」を選択してます。(C36まで設定) 以下C7に「=$B$3+1」で、C8には「=$B$3+2」で、C36までで「2010/03/31」 と表示させてます。

  • Excelでマクロを使用した削除に関して

    マクロ初心者です。 Excelにて、以下のような表データがあるとします。     A列 B列 C列 D列 E列 … 1行      51  50  52  51    2行  50  a   b   c   d 3行  51  e   f    g   h    4行  52  i    j    k   l この表の中で、A列と1行目の値が同じになる交点となるセルの値"以外"を 削除して以下のように表示させたいのですが、 その方法がわかりません。     A列 B列 C列 D列 E列 … 1行      51  50  52  51    2行  50      b       3行  51  e          h    4行  52          k    単純な行削除・列削除ではないため、 頓挫しています。お知恵を拝借したく、よろしくおねがいします。

  • エクセルかマクロで・・・

    エクセル関数かマクロで作りたいのですが、   A列に数字B列に個数を入力していくとします。   A列の数字をB列の個数分だけC列に表示したいのです。  例えばA1に300、B1に5、A2に500、B2に6と入力した場合、   C1からC5に300、C6からC11に500、と表示するにはどうしたらよい  でしょうか。 よろしくお願いいたします。

専門家に質問してみよう