LoginSignup
2
6

More than 5 years have passed since last update.

VBAにおけるクリップボードフリーのすすめ

Last updated at Posted at 2017-03-23

仕事で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
2
6
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
6