[[20190606125422]] 『行ごとデータの移動をマクロでしたい』(りんご飴) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『行ごとデータの移動をマクロでしたい』(りんご飴)

データシートのI列×が入力されている行をバックアップシートに移動したい。

過去の質問を見ながらコードを作成してみたのですがどうしてもうまく動きません。
エラーにならず移動しないまま処理が終了します。

分かるところから調べてみると何故か「Z」の返り値が0になってしまいます。

実際のデータは200行くらいあり、そのうち10件位に×が入力されています。
B/C/D列のみ必ずデータが入力されていて、それ以外は空白セルが存在しています。

 Sub 行の移動() 
    Dim i As Long, z As Long, y As Long 
    Dim sh2 As Worksheet 
    Application.ScreenUpdating = False 
    Set sh2 = Sheets("バックアップ") 
    y = sh2.Range("B" & sh2.Rows.Count).End(xlUp).Row 
    With Sheets("データ") 
        z = .Range("I" & .Rows.Count).End(xlUp).Row 
        For i = z To 2 Step -1 
            If .Cells(i, "I").Value = "×" Then 
                y = y + 1 
                .Rows(i).Copy Destination:=sh2.Cells(y, 1) 
                .Rows(i).Delete 
            End If 
        Next 
    End With 
    Set sh2 = Nothing 
    Application.ScreenUpdating = True 
 End Sub 

どこがおかしいのか教えて頂けますか?

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

< 使用 Excel:Excel2007、使用 OS:Windows7 >


 全く検証してないけど、
 >.Rows(i).Copy Destination:=sh2.Cells(y, 1) 
 なんでコピー元は行で、貼り付け先は1セルの指定なの?
 なんか理不尽だと言わるかも?

 何にせよ
 仕上がり前に Application.ScreenUpdating = True とするのは良くないと思うし、
 F8ステップ実行でもしてみたら・・・・。
 F8ステップ実行する前に、無意味といわれるシートやセルの選択も入れてやると動きが解りやすいと思ういます。(私はよく入れて目で確認する)

 例えば、こんな感じに。

 .Cells(i, "I").select
 If .Cells(i, "I").Value = "×" Then
(BJ) 2019/06/06(木) 14:01

BJ様、お返事ありがとうございます。

行とセルの指定については、過去ログから見つけたコードで理解がなく書いています。

申し訳ないのですが、もう少し噛み砕いて教えていただけないでしょうか?

よろしくお願いします。
(りんご飴) 2019/06/06(木) 15:07


問題なく転記されそうですが?
それに、↓ありえないと思いますが???
 >z = .Range("I" & .Rows.Count).End(xlUp).Row  
 >分かるところから調べてみると何故か「Z」の返り値が0になってしまいます。

どのようにして、調べたのでしょうか。

(マナ) 2019/06/06(木) 21:24


マナ様ありがとうございます。

これも過去ログからからなのですが
コードの部分をクリックしたらグレーに反転して実行し
zにカーソルをあわせると0と浮かび上がってきました。

6行目のyは2と表示されたので(1行目にタイトルが入っている)
zは201で返ってくるのかと思っています。

やり方、間違っているにでしょうか?
(りんご飴) 2019/06/06(木) 21:45


>コードの部分をクリックしたらグレーに反転して実行し

この意味がわからないのです。
BJさんのコメントにある、ステップ実行は試していないのですか?
で、zがどうなるか確認してみてください。

(マナ) 2019/06/06(木) 22:03


 ステップ実行で黄色の帯(りんご飴さんの設定はグレーなのかも。。。^^;)
帯がZの真上に有る時(処理前?)は確かにゼロですけど次の行に来たときは
I列の×がある最下行のセルの行番号が格納されているはずだとおもうのですが
どうですか? 1 になっていませんか?
それと気が付いた点だけですがコード内の×と実際のI列の×が別の物と云う事
は無いでしょうか?一度念のため双方の文字コードを確認してみてはどうでしょ
うか。気が付いた点だけでした。でわ。。。m(_ _)m
(隠居じーさん) 2019/06/06(木) 22:32

一番簡単なのはコードの一番最後に
Debug.Print z
    MsgBox z
で
確認すれば解りますよ。
(隠居じーさん) 2019/06/06(木) 22:40

たぶん、隠居じーさんさんが推測されたように、
 z = .Range("I" & .Rows.Count).End(xlUp).Row

が、ハイライトされている状態(=その行は未実行)のときに、Long型の変数を見たから、初期値の0が見えたってことじゃないでしょうか?

変数の中身を確認する場合、教科書的にはローカルウィンドウで…となるのでしょうけど、私の場合、めんどくさいときは、イミディエイトウィンドウでDebug.Printしたり、変数に【代入した後】マウスカーソルを合わせて確認したりします。

ちなみに、提示されたコードで行っている処理について、ループ処理にこだわらないのであれは、

 オートフィルタを使って、対象を抽出
 抽出されたものをコピペ
 抽出されたものを削除

という処理で代用できそうです。

(もこな2) 2019/06/07(金) 09:00


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.