質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

コピー

元のオブジェクトを破壊することなく、オブジェクトの複製を生成することをコピーと呼びます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

3回答

29052閲覧

テキストファイルから特定の文字列に挟まれた行をEXCELマクロを使ってコピーし貼り付けたい

Tokamura

総合スコア9

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

コピー

元のオブジェクトを破壊することなく、オブジェクトの複製を生成することをコピーと呼びます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2017/07/11 09:51

###前提・実現したいこと
.txtテキストファイルに保存してある文字行の中から、特定の文字行に挟まれた行を選択し、Excel2010でマクロを使って、Excelに貼り付けたいです。例えば、

<テキストファイル例> ※例なので実際のテキスト内容は下記に限らず。
東京
大阪
名古屋
広島
福岡
鹿児島

<上記の内、コピーしたい行> ※大阪から福岡までの行を選択したいです。
大阪
名古屋
広島
福岡

###該当のソースコード
Sub PasteFromCSV()
Const CSV_FILE = "c:\temp\command.txt"
Dim ReadWBk As Workbook
Dim WriteWBk As Workbook
Dim WriteSht As Worksheet
Dim Rng As Range

Set WriteWBk = ActiveWorkbook
Set WriteSht = WriteWBk.ActiveSheet

Set ReadWBk = Workbooks.Open(CSV_FILE)
Set Rng = ReadWBk.Worksheets.Item(1).UsedRange
Range("A1:A170").Copy

WriteSht.Range("A1").PasteSpecial xlPasteValues, xlPasteSpecialOperationNone, False, False

ReadWBk.Close
Set ReadWBk = Nothing
End Sub

###試したこと
IFやFINDを試そうとしたのですが、どの構文がよいのか分からず、本問合せに至った次第です。

###補足情報(言語/FW/ツール等のバージョンなど)
EXCEL2010で試しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

すでにほかの方からのアドバイスにもある通り、実現方法はいくつかあります。

自分からはFind関数を使った方法をご紹介します。

VBA

1Sub PasteFromCSV() 2 Const CSV_FILE = "c:\temp\command.txt" 3 Dim ReadWBk As Workbook 4 Dim WriteWBk As Workbook 5 Dim WriteSht As Worksheet 6 Dim Rng As Range 7 8 Set WriteWBk = ActiveWorkbook 9 Set WriteSht = WriteWBk.ActiveSheet 10 11 Set ReadWBk = Workbooks.Open(CSV_FILE) 12 'Set Rng = ReadWBk.Worksheets.Item(1).UsedRange 13 'Range("A1:A170").Copy 14 15 Dim ReadSht As Worksheet 16 Dim rngStart As Range '開始セル 17 Dim rngEnd As Range '終了セル 18 19 Set ReadSht = ReadWBk.Worksheets.Item(1) 20 21 Set rngStart = ReadSht.Range("A:A").Find("大阪") 22 Set rngEnd = ReadSht.Range("A:A").Find("福岡") 23 24 If rngStart Is Nothing Then 25 '開始セルが見つからなければA1にセット 26 Set rngStart = ReadSht.Cells(1, "A") 27 End If 28 29 If rngEnd Is Nothing Then 30 '終了セルが見つからなければA列最終行にセット 31 Set rngEnd = ReadSht.Cells(ReadSht.Cells(Rows.Count, "A").End(xlUp).Row, "A") 32 End If 33 34 '開始セルから終了セルまでをコピー 35 Range(rngStart, rngEnd).Copy 36 37 WriteSht.Range("A1").PasteSpecial xlPasteValues, xlPasteSpecialOperationNone, False, False 38 39 ReadWBk.Close 40 41 Set ReadWBk = Nothing 42End Sub

テキストファイルをシートに取り込んだ後、Find関数で大阪のセルと福岡のセルをFind関数で検索し、大阪セル~福岡セルの範囲を範囲コピーしています。

参考になれば幸いです。

投稿2017/07/12 00:50

jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tokamura

2017/07/12 01:43

ありがとうございます。やりたかったことが実現できました。大変参考になりました。
guest

0

FileSystemObject で一気に読み込み、Mid関数で目的の範囲を取り出して、レンジに代入

Sub ReadCSV() Const CSV_FILE = "c:\temp\command.txt" Const BeginWord = "大阪" Const EndWord = "福岡" Dim strCSV As String, aryCsv As Variant Dim p1 As Long, p2 As Long With CreateObject("Scripting.FileSystemObject") With .GetFile(CSV_FILE).OpenAsTextStream strCSV = .ReadAll .Close End With End With p1 = InStr(1, strCSV, BeginWord) If p1 > 0 Then p2 = InStr(p1, strCSV, EndWord) If p2 > 0 Then strCSV = Mid(strCSV, p1, p2 - p1 + Len(EndWord)) aryCsv = Split(strCSV, vbCrLf) Range("A1").Resize(UBound(aryCsv) + 1, 1) = WorksheetFunction.Transpose(aryCsv) Else MsgBox "該当データなし" End If End Sub

投稿2017/07/11 17:32

hatena19

総合スコア34053

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tokamura

2017/07/12 01:45

やりたいことが実現できました。ありがとうございました。大変助かります。
guest

0

とりあえずループで回してみました。
処理速度とか体裁にこだわらないなら問題ないと思います。
テキストファイルを読み込み終わった以降に、下記コードを実行してみてください。

VBA

1 Dim startStr As String 2 Dim endStr As String 3 Dim copyFlag As Boolean 4 Dim writeRow As Long 5 6 startStr = "大阪" 7 endStr = "福岡" 8 copyFlag = False 9 writeRow = 1 10 11 For Each c In ReadWBk.Worksheets(1).Range("A1:A" & Range("A1").End(xlDown).Row) 12 If c = startStr Then copyFlag = True 13 If copyFlag Then 14 WriteSht.Cells(writeRow, 1) = c 15 writeRow = writeRow + 1 16 If c = endStr Then Exit For 17 End If 18 Next 19

投稿2017/07/11 10:12

ttyp03

総合スコア17000

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tokamura

2017/07/12 01:46

早々のアドバイスありがとうございます。大変参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問