Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Microsoft 365)
フィルターで該当データのみを別シートにコピーし元シートのデータは削除したい
投稿日時: 23/09/12 09:45:57
投稿者: yusukyo0123

シートAのA〜N列の2行目(1行目タイトル)からある情報のうち、N列に「True」と表示されたもののみ
シートBのA〜N列の2行目(1行目タイトル)に転記し、
元のシートAの転記元「True」行は削除するマクロを組みたいのですが、最後がうまくいきません。
どのようにしたらよいか教えてください。
 
 
Sub 発行依頼()
 
 
 
Dim ws1 As Worksheet, ws2 As Worksheet
Dim i As Long
Const N列 As Long = 14
 
    Set ws1 = Sheets("シートA")
    Set ws2 = Sheets("シートB")
    With ws1
        With .Range("$A$1:$N$1000")
            .AutoFilter Field:=N列, Criteria1:=True
         
            Intersect(.Cells, .Cells.Offset(1)).Copy _
                 Destination:=ws2.Range("A" & ws2.Rows.Count).End(xlUp).Offset(1)
 
            .AutoFilter 'オートフィルタ解除
        End With
         
    'k列セル=trueの行を削除する
        For i = .Cells(.Rows.Count, "A").End(xlUp).Row To 2 Step -1
            If .Cells(i, N列).Value = True Then
                .Rows(i).Delete
            End If
        Next
    End With
 
End Sub
 

回答
投稿日時: 23/09/12 10:22:32
投稿者: sk

引用:
最後がうまくいきません。

具体的にどの部分がどのように「うまくいかない」のか、
期待している実行結果とはどのようなところが違うのかについて
明記されることをお奨めします。

投稿日時: 23/09/12 10:27:24
投稿者: yusukyo0123

失礼しました。元のシートAの転記元「True」行は削除する部分がうまくいきません。
ご教示いただけますと幸いです。

回答
投稿日時: 23/09/12 10:40:57
投稿者: WinArrow

>元のシートAの転記元「True」行は削除する部分がうまくいきません。
コードは実行されているが、意図と違うのか?
コードがエラーで実行されないのか?
 
この辺りを明確にしましょう。
 
> 'k列セル=trueの行を削除する
チェックしているセルとコメントが違うが・・・関係あるの?

回答
投稿日時: 23/09/12 10:42:13
投稿者: higejee

 パッと見なんじゃこら?という箇所はあるものの、動作的には問題なく、ちゃんと N 列が TRUE の行が削除されました。
 うまくいかないというのは削除されないということですか? 最後(一番上の TRUE 行)だけ? あるいは何かエラーになるとか?

回答
投稿日時: 23/09/12 10:42:24
投稿者: WinArrow

> With .Range("$A$1:$N$1000")
↑は、CurrentREgin
の方が安全確実と思いますが・・・

回答
投稿日時: 23/09/12 10:44:10
投稿者: wtnb
投稿者のウェブサイトに移動

シートAのN列の「True」は、文字列ですか?
 

回答
投稿日時: 23/09/12 10:49:54
投稿者: sk

引用:
元のシートAの転記元「True」行は削除する部分がうまくいきません

引用:
For i = .Cells(.Rows.Count, "A").End(xlUp).Row To 2 Step -1
    If .Cells(i, N列).Value = True Then
        .Rows(i).Delete
    End If
Next

・上記のいずれかのステートメントにおいて実行時エラーが発生する。
 
・エラーが発生することなくコードの実行が完了するが、
 [シートA]から削除されるべきはずの一部の行が削除されない。
 または[シートA]のどの行も削除されない。
 
・エラーが発生することなくコードの実行が完了するが、
 [シートA]から削除されてはいけない行が削除されてしまう。
 
・上記以外の現象。
 
以上のどれに該当するのか、その詳細と共に明記して下さい。

投稿日時: 23/09/12 10:56:11
投稿者: yusukyo0123

度々失礼しました。以下の状況です。
・エラーが発生することなくコードの実行が完了するが、
 [シートA]のどの行も削除されない。

回答
投稿日時: 23/09/12 10:56:55
投稿者: simple

ステップ実行というの使ったことないですか?
F8キーを押しながら一行一行実行するやつですが。
 
    .Rows(i).Delete
は実行されていますか?
実行されていないとすると、その前の行の条件が満たされないのはなぜか、
と考えて、ご自分で調べてみたらどうですか?それが一番の近道ですよ。
 
こちらでは、普通に削除されます。
たぶん、たぶんですが、質問者さんがなんらかの考え違いをしている可能性が高いです。

投稿日時: 23/09/12 10:59:53
投稿者: yusukyo0123

wtnb さんの引用:
シートAのN列の「True」は、文字列ですか?
 

 
シートAのM列でL列について既に転記しているシートBに重複がないか確認しており、
シートAのN列に”=AND(ISNUMBER(L2),M2=0)”でTrue表記になったものについてシートBに転記したいです。

回答
投稿日時: 23/09/12 11:12:30
投稿者: higejee

 「TRUE が文字列」説はありかとも思いましたが、文字列でも支障なく動きますね。
 とにかくまずはステップ実行で「.Rows(i).Delete」が実行されているかでしょうか。

回答
投稿日時: 23/09/12 11:23:28
投稿者: sk

引用:
・エラーが発生することなくコードの実行が完了するが、
 [シートA]のどの行も削除されない

引用:
For i = .Cells(.Rows.Count, "A").End(xlUp).Row To 2 Step -1

・上記のステートメントにおいて参照されるセルの Row プロパティの値が 1 である。
 (=ループ処理が発生しないので、行の削除処理も実行されない)
 この場合、[シートA]の A 列の(全ての、または 1 行目以外の)セルは
 全て空白セルであるということになる。
 
引用:
Const N列 As Long = 14

引用:
If .Cells(i, N列).Value = True Then

・[シートA]の 2 行目以降に、N 列のセルの値が True である行が 1 つもない。
 
以上のいずれかに該当するからでしょう。
 
前者の場合は、とりあえず以下のように書き換えてみて下さい。
 
--------------------------------------------------------------
 
For i = .Cells(.Rows.Count, N列).End(xlUp).Row To 2 Step -1
 
--------------------------------------------------------------

投稿日時: 23/09/12 11:47:39
投稿者: yusukyo0123

sk様、WinArrow様、higejee様、wtnb様、simple様
 
ご教示ありがとうございます。
ステップ実行で確認したところ構成に問題があることが判明しました。
転記を実行するとシートAとシートBの重複が発生するので
 
・[シートA]の 2 行目以降に、N 列のセルの値が True である行が 1 つもない。
 
状況になっておりました。重複があるものを削除に変更して
 
  For i = .Cells(.Rows.Count, N列).End(xlUp).Row To 2 Step -1
            If .Cells(i, M列).Value = 1 Then
                .Rows(i).Delete
 
としたところ想定した動きになりました。
ご教示ありがとうございました。