
C:\Documents and Settings\All Users\デスクトップ\sample.txt
は次のようなデータになっています。
ABC
1,234567,89023,333
1,234567,89023,333
このデータをVBAを使ってExcelに読み込み、C:\Documents and Settings\All Users\デスクトップ\sample.xls
として保存にしたいのですが、どのようなコードを書けばよいものでしょうか?
sub test()
Dim fso, f, ts
Dim sline As String
Set fso = CreateObject("scripting.filesystemobject")
Set f = fso.getfile("C:\Documents and Settings\All Users\デスクトップ\sample.txt")
Set ts = f.openastextstream(1)
Do While ts.atendofstream <> True
sline = sline & ts.readline & vbCrLf
Loop
ts.Close
' MsgBox sline
End Sub
ここまでいったのですが、slineをexcelにだすことができません。
教えていただけると助かります・。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
#1です。
もとのコードを熟読しておりませんでしたが、Do While ts.atendofstream <> True
sline = sline & ts.readline & vbCrLf
Loop
ここのところで、1行ずつ読んだデータを、slineにまとめているのですね。
であれば、最初から
sline = ts.ReadAll
でループを回さずに、1行で済んでしまいます。
Do While ts.atendofstream <> True
で、1行ずつ読むのであれば、
sline = ts.readline
で取得した1行に対して、#1の処理でワークシートに書き込んでやれば良いです。
なお、
destRange.Offset(0, i) = ssline(i)
のところは、
destRange.Offset(0, i).value = ssline(i)
が正しいので注釈しておきます。(無くても動きますが)
参考URL:http://officetanaka.net/excel/vba/filesystemobje …
No.3
- 回答日時:
はじめまして you_ko_02_08 さん
まずサンプルソースをそのままC&Pして実行したところこのデータはタブ区切りデータですね?これは大切なことです。
1番さんは半角スペース区切り時の対応を書いていますが私はタブ区切りデータをして書いています(でも安心してください下記ソースはタブをスペースに変えるだけで対応できるように書いています)、質問はできるだけ詳細に条件を説明するべきでしょう。
さて、まぁそれは置いて置きましょう其れは回答後に補足で回答後に再度回答すればいい程度の問題です(回答者が減る程度の問題なのですね)。
>ここまでいったのですが、slineをexcelにだすことができません。
とのことなので
今回の質問はタブ区切りテキストを解析しエクセルに出力する。
でよろしいですね?ある程度ソースが書けるようなんで保存まで処理を書きません。もし解らなければ再度質問してください。
Sub test()
'テキストのディレクトリを指定します。
myfile = "C:\Documents and Settings\All Users\デスクトップ\sample.txt"
'データを取得しつつ配列化します
textdata = Split(CreateObject("Scripting.FileSystemObject").OpenTextFile(myfile, 1).ReadAll(), vbCrLf)
ReDim mytext(UBound(textdata)): For i = 0 To UBound(textdata): mytext(i) = textdata(i): Next
'データを二次配列化します
For i = 0 To UBound(mytext): mytext(i) = Split(mytext(i), vbTab): Next
'データを書き込みます
For i = 0 To UBound(mytext)
For j = 0 To UBound(mytext(i))
Cells(i + 1, j + 1).Value = mytext(i)(j)
Next
Next
End Sub
さて、実行してみましたか?お望みの結果が出力されたと思います。
このデータはまず改行コードで配列化さらに其れをタブで配列化し、二次配列を生成しています。
基本配列格納は0からなのでforは0からですが書き込むセルは1から始まるので+1指定します。
データを一気に読み込むのは開始位置を好きなように変更できる利点があるかです。ですがこれは大量データに向きません。
しかしながら事前の前提でそんな大量のデータを読み書きするとは書いていないのでこの回答で十分だと判断しました。
追加補足、処理違いなどがあればいってください。
No.2
- 回答日時:
こんなのでは?
Sub test()
'テキスト読み込み
Dim fso As Object, ts As Object
Dim sline As String
Set fso = CreateObject("scripting.filesystemobject")
Set ts = fso.getfile("C:\Documents and Settings\All Users\デスクトップ\sample.txt").OpenAsTextStream
sline = ts.ReadAll
ts.Close
MsgBox sline
'新規のExcelBookを作ってそこにデータを書き込む
Dim wb As Workbook
Dim rowData() As String
Dim colData() As String
Dim r As Integer
Dim c As Integer
Set wb = Workbooks.Add
rowData() = Split(sline, vbCrLf) 'crlfで分ける
For r = 0 To UBound(rowData)
rowData(r) = Replace(rowData(r), ",", "") 'カンマを消す場合
colData = Split(rowData(r), " ") '半角空白で分ける
If UBound(colData) >= 0 Then '改行のみに対処
For c = 0 To UBound(colData)
Cells(r + 1, c + 1) = colData(c)
Cells(r + 1, c + 1).NumberFormat = "#,##0" '3桁カンマを書式として付ける場合
Next
End If
Next
wb.Close SaveChanges:=True, Filename:="C:\Documents and Settings\All Users\デスクトップ\sample.xls"'同名のファイルがある場合は上書き保存
End Sub
p.s.
For c = 0 To UBound(colData)
Cells(r + 1, c + 1) = colData(c)
Next
の部分は
Cells(r + 1, 1).Resize(1, UBound(colData) + 1) = colData
で、1列分まとめて設定だけど文字型になってしまった。
No.1
- 回答日時:
読み込んだ1行が、半角スペース区切りの時、さわりを記します。
最後のSet destRange = destRange.Offset(1, 0)は、頭を使わず、エクセルの行を1行下に進めるコードです。
ご参考まで。
Sub test()
Dim sline As String
Dim ssline As Variant
Dim destRange As Range
Dim i As Long
Const delimiterChar As String = " "
sline = "1,234 567,890 23,333"
Set destRange = Range("a1")
ssline = Split(sline, delimiterChar)
For i = LBound(ssline) To UBound(ssline)
destRange.Offset(0, i) = ssline(i)
Next i
'エクセルの次の行に進めたければ
Set destRange = destRange.Offset(1, 0)
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) Excel VBAについて、 フォルダ内のファイルを全て開きたい場合、 FSOを使えば、Dirは使わ 1 2023/01/27 13:18
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Android VBA、フォルダのパスに環境文字 ㉑ があり、VBAが機能しません。 2 2022/07/27 09:16
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
- Visual Basic(VBA) VBAでファイルを開くプログラムがエラーです 2 2023/02/21 16:56
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
教えて下さい
-
多量のSUMIF式を軽くしたい
-
チェックサムの実装方法について
-
【エクセル】測定時間がバラバ...
-
VBA 毎日取得するデータを順番...
-
メモ帳(テキストデータ)をExc...
-
配列でデータが入っている要素...
-
C#でデータのファイル保存と保...
-
VBAで大量データの処理
-
この行は既に別のテーブルに属...
-
複数のブックのデータを集めて...
-
二分探索の平均探索回数
-
FORTRANでのプログラミングです...
-
Excel vbaで、一行ずつコピーし...
-
【USBメモリ】Sequential Writ...
-
Accessで該当データにフラグを...
-
データのアップロードやダウン...
-
家計簿プログラム
-
チェックサムとCRC
-
サムチェックのルール
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
教えて下さい
-
【エクセル】測定時間がバラバ...
-
多量のSUMIF式を軽くしたい
-
配列でデータが入っている要素...
-
メモ帳(テキストデータ)をExc...
-
ユーザーフォームのテキストボ...
-
特定のデータの抽出方法を教え...
-
二分探索の平均探索回数
-
EXCELVBAでSQLserverからデータ...
-
Accessで該当データにフラグを...
-
VBA 空白セルを削除ではない方...
-
この行は既に別のテーブルに属...
-
Excel VBAでのオートフィルター...
-
[C言語] コメント文字列を無視...
-
エクセルで2つの時系列のデー...
-
アクセス2000で画像データ...
-
CString型の文字列連結について
-
カンマからスラッシュに
-
VBにおいてフォーム間の変数の...
-
<VB>String→Object
おすすめ情報