【ExcelVBA】テキストにある文章を一つのセルに入れていくには

Yahoo!知恵袋の質問に答えた中から、紹介します。テキストというのがテキストエディタのことだと思うのですが、あとで「もしかしてテキストボックスのテキストのことかな??」と思ったので、両方のやり方について紹介します。

質問

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14274543144

テキストに、ツイートする予定の文章が、

ーーーーーで区分けされて、記入されています。

そのツイートする内容一つを、エクセルのセルに一つずつ入れていきたいです。

ですが、セルに入れていく文章の数が多くて、手動でするのが大変です。

このツイートする内容をエクセルのセルに入れていく作業を、 どうにか、自動でできるようにできますでしょうか?

エクセル2016です。

よろしくお願いいたします。

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14274543144

回答

テキストエディタ

用意した環境はこんな感じです。

用意したメモ帳

コードはこんな↓感じです。

Public Sub テキストエディタにある文章を一つのセルに入れていく()

    Dim FSO As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")
    
    Dim file As Object
    Const cstPath As String = "C:\test\20230131\テスト用メモ帳.txt"
    Set file = FSO.GetFile(cstPath).OpenAsTextStream
    
    Dim stBuf As String
    stBuf = file.ReadAll
    
    file.Close
    Set FSO = Nothing
    set file = Nothing

    Const cstDel As String = "ーーーーー"
    Dim vBuf As Variant
    Dim lRowCnt As Long
    
    With ThisWorkbook.Worksheets(1)
        vBuf = Split(stBuf, cstDel)
        lRowCnt = UBound(vBuf)
        .Cells(2, 10).Resize(2 + lRowCnt - 1, 1).Value = WorksheetFunction.Transpose(vBuf)
    End With
End Sub

FileSystemObjectでテキストファイルを開き、ReadAllで全部一度に読み込む手法です。

あとはSplitで区切って、変数vBufに値を入れたら、vBufをTransposeでワークシートのセルに一度に書き出しています。

テキストボックス

用意した環境はこんな感じです。

値はJ列に入れていくつもりです(既に値が入っているのは実験した後だからです)。

Public Sub テキストボックスにある文章を一つのセルに入れていく()
    Dim shp As Object
    Const cstName As String = "TextBox"
    Dim stBuf As String
    Const cstDel As String = "ーーーーー"
    Dim vBuf As Variant
    Dim lRowCnt As Long
    With ThisWorkbook.Worksheets(1)
        For Each shp In .Shapes
            If Left(TypeName(shp.DrawingObject), Len(cstName)) = cstName Then
                stBuf = shp.TextFrame.Characters.Text
                vBuf = Split(stBuf, cstDel)
                lRowCnt = UBound(vBuf)
                .Cells(2, 10).Resize(2 + lRowCnt - 1, 1).Value = WorksheetFunction.Transpose(vBuf)
                Exit For
            End If
        Next shp
    End With
End Sub

同一ワークシート上にテキストボックスがあって、その内容をセルに書き出す場合です。

質問者様の環境がExcel2016ということですので、TypeNameのところは修正が必要かもしれません(私の環境はOffice365)。

vBufにSplitした値を入れた後の制御は先のコードといっしょです。