ExcelマクロVBA技術解説 | クリップボードを使わないセルのCopy | Excelマクロの問題点と解決策、エクセルVBAの技術的解説



最終更新日:2015-03-17

クリップボードを使わないセルのCopy


セルをコピーすることはマクロVBAにおいてもっとも基本的なことですが、
セルをコピーすると、クリップボードが使われてしまうので、他の作業との併用時に困ることが多々あります。
そこで、クリップボードを使わずに、セルをコピーする方法を考えてみましょう。


その前に、以下のページの内容は把握しておいてください。
第40回.セルのコピー・カット&ペースト(Copy,Cut,Paste)
第41回.セルのコピー&値の貼り付け(PasteSpecial)
第42回.セルをコピーするとは

ごく普通のコピー、といいますか、自動記録したお勧めできない書き方ではありますが。
Range("A1").Copy
Range("B1").Select
ActiveSheet.Paste
Application.CutCopyMode = False


これは間違いなくクリップボードを使っています。
.Copyでクリップボードに入ります。

では次に、Destinationを指定する場合

Range("A1").Copy Destination:=Range("B1")


Destinationは省略可能です。
これもクリップボードが使われています。
先の.Copy、.Paste、CutCopyMode = False、これらを1行で書いているに過ぎません。

では本題です。

クリップボードを使わないセルのCopy

実は、方法はありません・・・
基本的には、マクロ実行中は、じっと我慢の子で待っていましょう(笑)
なのですが、それでは本記事の意味がありませんので、方法を検討します。
Range("A1:E10")をRange("G1:K10")にコピーする場合です。

Range("G1:K10").Value = Range("A1:E10").Value


これでセルの値はクリップボードを使わずにコピーされます。
注意点としては、
・左辺と右辺のセル範囲の大きさを同じにすること
・Valueも省略せずに書くこと

では、他のプロパティである、書式や色をどうするかなのですが、良い方法はありません。
Valueにならって、

Range("G1:K10").NumberFormatLocal = Range("A1:E10").NumberFormatLocal


全てのセルが同一なら良いのですが、バラバラな書式の場合は、これではコピーされません。
しかし、そもそもコピーする全てのセルが同一書式なら、

Range("G1:K10").NumberFormatLocal = Range("A1").NumberFormatLocal


これで良いことになります。
つまり、単一の値をセル範囲に入れているだけです。
Valueだけが特別なのです。
これは、セル範囲を配列に入れるときと関連しています。

Dim MyAry
MyAry = Range("A1:E10").Value


これで配列が作成されます。
そして、

Range("G1:K10").Value = MyAry


これで値がコピーされることになります。
つまり、

Dim MyAry
MyAry = Range("A1:E10").Value
Range("G1:K10").Value = MyAry


これのMyAryを消し込めば、

Range("G1:K10").Value = Range("A1:E10").Value


このようになるということです。
そして、これができるのはValueだけだということです。

では残りのプロパティをコピーするにはどうしたらよいかというと、
愚直にセル1つずつ値を代入するしかありません。

セル範囲をFor Eachで回して、各プロパティをコピー先に値として代入するしかないです。
記述は簡単ですが、セル範囲が大きいと、とても時間がかかってしまう事でしょう。
ちょっと現実的ではありませんし、お勧めできません。
一応、以下に各プロパティをコピーする場合のコードを書いておきます。

Sub sample()
  Call sample_sub(Range("A1:E10"), Range("G1"))
End Sub
Sub sample_sub(fromRange As Range, toRange As Range)
  Dim i As Long
  Dim j As Long
  For i = 1 To fromRange.Rows.Count
    For j = 1 To fromRange.Columns.Count
      toRange.Cells(i, j).Value = fromRange.Cells(i, j).Value
      toRange.Cells(i, j).NumberFormatLocal = fromRange.Cells(i, j).NumberFormatLocal
      toRange.Cells(i, j).Interior.Color = fromRange.Cells(i, j).Interior.Color
      toRange.Cells(i, j).Font.Color = fromRange.Cells(i, j).Font.Color
      toRange.Cells(i, j).Font.Bold = fromRange.Cells(i, j).Font.Bold
    Next
  Next
End Sub


良く使うプロパティは、概ねこのあたりでしょう。
後は罫線ですが、これは四辺のプロパティを別々に記述しなければならず面倒ですし、実行時間が遅くなりすぎてしまいますね。

結論としては、Valueのみ一括でコピーし、
コピー先の出力部分の体裁は、別途仕上げた方が良いと思います。




同じテーマ「ExcelマクロVBA技術解説」の記事

Rangeの使い方:最終行まで選択を例に
オブジェクト式について
Dir関数の制限について
画像サイズ(横x縦)の取得について
文字種(ひらがな、全半角カタカナ、半角英大文字等々)の判定
よくあるVBA実行時エラーの解説と対応
ローカルウィンドウの使い方

新着記事 ・・・新着記事一覧を見る

スプレッドシートが非常に遅い、高速化するには|Google Apps Script入門(1月17日)
画像のトリミング(PictureFormat,Crop)|ExcelマクロVBAサンプル集(12月27日)
シート保護|Google Apps Script入門(12月24日)
表示の固定|Google Apps Script入門(12月24日)
グラフ|Google Apps Script入門(12月21日)
入力規則|Google Apps Script入門(12月13日)
並べ替え|Google Apps Script入門(12月12日)
メモの挿入・削除と改行文字|Google Apps Script入門(12月6日)
リンクの挿入・編集・削除|Google Apps Script入門(12月6日)
セルに数式を入れる|Google Apps Script入門(12月1日)

アクセスランキング ・・・ ランキング一覧を見る

1.RangeとCellsの使い方|ExcelマクロVBA入門
2.最終行の取得(End,Rows.Count)|ExcelマクロVBA入門
3.徹底解説(VLOOKUP,MATCH,INDEX,OFFSET)|エクセル関数超技
4.Range以外の指定方法(Cells,Rows,Columns)|ExcelマクロVBA入門
5.セルの参照範囲を可変にする(OFFSET,COUNTA,MATCH)|エクセル関数超技
6.セルのコピー&値の貼り付け(PasteSpecial)|ExcelマクロVBA入門
7.ひらがな⇔カタカナの変換|エクセル基本操作
8.CSVの読み込み方法|ExcelマクロVBAサンプル集
9.変数とデータ型(Dim)|ExcelマクロVBA入門
10.VBAのFindメソッドの使い方には注意が必要です|ExcelマクロVBA技術解説



  • >
  • >
  • >
  • クリップボードを使わないセルのCopy

  • このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


    記述には細心の注意をしたつもりですが、
    間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
    なお、掲載のVBAコードは自己責任で使ってください。万一データ破損等の損害が発生しても責任は負いません。

    ↑ PAGE TOP