VBAの勉強を始めてみた

タイトルの通りVBAの勉強を始めました。仰々しくなく、シンプルな形で効率化を図ることを目指しています。VBA以外の話題もあるよ(笑)

同じ文字を下方向へnセル分貼り付ける

例えばこんな文字がクリップボードにあります。

f:id:kouten0430:20170927223308j:plain

 

これをアクティブセルから下方向にnセル分貼り付けるマクロを作ってみました。

アクティブセルから下方向に123セル分貼り付けてみます。マクロを実行したあとに表示されるInputBoxに「123」を入力しOK。

 

このようにアクティブセルがA1ならA123までクリップボードの文字が貼り付けられました。

f:id:kouten0430:20170927223357j:plain

 

結合セルにも貼り付けできます。(結合セルを1セルとみなす)

f:id:kouten0430:20170927223450j:plain

 

非表示セルは飛ばして貼り付けします。(可視セルのみ貼り付ける)

f:id:kouten0430:20170927223548j:plain

 

コードを少し変えれば右方向、左方向、上方向になりますが、今のところ使う場面がないのでやめときます。

 

----------------------

Sub 同じ文字を下方向へnセル分貼り付ける()
    'Microsoft Forms 2.0 Object Libraryを参照設定して下さい
    'クリップボードのデータを丸ごと1セルに貼り付ける処理をn回繰り返します
    '結合セルは1セルとしてカウントします
    '非表示セルは1セルとしてカウントしません(つまり可視セルのみに貼り付け)

    Dim Dobj As DataObject
    Dim V As Variant
    Dim i As Integer
    Dim Y As Integer
    Dim X As Integer
    Dim YE As Variant
   
    YE = Application.InputBox(Prompt:="下方向へ何セル分貼り付けますか?", Type:=1)
        If TypeName(YE) = "Boolean" Then
            Exit Sub
        End If
   
    Set Dobj = New DataObject
    With Dobj
        .GetFromClipboard
        On Error Resume Next
        V = .GetText
        On Error GoTo 0
    End With
   
    If Not IsEmpty(V) Then
        i = 1
        Y = ActiveCell.Row
        X = ActiveCell.Column

        Do While i <= YE
            If Cells(Y, X).Address = Cells(Y, X).MergeArea(1).Address _
            And Rows(Y).Hidden = False Then
                Cells(Y, X).Value = V
                Y = Y + 1
                i = i + 1
            Else
                Y = Y + 1
            End If
        Loop
    Else
        MsgBox "クリップボードにデータがありません!"
    End If

End Sub

----------------------
※SubからEnd Subまでをコピーし、標準モジュール等に貼り付けて使用して下さい。なお、マクロで実行した処理は「元に戻す」ことができません。実行前に一旦保存しやり直しのできる状態にしておいて下さい。標準モジュールにコードを貼り付けてマクロを使用する方法はこちら

※上記のマクロは外部ライブラリを使用します。VBEでMicrosoft Forms 2.0 Object Libraryを参照設定して下さい(ツール→参照設定→参照からWindows\System32\FM20.DLLを選択)。参照設定の方法はこちら