VBAの勉強を始めてみた

色々試しています。

Word 非連続な位置にクリップボードのデータを貼り付ける

タイトルの通り、今回は Word の文書で非連続な位置にクリップボードのデータを貼り付けるということをやってみようと思います。

と、いっても非連続な位置に対してどうやってマクロで処理するのか・・・・・・。
少し考えた結果、以下のようにやってみることにしました。

まず、任意の位置に目印となる文字列を貼り付けておきます。ここでは、目印に (@_@;) を使っていますが、お好みで OK です。(Ctrl + V 等を使って効率よく貼り付けましょう)

f:id:kouten0430:20181006120939j:plain

 

次に、目印の位置に貼り付けるデータをクリップボードに取り込みます。
この状態で、後ほど掲載するマクロを実行します。

f:id:kouten0430:20181006121226j:plain

 

クリップボードデータの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で標準モジュールにコードを貼り付けてマクロを使用する方法はこちら