【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した値を入れた後の制御は先のコードといっしょです。
-
前の記事
【ExcelVBA】埋込オブジェクトのWordを開いてPDF保存【半分未解決】 2023.01.31
-
次の記事
【Excel】テキスト文字列を改行コードで区切るには 2023.02.02