[VBA]メモ帳を読み込み、行の先頭に任意の文字列があればエクセルのシート1へ。無ければシート2へ貼り付けするマクロ。

VBA学習まとめ VBA

 

ソースコード

 

Sub add_text_to_excel()

Dim fso As Object
Dim text_file As Object
Dim buf As String

Set fso = CreateObject("Scripting.FileSystemObject")
Set text_file = fso.OpenTextFile("ファイルパス.txt")
buf = text_file.ReadAll

Const WORD As String = "検索対象の文字列"
Dim wordlen As Integer ' 検索文字列の長さ'
Dim lines As Variant ' テキストファイルの行を分割し、格納する変数'
Dim line As Variant ' 1行分'


' 改行コードでテキストを分割、変数linesに格納'
lines = Split(buf, vbCrLf)

' 検索文字列の長さ取得'
wordlen = Len(WORD)

i = 1

' 行ごとにループ'
For Each line In lines

' 行の先頭に検索対象文字列があるか'
If Left(line, wordlen) = WORD Then

' あった場合、sheet1を選択しプリントする。'
Worksheets("Sheet1").Select
Cells(i + 1, 1) = line
GoTo CONTINUE
End If

'検索文字列がない場合、sheet2にプリントする。'
Worksheets("Sheet2").Select
Cells(i + 1, 1) = line

CONTINUE:
i = i + 1
Next

MsgBox buf
Set TextFile = Nothing
Set fso = Nothing

End Sub

 

※追記

まずエクセルを起動し”sheet2”を作成する。”sheet2″がなかった場合、エラーが出る。

ExcelのVBAでsheet2がなければsheet2を作成し、sheet2があればシートを作らないプログラム

 

メモ帳の情報を取得する方法・メッソッドなどまとめ

 

FileSystemObject オブジェクト

FileSystemObject オブジェクト

コンピューターのファイル システムへのアクセスを提供

→オブジェクト変数を使用し、インスタンスを作成する。

Set fs = CreateObject(“Scripting.FileSystemObject”)

 

OpenTextFile メソッド

OpenTextFile メソッド

指定したファイルを開き、開いたファイルの読み取り、書き込み、または追加書き込みに使用できる TextStream オブジェクトを返します。

構文
object.OpenTextFile (filename, [ iomode, [ create, [ format ]]])

 

ReadAll メソッド

ReadAll メソッド

TextStream ファイル全体を読み取って、結果の文字列を返します。

構文
オブジェクト.Readall

ReadAll…全体を取得

ReadLine…1行(改行手前まで)を取得

 

Split関数

Split関数

Split(文字列,区切り文字)

区切った文字列を一次元配列で返す。

 

ReadAllで一括取得したデータを、(Split関数で)改行で区切り、行を要素とした配列を作成。

 

(文字列の長さを取得するLen関数と)文字を取り出すLeft関数で、行の先頭と検索文字列が一致するかどうかを判定。

 

Constステートメント

・定数を宣言する。定義した値は変更できない。定数は(VBAでは)宣言時に初期化しなければならない。

 

メモ帳からエクセルへ貼付け時の文字化け解消

メモ帳の保存形式を「ANSI」にするのが手っ取り早い

 

その他・参考

ネットでよく見る変数「buf」の意味

 

VBAでループのcontinueを疑似的に行う方法

リーダブルコードなどの本にも書いてありますが、一般的には処理を途中で抜けられる場合はその場で抜けた方がよいとされているため、大きなIf文よりもCONTINUEラベルを用意した方がよいと思われます。

たまに、「GoTo=スパゲッティコード」というイメージが強いのかGoToを嫌悪する方がいらっしゃいますが、それはおかしなGoToの使い方をするからおかしくなる話であって、GoToが悪いわけではありませんし、そもそもC言語などのbreakやcontinueもやっていることはルール化されたGoToです。

タイトルとURLをコピーしました