- Excelのマクロでコピー&ペーストのコードを知りたい
- Excelのマクロを使ったRPAでコピー&ペーストをしたい
Excelのマクロを使ったコピー&ペーストのコードを複数個紹介いたします。
Excel内だけで使用できるコードやRPAでも用いれるようなExcel以外のアプリケーションからコピー&ペーストできるコードを紹介します。
- セルを指定してコピー&ペースト
- SendKeysメソッドを使ったコピー&ペースト
- クリップボードを使ったコピー&ペースト
- サンプルコード「自動でweb検索するコード」
❶セルを指定してコピー&ペースト
RangeやCellsを使ってセルを指定し、コピー&ペーストを実行する方法です。
短いコードで簡単に使えるためお手軽ではありますが、Excel内でしか使用できません。
下記にRange及びCellsを使ったサンプルコードを示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
'セルを指定してコピー&ペースト(Range) Sub Sample1() 'セル(A1)をコピー Range("A1").Copy 'セル(B1)にペースト Range("B1").PasteSpecial Paste:=xlPasteAll End Sub 'セルを指定してコピー&ペースト(Cells) Sub Sample2() 'セル(A1)をコピー Cells(1, 1).Copy 'セル(B1)にペースト Cells(1, 2).PasteSpecial Paste:=xlPasteAll End Sub |
コピー&ペーストをするためのコードとしては同じ作りになっています。RangeとCellsのどちらを選択するかはそれぞれの特性によって使い分けをお願いします。
➋SendKeysメソッドを使ったコピー&ペースト
Excelでは使用頻度の多い機能にはショートカットキーが設定されています。
コピー及びペーストにもショートカットキーが設定されており
- コピー:Ctrl + c
- ペースト:Ctrl + v
となっております。
ショートカットキーの機能と疑似的にキーボード操作ができるSendKeysメソッドを組み合わせることでコピー&ペーストが可能です。
この方法であればExcel以外のアプリケーションでのコピー&ペーストでも可能となりますが、安定性に難があります。
Waitメソッドを使って処理時間を作ったり、DoEvents関数を使って他のイベントを処理できるようにする必要性があります。
1 2 3 4 5 6 7 8 9 10 11 12 |
'SendKeysメソッドを使ったコピー&ペースト Sub Sample3() Range("A1").Activate SendKeys "^(c)", True Application.Wait Now() + TimeValue("00:00:01") DoEvents Range("A2").Activate SendKeys "^(v)", True End Sub |
❸クリップボードを使ったコピー&ペースト
続いて紹介するのはクリップボードに直接働きかけてコピー&ペーストを行う方法です。
Windows APIの機能を使ったり、コード自体が先に紹介した方法より複雑だったりしますが、使い方によっては安定的にコピー&ペーストを行うことができます。
特にRPAなどでExcelでのコピー動作やExcel以外のアプリケーションでコピーした内容のExcelへのペーストなどで安定的に運用できるかと思います。
「Mirosoft Forms 2.0 Object Library」にチェックを入れる
この方法を使用するには下記のような準備が必要です。
1.Visual Basicから「挿入>ユーザーフォーム」を選択
2.「ツール>参照設定」を選択
3.「Mirosoft Forms 2.0 Object Library」にチェック
セルの値をクリップボードへコピー
下記コードで指定したセルの値をクリップボードへコピーできます。
サンプルコードではCellsでセルの指定をしていますがRangeでもOKです。
1 2 3 4 5 6 7 8 |
'指定したセルの値をクリップボードにコピー Sub Sample4() Dim myDO As New DataObject myDO.SetText Cells(1, 1).Value myDO.PutInClipboard End Sub |
クリップボードの値をペースト
下記コードで指定したセルにクリップボードの値をペーストすることができます。
サンプルコードではCellsでセルの指定をしていますがRangeでもOKです。
1 2 3 4 5 6 |
'指定したセルにクリップボードの内容をペースト Sub Sample5() Cells(1, 2).PasteSpecial End Sub |
このコードを使用すればExcel以外のアプリケーションでコピーをしたのも安定して指定したセルにペーストすることができます。
クリップボードの値をクリアにする
クリップボードの値をクリアにするにはWindows APIの機能を使用します。
下記にあるのが使用する関数の宣言コードです。WindowsOSが64bitか32bitかでコードが違います。
1 2 3 4 5 6 7 8 9 |
'64bit Private Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As LongPtr) As Long Private Declare PtrSafe Function CloseClipboard Lib "user32" () As Long Private Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long '32bit Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long Private Declare Function CloseClipboard Lib "user32" () As Long Private Declare Function EmptyClipboard Lib "user32" () As Long |
コードの本文は下記のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
'クリップボード内にデータをクリア Sub Clipboard_clear() Dim objCb As New DataObject 'クリップボード内にデータがある場合のみ処理 If Application.ClipboardFormats(1) <> -1 Then 'クリップボードに格納されたコピーデータをクリアする OpenClipboard (0&) EmptyClipboard CloseClipboard End If End Sub |
❹サンプルコード「自動でweb検索するコード」
下記コードは本記事の
- 2. SendKeysメソッドを使ったコピー&ペースト
- 3. クリップボードを使ったコピー&ペースト
及び別記事「Excelマクロを使ったRPA」の内容を駆使して作成した「自動web検索するコード」です。
「A1」の値をweb検索し、URLをコピーして「B1」に張り付けます。
webサイト内の座標を修正すれば使えると思いますので参考にしてみてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
'64bit '【GetCursorPosの宣言】(マウスポインター位置の取得) Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As coordinate) As Long '座標「coordinate」のデータ型を定義 X座標とY座標を格納できるようにする。 Type coordinate x As Long y As Long End Type '【SetCursorPos関数】 Declare PtrSafe Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long '【mouse_event関数】 Declare PtrSafe Sub mouse_event Lib "user32" (ByVal dwFlags As Long, Optional ByVal dx As Long = 0, Optional ByVal dy As Long = 0, Optional ByVal dwData As Long = 0, Optional ByVal dwExtractInfo As Long = 0) '【クリップボード内にデータをクリアにする】 Private Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As LongPtr) As Long Private Declare PtrSafe Function CloseClipboard Lib "user32" () As Long Private Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long '自動web検索するコード Sub Sample_RPA1() 'Cells(1, 1)の内容をクリップボードへコピー Dim myDO As New DataObject myDO.SetText Cells(1, 1).Value myDO.PutInClipboard '検索エンジンへマウス移動→検索窓へ入る→検索内包貼り付け→Enter SetCursorPos 2700, 470 Application.Wait Now() + TimeValue("00:00:01") mouse_event 2 'マウスの左クリック(押す) mouse_event 4 'マウスの左クリック(放す) SendKeys "^(v)", True Application.Wait Now() + TimeValue("00:00:01") SendKeys "{ENTER}", True Application.Wait Now() + TimeValue("00:00:01") 'コピーしたい箇所へマウス移動→クリック→コピー SetCursorPos 2464, 54 Application.Wait Now() + TimeValue("00:00:01") mouse_event 2 'マウスの左クリック(押す) mouse_event 4 'マウスの左クリック(放す) SendKeys "^(c)", True Application.Wait Now() + TimeValue("00:00:01") 'Cells(1, 2)にクリップボー内容をペースト Cells(1, 2).PasteSpecial '戻るへマウス移動→クリック SetCursorPos 1940, 54 Application.Wait Now() + TimeValue("00:00:01") mouse_event 2 'マウスの左クリック(押す) mouse_event 4 'マウスの左クリック(放す) 'クリップボード内にデータをクリア Dim objCb As New DataObject If Application.ClipboardFormats(1) <> -1 Then OpenClipboard (0&) EmptyClipboard CloseClipboard End If End Sub |