• ベストアンサー

列を2度コピーするマクロ

B列をC列にコピーした後、A列をB列にコピーするという2段階コピーの下記マクロを、「新しいマクロの記録」を使って作りました。 しかし下記マクロは 列選択時の青反転が実行時に残って、使用感がいまひとつです。 「新しいマクロの記録」ではなく、もっとスマートなマクロはできないでしょうか? なお、列選択ではなく必要なセル数だけ選択すれば青反転はなくなると思いますが、行数が確定していないので列選択にしたいと思っています。 ついでに下記マクロについて質問です。 11行目はなぜ5行目とは違うのでしょうか?.PasteとPasteSpecial Pasteとの違いを教えていただければ幸いです。 Sub Macro1() Columns("B:B").Select Selection.Copy Columns("C:C").Select ActiveSheet.Paste Columns("A:A").Select Application.CutCopyMode = False Selection.Copy Columns("B:B").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Range("A2").Select Application.CutCopyMode = False ActiveWorkbook.Save End Sub

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

  • ベストアンサー
  • taocat
  • ベストアンサー率61% (191/310)
回答No.4

こんにちは。 >A列は計算式でありB列には値のみ貼り付けたいのでした。 これは質問のコードをみてそう思いましたが、回答を理解し応用しなければ意味がないだろうと省きました。 補足を読むと概ね理解され応用されているようですので回答のし甲斐があるというものです。 では、補足の件。 >後半のみPasteSpecialPasteに書き換えてみましたが、これではコピー選択中の枠やB列の青反転が常時画面上に残り、クリップボードにも残る Paste後に次の2行追加してください。  Application.CutCopyMode = False  Range("A1").Select CutCopyMode=Falseで点線枠が消えます。 Range("A1").selectで青色反転が消えます(これはどのセルでも可) 前の回答で、「不必要」なSelect、はするな、と書きましたが、これは「必要」なSelect、です。 これにはCopyメソッドの理解が不可欠です。 そこらあたりはご自分でちょっと調べてみてください。それでもわからない場合は再度質問してください。 クリップボードにも残る、というのはOfficeのクリップボードに残るということでしょうか、 ということは、クリップボードツールバーを表示しながらコピーしていることになりますが、どうでしょう。 クリップボードツールバーを表示してなければ、Officeクリップボードでなければ、CutCopyMode=falseで消えます。 そこらをお知らせください。 ---------------------------------------------- Sub Test() Application.ScreenUpdating = False Columns("B:B").Copy Destination:=Range("C1") Columns("A:A").Copy Range("B1").PasteSpecial Paste:=xlPasteValues ▲▲ Application.CutCopyMode = False ▲▲ Range("A1").Select Application.ScreenUpdating = True End Sub ---------------------------------------------- 以上です。

kinsei
質問者

お礼

問題、課題全て解決しました。ありがとうございました。 なお クリップボードの件についてですが、前回のチェック後エクセルを終了するときに「クリップボードにデータが残っている・・・」等のアナウンスが現れたので、その原因はマクロだと思いました。でも、その他の操作方法が悪かったのかもしれません。 今回は全て解決しました。

その他の回答 (3)

  • kokorone
  • ベストアンサー率38% (417/1093)
回答No.3

反転が残るのであれば、・・・・ 最後に、どこかのセルをクリックした形(selectした) にすれば、反転は消えます。 また、試していませんが、クリップボードを使用後削除できません か?

  • taocat
  • ベストアンサー率61% (191/310)
回答No.2

こんばんは。 >列選択時の青反転が実行時に残って >でもまだわずかに画面が揺れるのが残っています。 これはSelectを繰り返しているからです。 殆どの場合、Selectは不要です。 Copyの場合も然り。 極力不必要なSelectは避けるべきです。 で、以下のようにしてみて下さい。 -------------------------------------------- Sub Test()   Application.ScreenUpdating = False   Columns("B:B").Copy Destination:=Range("C1")   Columns("A:A").Copy Destination:=Range("B1")   Application.ScreenUpdating = True End Sub -------------------------------------------- それから、Pasteの件ですが、 Pasteは、単なる貼り付け(書式とか値とか全ての貼り付け) PasteSpecailは、「形式を選択して貼り付け」、 提示のコードでは、xlPasteValuesとなってますから、 その中の「値」のみの貼り付けです。 以上です。

kinsei
質問者

補足

画面の揺れが残る程度はほぼ同じくらいですが、マクロのコードはすごくすっきりするんだなと思って試してみましたが、実は、A列は計算式でありB列には値のみ貼り付けたいのでした。 そこで下記のように後半のみPasteSpecialPasteに書き換えてみましたが、これではコピー選択中の枠やB列の青反転が常時画面上に残り、クリップボードにも残るなど副作用の方が大きくなってしまいました。 でも勉強になります。 値のみ貼り付けられる、すっきりしたコード表示を教えていただければありがたいのですが。 'Sub Test() Application.ScreenUpdating = False Columns("B:B").Copy Destination:=Range("C1") Columns("A:A").Copy Range("B1").PasteSpecial Paste:=xlPasteValues Application.ScreenUpdating = True 'End Sub

  • kokorone
  • ベストアンサー率38% (417/1093)
回答No.1

1) 作成されたマクロの先頭に、 Application.ScreenUpdating = False 最後に、 Application.ScreenUpdating = True を入れてみましょう。その効き目は、自分で調べてみてください。 2)ライン5は、単なる貼り付け、 ライン11は、形式を選択して貼り付けのうち、空白セルを無視 する ものだと思われます。

kinsei
質問者

お礼

たいへん大きな効果がありました。じゃまに感じる程度は1/10くらいになったでしょうか。 でもまだわずかに画面が揺れるのが残っています。 データの数字が変化するだけというのは、難しいのでしょうか?

関連するQ&A