【エクセルVBA】クリップボードにある言葉をすべて選択したセルの後につけたしたい。


クリップボードにある言葉(例 ぜひご検討下さい。)

をエクセルで選択しているセルの言葉すべてにつけたしたいです。
選択しているセルにはすでにそれぞれ文字列がはいっています。その後に入れたいのです。

例A1とA2をクリックしている。A1には青森県のりんごです。A2にはタイのカレーです。とあります。

マクロを実行すると、クリップボードに現在ある言葉がつけたされて、
A1は青森県のりんごです。ぜひご検討下さい。
A2はタイのカレーです。ぜひご検討下さい。

となります。

マクロのみのご回答をぜひお願いいたします。(関数やその他アドバイスには恐れ入りますが、ポイントをおつけできません)

どうかよろしくお願いいたします。

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2017/08/03 07:57:36
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:ken3memo No.1

回答回数317ベストアンサー獲得回数115

ポイント150pt

途中までしかできていないので、ポイントはいりません。
解説もいらないとのことですが、
参照設定だけ、下記の動画を見てください。

D

VBA クリップボードで検索する
とイロイロなページがヒットします。
http://pckowaza.web.fc2.com/html/excel_vba_clipboard_format_confirm.html
http://officetanaka.net/excel/vba/tips/tips20.htm
https://www.moug.net/tech/exvba/0150091.html

上記を参考にして、

参照設定で
「Microsoft Forms 2.0 Object Library」
と言われるが、見つからない ぉぃぉぃ

で、フォームを挿入すると簡単と書いてあったので、
一つフォームを挿入する

Sub はてな回答テスト20170802()

    Dim CB As Variant 'クリップボードにはさまざまな形式なので
    Dim strADDTEXT As String  'クリップボードから追記するテキスト保管
    Dim selectRANGE As Range  '選択範囲
    Dim n As Integer  'N番目
    Dim y As Integer  '行
    Dim x As Integer  '列
    
    'クリップボード内のデータ種類を判断
    CB = Application.ClipboardFormats
    
    If CB(1) = -1 Then
        Debug.Print "クリップボードには何も入っていません。"
        Exit Sub
    End If

    'テキスト形式か?
    If CB(1) = xlClipboardFormatText Then
        'テキストデータを取り出す
        With New MSForms.DataObject
            .GetFromClipboard    ''変数のデータをDataObjectに格納する
            strADDTEXT = .GetText 'テキストを取得
            Debug.Print strADDTEXT
            '選択されているセルに対して処理を行う
            Set selectRANGE = ActiveWindow.Selection
            '複数セル、範囲もあるのでループさせる
            For n = 1 To selectRANGE.Areas.Count  '※nは1から
                'セルが範囲選択されている可能性があるので、
                Debug.Print n & " " & selectRANGE.Areas(n).Address
                Debug.Print selectRANGE.Areas(n).Rows.Count
                Debug.Print selectRANGE.Areas(n).Columns.Count
                For y = 1 To selectRANGE.Areas(n).Rows.Count  '行のループ
                    For x = 1 To selectRANGE.Areas(n).Columns.Count '列のループ
                        Debug.Print selectRANGE.Areas(n).Cells(y, x).Address
                        Debug.Print selectRANGE.Areas(n).Cells(y, x).Value
                        selectRANGE.Areas(n).Cells(y, x).Value = selectRANGE.Areas(n).Cells(y, x).Value & strADDTEXT
                    Next x
                Next y
            Next n
        End With
    End If

End Sub

↑のコードを貼り付けて、テストしてみてください。
Debug.Print は 必要ないので、消してください。

動画の後半で、テスト時、Excelのセルをコピーしてクリップボードに入れた場合、
テキストとして 反応しないので、バグってます。
'テキスト形式か?
If CB(1) = xlClipboardFormatText Then
以外を見ると、できると思います。

以上、完璧じゃないので、ポイントはゼロでオッケーです。
解決の糸口、回答のたたき台となれば幸いです。

id:a-kuma3

ActiveSheet.Paste で、適当なセルに貼り付けて、その Value をくっつけていく方が良いんじゃないかと思ったり。

2017/08/02 23:36:20
id:naranara19

ありがとうございます!僕がやってほしいところは十分にできましたので、ポイントもちろん差し上げます。お付き合いありがとうございました!!

2017/08/03 07:56:51

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません