クリップボード情報を、特定の列に並べ直す。
本日は、ネット上にあった課題(困りごと)をテーマに挑戦する。
コピーなどの操作で、一旦クリップボードに置かれた文字列(3行)がある。
これを選択セルの並びにある特定列に配置するというもの。
単純に縦から横に並びを変えるだけなら、Transpose関数で一撃だが、今回は列が飛び飛びになっても大丈夫なように考えてみた。
標準モジュール
今回は、かなり説明的な作りになっている。そのため無駄な部分も多いと思う。方針は以下のとおり。
- クリップボードの値を取得する。
- 改行で分割して、配列に格納する。
- 各列のラベルで、どの値をどの列に入力するかを決定する(課題では、ラベルの文字をFindで検索していたので、今回はそれに倣う)。
- 値を入力。
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
一応、想定した動きを実現することが出来た。
恐らく実用の段階で、他にも様々な条件が出てきて作りこみが必要になると思うが、基本部分はこんな感じで。
参考まで。