• ベストアンサー

エクセルマクロの件(2)

お世話になります。 先日このサイトで教えていただき(No.3433483)、下記のようなマクロができました。 その節はありがとうございました。 マクロ実行したところ、1回目は問題なく動作し、マクロ実行によって作成されたデータを削除し、改めて実行すれば問題ありませんでした。 ただ、2回目以降(一覧データを削除せずそのまま実行)マクロを実行すると、毎回180行以降のデータが重複するようになりました。 3回実行すると、180行より前のデータは1行のみの表示ですが、181行目以降のものは3行同じデータが記載されるということです。 全てのデータが重複するのであれば分からなくはないのですが、一部分のみの重複なので意味が分からなくなってしまいました。 (マクロの中にそう処理するよう記載があるのだと思いますが素人のため分かりません;) 理由の分かる方がいらっしゃいましたらご指摘いただければと思いますのでよろしくお願いします。 Dim ptr As Integer Sheets("シートA").Activate ptr = Range("A65536").End(xlUp).Row Range("A4:P" & ptr).Copy Destination:=Sheets("一覧").Range("A4") Sheets("シートB").Activate ptr = Sheets("シートB").Range("A65536").End(xlUp).Row Range("A4:P" & ptr).Copy Destination:=Sheets("一覧").Range("A65536").End(xlUp).Offset(1, 0) Sheets("一覧").Activate Range(Cells(4, "A"), Cells(Range("A65536").End(xlUp).Row, "P")).Sort _ Key1:=Range("D4"), Order1:=xlAscending, Key2:=Range("E4"), _ Order2:=xlAscending, Key3:=Range("F4"), Order3:=xlAscending, _ Header:=xlGuess, OrderCustom:=1, MatchCase:=False, _ Orientation:=xlTopToBottom, SortMethod:=xlPinYin, DataOption1:=xlSortNormal, _ DataOption2:=xlSortNormal, DataOption3:=xlSortNormal ' End Sub

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

  • ベストアンサー
  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.4

>ただ、当然ながらタイトル(1~3行目迄記載あり)も見事に消えました(笑) シートの仕様が解らなかったので、単純にシートをクリアするための命令を書いてしまいました・・・。 >とりあえず、3行目までは残してそれ以降を消去するといった方法を考えてみたいと思います。 こんな感じでしょうか。 Sheets("一覧").Activate Range(Range("A4:O4"), Range("A4").End(xlDown)).ClearContents >希望は全て「上書き」です。 適切な回答を得るためにも、質問時にはある程度の仕様を明記するのが一番かと思います。 質問されるかたの利用方法もマクロ作成のレベルも判別できないので、質問文から読めない部分のコードまで書いてくれませんからね。 前回は『Bのデータを貼り付ける位置で問題が発生しています。』と言う質問だったので、その部分を改善した幾つかの回答が寄せられました。 貼付け側のシート内容(タイトルの有無等)も解らないので、貼付け前に必要な作業(消去)を省いて回答したまでです。 (利用者がそれなりの対処をするだろうという思惑もありますが・・・。)

suzu-fam
質問者

お礼

タイトルが消えた件は自分の馬鹿さ加減に呆れて書いたものでしたが、事情を説明しなければ分からないですよね。 大変申し訳ありませんでした。 自分の無知さ故に質問も満足にできませんでした。 そんな中でも親切に教えていただき感謝しております。 以後自分に未知の部分ではその説明からさせていただきたいと思います。

その他の回答 (5)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.6

私も前回の質問の回答をしているようです。 私も2通り回答しており、もう一方のご回答も有ります。 ざっと自分のコードを見直したところ、180行うんうんでひっか理そうなコードは無いようです。 ーー 後は実際のデータとの関連で、止まったり、意図どおりではないケースです。これも回答のコードが不十分といえば不十分なんですが。 本件はこれに該当し、単純なコードミスではないようです。 あと質問者のケースにコードをチューニングするときの誤解などです。 ーー すぐ頭に浮かんだのはかき2点です。 いつも Range("A65536").End(xlUp).Row Usedらんげ CurrentRegion を回答で使うときは、下の行に余分なもの(別の表とか、フッタ的注釈など)、中間に空白行が、無いことを祈って回答してますが、それが1つ。 ーー それと第2シートに累積しているので、テストなどを繰り返すと 前回のものも累積していく。(クリアするコードを入れると累積にならない。) そんなことを思いました。 ーー もう改善方法は今回の皆様のご指摘で判ったようですね。 前回答の、どの分を採用されたのか書いてないのですが、 私の回答と関係なければ無視してください。 関係あればすみません。

suzu-fam
質問者

お礼

