Word 非連続な位置にクリップボードのデータを貼り付ける
タイトルの通り、今回は Word の文書で非連続な位置にクリップボードのデータを貼り付けるということをやってみようと思います。
と、いっても非連続な位置に対してどうやってマクロで処理するのか・・・・・・。
少し考えた結果、以下のようにやってみることにしました。
まず、任意の位置に目印となる文字列を貼り付けておきます。ここでは、目印に (@_@;) を使っていますが、お好みで OK です。(Ctrl + V 等を使って効率よく貼り付けましょう)
次に、目印の位置に貼り付けるデータをクリップボードに取り込みます。
この状態で、後ほど掲載するマクロを実行します。
クリップボードデータの1行と、目印の1個が1対1の関係になっていることがポイントです。
コードはこちら。
Sub 非連続な位置にクリップボードのデータを貼り付け() 'クリップボードのデータを貼り付ける位置にあらかじめ目印をつけておいて下さい '目印1個がクリップボードデータの1行分に対応します Dim Mejirushi As String Dim 全文字列 As String Dim 分割文字列 As Variant Dim i As Integer Dim myLib As Object Set myLib = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") '参照設定なしでDataObjectのインスタンスを生成する Mejirushi = "(@_@;)" '検索する文字列(目印) myLib.GetFromClipboard On Error Resume Next 全文字列 = myLib.GetText On Error GoTo 0 If 全文字列 <> "" Then 分割文字列 = Split(全文字列, vbCrLf) '全文字列を改行で分割し、配列に格納する i = 0 ActiveDocument.Range(0, 0).Select '文書の先頭から検索を開始する With Selection.Find .Text = Mejirushi Do While .Execute '検索に一致する文字列が無くなるまで下方向に検索する If i <= UBound(分割文字列) Then Selection.Range.Text = 分割文字列(i) i = i + 1 Else Selection.Range.Text = "" '検索の途中で配列の中身が無くなった場合、余った目印は空白に置換する End If Loop End With Else MsgBox "クリップボードにデータがありません!" End If End Sub
※コードの大まかな流れ
- まず、クリップボードの全文字列を変数に格納します。
- 次に、Split関数を使って全文字列を改行(CrLf)で分割し、配列に格納します。
- Range(0, 0).Selectで、カーソルを文書の先頭に移動させます。
- Selection.Findで、カーソル位置から検索開始とし(検索文字列は Text プロパティで指定)、Executeメソッドで検索を1回実行します。
- 上記を、検索に一致する文字列が無くなるまでループさせます。(Executeメソッドが、検索に一致するものがあれば True を、無ければ False を返すので、これをループの継続条件に利用します)
- ループ内の処理:検索に一致した文字列は選択状態になるので、配列の文字列と入れ替えます(次のループで、検索は下方向に、配列は次の要素に進みます)。検索の途中で配列の要素が尽きたら、余った目印は空白に置換(要するに削除)します。
※コードの使用方法
- SubからEnd Subまでをコピーし、標準モジュール等に貼り付けて使用して下さい。なお、マクロで実行した処理は「元に戻す」ことができません。実行前に一旦保存し、やり直しのできる状態にしておいて下さい。Wordで標準モジュールにコードを貼り付けてマクロを使用する方法はこちら。