クリップボード情報を、特定の列に並べ直す。

本日は、ネット上にあった課題(困りごと)をテーマに挑戦する。
コピーなどの操作で、一旦クリップボードに置かれた文字列(3行)がある。
これを選択セルの並びにある特定列に配置するというもの。
f:id:Infoment:20190307222311p:plain
単純に縦から横に並びを変えるだけなら、Transpose関数で一撃だが、今回は列が飛び飛びになっても大丈夫なように考えてみた。

標準モジュール

今回は、かなり説明的な作りになっている。そのため無駄な部分も多いと思う。方針は以下のとおり。

  1. クリップボードの値を取得する。
  2. 改行で分割して、配列に格納する。
  3. 各列のラベルで、どの値をどの列に入力するかを決定する(課題では、ラベルの文字をFindで検索していたので、今回はそれに倣う)。
  4. 値を入力。
Enum PasteIndex
    管理番号 = 0
    住所
    氏名
End Enum
Sub Sample()
    ' Microsoft Forms 2.0 Object Library 参照済み。
    Dim CB As DataObject
    Set CB = New DataObject
        CB.GetFromClipboard
    Dim str As String
        On Error Resume Next
        str = CB.GetText
        If str = vbNullString Then
            MsgBox "クリップボードは空です。"
            Exit Sub
        End If
        On Error GoTo 0
        
    ' クリップボードの情報分割用。
    Dim seq As Variant
        seq = Split(str, vbCrLf)
        If UBound(seq) < 3 Then
            MsgBox "クリップボード情報は、目的のデータではありません。"
            Exit Sub
        End If
        
    Dim i As Long
        i = Selection(1).Row

        Cells(i, 列_管理番号) = seq(PasteIndex.管理番号)
        Cells(i, 列_住所) = seq(PasteIndex.住所)
        Cells(i, 列_氏名) = seq(PasteIndex.氏名)

End Sub
Private Property Get 列_管理番号() As Long
    Dim FindResult As Range
    Set FindResult = Rows(1).Find(What:="管理番号", LookAt:=xlWhole)
        If Not FindResult Is Nothing Then
            列_管理番号 = FindResult.Column
        Else
            列_管理番号 = 1
        End If
End Property
Private Property Get 列_住所() As Long
    Dim FindResult As Range
    Set FindResult = Rows(1).Find(What:="住所", LookAt:=xlWhole)
        If Not FindResult Is Nothing Then
            列_住所 = FindResult.Column
        Else
            列_住所 = 1
        End If
End Property
Private Property Get 列_氏名() As Long
    Dim FindResult As Range
    Set FindResult = Rows(1).Find(What:="氏名", LookAt:=xlWhole)
        If Not FindResult Is Nothing Then
            列_氏名 = FindResult.Column
        Else
            列_氏名 = 1
        End If
End Property

一応、想定した動きを実現することが出来た。
f:id:Infoment:20190307223231g:plain
恐らく実用の段階で、他にも様々な条件が出てきて作りこみが必要になると思うが、基本部分はこんな感じで。

参考まで。