前回の質問にもお答えいただきありがとうございました。 最終的には前回の#3さんのお答えを参照させていただきました。 180行というのはデータの量の問題でしたのでこちらの問題でした。 申し訳ありません。 改善方法はあと1点(色のクリア)がはっきりしませんが、自分でも 考えてみたいと思います。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.5

#03です >色ごと消去できる方法を ClearContentsメソッドをClearメソッドに変えるだけです。 これは#02さんの回答に既に出ています。「タイトルも見事に消えてしまった」ということですからClearメソッドは試されたのですね。ちゃんと色も消えませんでしたか? 一から十まで聞くのではなかなか上達しませんよ。

suzu-fam
質問者

お礼

ありがとうございます。 clearにすればいいのかなと思い試してはみましたが、消えなかったんです。 ちなみに現在の追加した部分は Sheets("一覧").Activate Range(Range("A4:P4"), Range("A4").End(xlDown)).Clear となっています。 でも、確かに#2さんのご指摘の時は全て(きれいさっぱり)消えました。 なかなか難しいですね^^;

suzu-fam
質問者

補足

すいません、順番が逆になってしまいましたが。 改めてやってみたらClearで全て消去できました。 何度もやってできなかったんですが、前の履歴か何かが残っていたのかもしれません。 皆様何度もありがとうございました。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.3

2回目以降の実行時に期待する動作をしないのは、他の回答者さまも書かれているようにシートAの内容を貼り付けるのは「一覧シートのA4セル」で、シートBの内容を貼り付けるのは一覧シートの最終行の下のセルだからです。元々一覧シートにデータがあり、シートAのデータ行数が少ない場合は前のデータが残ってしまいますね。 いかようにも作り替えはできますが「どうしたい」がないと回答しづらいですね。 Sheets("一覧").Activate Range(Cells(4, "A"), Cells(Range("A65536").End(xlUp).Row, "P")).ClearContents の2行をDim宣言の直後に挿入すれば、一覧シートのデータを予め削除してから貼り付けることができます。

suzu-fam
質問者

お礼

ありがとうございます。 データの削除を自分で考えてみましたがやはり無理でした・・・ おっしゃるとおりの記載をマクロにしたところ無事以前の一覧は消去され毎回同じ一覧が作成されるようになりました。 ただ、この2行の追加だとデータのみの消去ですよね。 大変申し訳ありませんが、シートAとBのデータには行ごとに 色づけがしてあるんです。 現状だと色がそのまま残ってしまうので、色ごと消去できる方法を ご指摘いただけないでしょうか。 希望は、マクロ実行時、以前作った一覧は一覧ごと全て消去し、最新の一覧が作りたい。ということです。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.2

1回目の貼付けでは、A4を基準に貼付けます。 2回目の貼付けでは、Range("A65536").End(xlUp).Row.Offset(1, 0)でシートのデータの最下端+1行目を基準にしています。 1回目のデータが仮に1行の貼付けだったとしても、シートには前回のデータがあるので、2回目は残りデータの最下端+1行目から貼付く事になります。 このマクロは、何もデータの無いシートを対象に動作するようになっているので、データが重複しないようにするためには、転記前にシートの初期化(消去)を行わなくてはなりません。 コピー開始前に、 Sheets("一覧").Cells.Clear と書き加えて下さい。

suzu-fam
質問者

お礼

ありがとうございます。 早速やってみましたが、きれいに消去ができました。 ただ、当然ながらタイトル(1~3行目迄記載あり)も見事に消えました(笑) とりあえず、3行目までは残してそれ以降を消去するといった方法を考えてみたいと思います。

  • nekoron07
  • ベストアンサー率37% (69/184)
回答No.1

マクロ記述の4行目の Range("A4:P" & ptr).Copy Destination:=Sheets("一覧").Range("A4") から、「シートA」のデータは、常に「一覧」のセルA4の位置に貼り付けられるようになっており、 また、7行目の Range("A4:P" & ptr).Copy Destination:=Sheets("一覧").Range("A65536").End(xlUp).Offset(1, 0) から、「シートB」のデータは、常に「一覧」の最終行の次の行位置に貼り付けられるようになっていますので、「一覧」を削除しないままマクロを実行するとシートA部分は「上書き」、シートB部分は「追加」されるようになっています。 質問者様はどのようにしたいのでしょうか。 もし、シートAも最終行の下に追加したい、というのでしたら、4行目を Range("A4:P" & ptr).Copy Destination:=Sheets("一覧").Range("A65536").End(xlUp).Offset(1, 0) とすれば、シートAのデータも「上書き」ではなく一覧に「追加」できます。

suzu-fam
質問者

お礼

ありがとうございました。 希望は全て「上書き」です。そのためには一度全てのデータの消去をすればいいみたいですね。

関連するQ&A