仕事でExcelVBAを使う機会が多いのですが、最近1つの真理を発見したので書き残すことにします。
Excel等のオフィスソフトから直に呼び出すにせよ、外部プログラムからOLE等を使って間接に呼び出すにせよ、VBAで処理を実装する際に、クリップボードは極力、というか絶対に使ってはいけない。
VBAでは目的を遂行するために実に様々な実装方法がありますが、これが1つの指針になるのではないかと思います。
クリップボードはWindows上で共有されます。
VBAが独占的に使えるリソースではありません。
VBAでクリップボードを使った値のコピー中にユーザがほかの場所でコピペするとその値が割り込んできて正確なコピーができません。
ユーザが何か他の場所で大事なファイルをコピペしているときにVBAがクリップボードを使うと大事なファイルが正しくコピーされなくなってしまいます。
さらに言うと、VBAでオブジェクトをコピーしてからペースト可能になるまでには少しタイムラグがあるので、クリップボードを多用するマクロは再現できないバグの温床にもなります。
VBA実行前と実行後でクリップボードに変化がないこと。
つまりクリップボードフリー。
これをVBA業界のテスト標準に組み込んでいきましょう。
追記
具体的な例をあげます
初級編
Range("A1").Select
Selection.Copy
Range("A2").Select
ActiveSheet.Paste
Cells(2, 1).value = Cells(1, 1).value
中級編
上級編
ThisWorkbook.Sheets(1).Shapes(1).Copy
ThisWorkbook.Sheets(1).Paste
Set obj = Selection
obj.ShapeRange.LockAspectRatio = msoFalse
obj.Left = 0
obj.Top = 0
Set obj = ThisWorkbook.Sheets(1).Shapes(1).Duplicate
obj.LockAspectRatio = msoFalse
obj.Left = 0
obj.Top = 0