プロが教える店舗&オフィスのセキュリティ対策術

マクロ初心者な為、マクロについてご教授願います。

現在、下記のようなマクロを作成いたしました。
特定のシートに有効としたいのですが
どの部分に特定シートという追記をしたらよろしいでしょうか?
----------------------------------------------------------------------
Sub P列ゼロセル行削除(Optional ダミー As Byte)
Dim irow As Long
Dim i As Long
irow = Cells(Rows.Count, 1).End(xlUp).Row
Application.ScreenUpdating = False
For i = irow To 2 Step -1
If Cells(i, 16).Value = 0 Then
Range(i & ":" & i).Delete
End If
Next i
Application.ScreenUpdating = True
End Sub
----------------------------------------------------------------------

何卒よろしくお願いいたします。

A 回答 (12件中1~10件)

No.1・10です。



たびたびごめんなさい。
No.10で記載したとおり、各シート名が判っているというコトであれば
データ量が多い場合はオートフィルタの方が速いと思います。

前回同様、A・B・C というシート名のみ操作しています。
そして各シートのP1セルには項目名が入っていて、2行目以降にデータがあるという前提です。

Sub Sample2()
 Dim k As Long, lastRow As Long
 Dim myAry
  myAry = Array("A", "B", "C")
   For k = 0 To UBound(myAry)
    With Worksheets(myAry(k))
     lastRow = .Cells(Rows.Count, "P").End(xlUp).Row
      .Range("P:P").AutoFilter field:=1, Criteria1:="=0"
       If .Cells(Rows.Count, "P").End(xlUp).Row > 1 Then
        Range(.Cells(2, "P"), .Cells(lastRow, "P")).SpecialCells(xlCellTypeVisible).EntireRow.Delete
       End If
     .AutoFilterMode = False
    End With
   Next k
    MsgBox "完了"
End Sub

こちらの方がループをさせていないだけ速いかも・・・m(_ _)m
    • good
    • 1
この回答へのお礼

ありがとう

再度ご教授いただきありがとうございます。

確かに早く処理できました。
マクロに関しては初心者な為、勉強になります。

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

お礼日時:2020/01/30 22:08

「Delete」を使わず「ClearContents」で空欄にしておいて、ソートで一気に間を詰めています


※ ソートを掛けているので、データの順番は変わってしまいます

--------------------------------------------------------------------------------------
☆ シート名を列挙する場合

Sub Sample1()
 Call P列ゼロセル行削除1("Sheet1")
 Call P列ゼロセル行削除1("Sheet3")
 MsgBox ("終了しました")
End Sub

Sub P列ゼロセル行削除1(シート名 As String)
Dim i As Long
 Sheets(シート名).Select
 Application.ScreenUpdating = False
 For i = Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1
  If Cells(i, 16).Value = 0 Then Rows(i).ClearContents
 Next i
 Cells.Sort Key1:=Range("P2"), Order1:=xlAscending, Header:=xlYes
 Application.ScreenUpdating = True
End Sub
--------------------------------------------------------------------------------------


--------------------------------------------------------------------------------------
☆ シート名の頭に選別マークを使う場合

Sub P列ゼロセル行削除3(Optional ダミー As Byte)
Const HStr As String = "☆" '選別マーク
Dim WSht As Object
Dim i As Long, j As Long
 For Each WSht In Sheets
  If Left(WSht.Name, 1) = HStr Then
   WSht.Select
   Application.ScreenUpdating = False
   For i = Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1
    If Cells(i, 16).Value = 0 Then Rows(i).ClearContents
   Next i
   Cells.Sort Key1:=Range("P2"), Order1:=xlAscending, Header:=xlYes
   Application.ScreenUpdating = True
  End If
 Next
End Sub
--------------------------------------------------------------------------------------
    • good
    • 1
この回答へのお礼

こんばんは。

何度もご教授頂きましてありがとうございます。

いろいろな処理処理方法があることを教えて頂き、初心者なわたしにはとても勉強になっています。

別途下記に質問させていただいているように、データを貼りつけて、諸々処理をしてExcelファイルに変換するという作業が多くピンポイントで教えて頂けること
大変感謝しております。

ありがとうございます。

http://oshiete.goo.ne.jp/qa/11466325.html

お礼日時:2020/01/30 22:15

No.1です。



操作対象のシート名はあらかじめ判っているのでしょうか?
もし判っているのであれば・・・(仮にシート名を A・B・C とした場合です)
一例です。

Sub Sample1()
 Dim i As Long, k As Long
 Dim myRng As Range
 Dim myAry

  myAry = Array("A", "B", "C") '//←対象シート名を羅列しておく//
   Application.ScreenUpdating = False
    For k = 0 To UBound(myAry)
     With Worksheets(myAry(k))
      For i = 2 To .Cells(Rows.Count, "P").End(xlUp).Row
       If .Cells(i, "P") = 0 Then
        If myRng Is Nothing Then
         Set myRng = .Cells(i, "P")
        Else
         Set myRng = Union(myRng, .Cells(i, "P"))
        End If
       End If
      Next i
       If Not myRng Is Nothing Then
        myRng.EntireRow.Delete
       End If
       Set myRng = Nothing
     End With
    Next k
   Application.ScreenUpdating = True
    MsgBox "完了"
