データ分析の業務をしていると、コピーしたデータを数行・列おきに入力したいと思ったことはありませんか?私は何度もあります。でもexcelにはなぜかそういった機能がない。ということでVBAで簡単なマクロを作成しました。もし串刺し入力がしたいときはぜひ使ってみて下さい。
コード
指定行(感覚的には縦に串刺し)おきに入力
Public Sub Sample_ClipBoard_input_row() Dim Str As String, tmp As Variant 'クリップボードを操作する為のDataObjectオブジェクトを用意する。 Dim CLPB As New DataObject ' DataObjectオブジェクトにクリップボードのデータを設定する。 CLPB.GetFromClipboard ' クリップボード内のテキストを取得する。 Str = CLPB.GetText tmp = Split(Str, vbCrLf) Dim i As Long, j As Long j = 0 'ユーザーに串刺し間隔を指定してもらう Dim stp As String Do stp = InputBox("何行おきに串刺し入力しますか。(数値のみ)") 'キャンセルされた時中止 If StrPtr(stp) = 0 Then Exit Sub If IsNumeric(stp) Then '数値が入力された時警告 Else MsgBox "数値を入力してください。" End If Loop Until IsNumeric(stp) '上記で指定された、数おきに入力。全て入力が終わったら終了。 For i = Selection(1).Row To Selection(Selection.Count).Row Step stp If j < UBound(tmp) Then Cells(i, Selection(1).Column) = tmp(j) j = j + 1 Else Exit For End If Next i End Sub
指定列(感覚的には横に串刺し)おきに入力
Public Sub Sample_ClipBoard_input_col() Dim Str As String, tmp As Variant ' クリップボードを操作する為のDataObjectオブジェクトを用意する。 Dim CLPB As New DataObject ' DataObjectオブジェクトにクリップボードのデータを設定する。 CLPB.GetFromClipboard ' クリップボード内のテキストを取得する。 Str = CLPB.GetText tmp = Split(Str, vbCrLf) Dim i As Long, j As Long j = 0 'ユーザーに串刺し間隔を指定してもらう Dim stp As String Do stp = InputBox("何行おきに串刺し入力しますか。(数値のみ)") 'キャンセルされた時中止 If StrPtr(stp) = 0 Then Exit Sub If IsNumeric(stp) Then '数値が入力された時警告 Else MsgBox "数値を入力してください。" End If Loop Until IsNumeric(stp) '上記で指定された、数おきに入力。全て入力が終わったら終了。 For i = Selection(1).Column To Selection(Selection.Count).Column Step stp If j < UBound(tmp) Then Cells(Selection(1).Row, i) = tmp(j) j = j + 1 Else Exit For End If Next i End Sub
マクロを動かす前に
クリップボードを操作するDataObjectを使うためには、Microsoft Forms 2.0 Object Libraryを参照しなければエラーになってしまいます。以下の手順で設定しておきましょう。
開発 → VBE起動 → ツール → 参照設定 → Microsoft Forms 2.0 Object Libraryにチェックをいれる
使い方
①串刺し入力したいデータをコピー(行に連続データ)
②入力したい箇所を選択(少し広めに選んだ方が良い)
③マクロを実行(今回は行方向のコード)。ダイアログに串刺し間隔を数字で指定。(今回は2行おきにする)
④下記のように串刺し入力される。
列方向のコードを実行したい場合は②の工程で横方向を選択範囲とする。
アドインダウンロード
アドインを作成しました。是非利用して見て下さい。(アドインの登録方法は以下を参照)
コメント