End Sub

こんな感じではどうでしょうか?

※ 他の方法としてはオートフィルタを使うのが速いかも・・・m(_ _)m
    • good
    • 1
この回答へのお礼

助かりました

こんにちわ。

度々恐縮です。
ご教授頂きましてありがとうございます。

ご教授頂きましたマクロで検証しましたところ、スピードが以前より早く処理完了できました!!
対象シートと列を指定することによって処理スピードがかなり変わるのですね。
大変勉強になりました。

ありがとうございます。

お礼日時:2020/01/30 18:16

行削除はどうしても時間がかかります。


どこかの列をキーにしてソートしてしまっても良ければスピードアップを図れるかもしれません。
問題が無ければ、キーになる列を提示して下さい。
    • good
    • 1
この回答へのお礼

お世話になっております。

ご返信ありがとうございます。

>行削除はどうしても時間がかかります。
→そうなのですね。承知いたしました。

>どこかの列をキーにしてソートしてしまっても良ければスピードアップを図れるかもしれません。
>問題が無ければ、キーになる列を提示して下さい。
→P列で”0”がある行を削除したいので、P列でソートをかけても問題ございません。
 ただし、削除後フィルターを解除した状態だと幸いです。

お礼日時:2020/01/30 11:44

こちらはシートの選択にシート名に付けた選別マークを使う方法です。


※ 初期値では「☆」が頭についているシートが対象になります。

Sub P列ゼロセル行削除2(Optional ダミー As Byte)

Const HStr As String = "☆" '選別マーク
Dim WSht As Object
Dim i As Long, j As Long

 For Each WSht In Sheets
  If Left(WSht.Name, 1) = HStr Then
   WSht.Select
   Application.ScreenUpdating = False
   For i = Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1
    If Cells(i, 16).Value = 0 Then Rows(i).Delete Shift:=xlUp
   Next i
   Application.ScreenUpdating = True
  End If
 Next

End Sub
    • good
    • 1
この回答へのお礼

お世話になっております。

ご教授頂きましてありがとうございます。
無事解決いたしました。
ただ、だいぶ時間がかかってしまいます(5分弱)
解消方法はございますでしょうか?
何度も申し訳ありませんが、よろしくお願いいたします。

お礼日時:2020/01/30 10:48

No.5 についての補足



2つに分かれていますがセットで使います。使うのは「Sample」ですが、内部で「P列ゼロセル行削除」を呼び出しています。
この「Sample」をマクロリストに表示させたくなければ「Sub Sample(Optional ダミー As Byte)」にして下さい。
    • good
    • 1
この回答へのお礼

そうでしたか。
補足頂きありがとうございます。
また、理解不足で申し訳ありません。

承知いたしました!
早速試してみます。

また、追加での質問ありましたら記載させていただきます。

お礼日時:2020/01/30 07:15

No.5 の訂正



この場合はシート名を指定しないといけないので「Sub P列ゼロセル行削除(Optional シート名 As String)」ではなく「Sub P列ゼロセル行削除(シート名 As String)」の方が良いと思います。(動かないわけではありませんが「Optional」は付けてはいけません。)
    • good
    • 1

シート名にマークを付ける件、どうやらご賛同いただけなかったので列挙型で…


※「P列ゼロセル行削除」マクロもほんの少し直しました。

Sub Sample()
 Call P列ゼロセル行削除("Sheet1") '←このように対象シートを列挙して下さい
 Call P列ゼロセル行削除("Sheet2") '←このように対象シートを列挙して下さい
 MsgBox ("終了しました")
End Sub

Sub P列ゼロセル行削除(Optional シート名 As String)
Dim i As Long
 Sheets(シート名).Select
 Application.ScreenUpdating = False
 For i = Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1
  If Cells(i, 16).Value = 0 Then Rows(i).Delete Shift:=xlUp
 Next i
 Application.ScreenUpdating = True
End Sub
    • good
    • 1
この回答へのお礼

おはようございます。

ご教授いただきましてありがとうございます。

また、シートにマークをつける件、わたしのお伝えの仕方が分かりづらかったですね、大変失礼いたしました。

賛同した上で、複数と1枚とでマクロの記載方法が違ってくるということをご教授頂きたかった次第です。

今回、その2通りご教授頂きありがとうございます。

早速、試してみます。

お礼日時:2020/01/30 06:51

ちなみに特定シートは何枚くらいあるのでしょうか?


5枚以上だとシート名を列挙するのも大変なのでシート名の頭に「☆」などのマークを付ける方が処理も簡単だし、コードをいじることなく、シート名を変えるだけで特定シートを変更できるので便利だと思いますがいかがでしょうか?
    • good
    • 1
この回答へのお礼

ブックによって、複数だったり一シートだったりするので、それによって記載方法が異なったほうがよいのですね?

お礼日時:2020/01/29 23:17

特定のシートが1つだけなら、「Dim i As Long」の次の行に「Sheets("○○").Select」のような物を入れれば良いと思います。

    • good
    • 1
この回答へのお礼

特定のシートが複数あります。

お礼日時:2020/01/29 22:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!