
お世話になっております。
VBSで、CSVファイルをカンマ区切りで配列にし、
ファイルに書き出したいです。
下記のスクリプトを実行すると3行の改行と
これ⇒ ----------------
だけ出力されます。
Splitは使用できないのでしょうか?
どこが間違っているのかわかりません。
ご教授いただけませんでしょうか。
'---------------------------------------------------------------
On Error Resume Next
Set OBJFS01 = CreateObject("Scripting.FileSystemObject")
Set CSVTEXT01 =OBJFS01.OpenTextFile("C:\tmp\CSVTEXT.log")
Set LOGTEXT01 =OBJFS01.OpenTextFile("C:\tmp\LOGTEXT.log",8,False)
'---------------------------------------------------------------
i = 0
Dim HAIRETU(27)
Do While i < 6
HAIRETU(27) = Split(CSVTEXT01, ",")
LOGTEXT01.WriteLine(HAIRETU(2))
LOGTEXT01.WriteLine(HAIRETU(3))
LOGTEXT01.WriteLine(HAIRETU(4))
LOGTEXT01.WriteLine("----------------")
i = i + 1
Loop
LOGTEXT01.close
CSVTEXT01.close
No.4ベストアンサー
- 回答日時:
はじめまして testAdmin さん
みなさまの回答が楽しそうだったのでお邪魔します。
さて、この質問は
>どこが間違っているのかわかりません。
>ご教授いただけませんでしょうか。
ですね。それ以上の回答は致しません。新たな疑問ができた場合は新たに質問を立てて下さい。
さて、まずあなたの書いたスクリプトは正しく解釈され正しく実行されています。私から見れば当たり前の結果が当たり前のように出ているだけです。
'---------------------------------------------------------------
On Error Resume Next'以降全てのエラーを無視し処理をします
Set OBJFS01 = CreateObject("Scripting.FileSystemObject")
Set CSVTEXT01 =OBJFS01.OpenTextFile("C:\tmp\CSVTEXT.log")'ストリーム化
Set LOGTEXT01 =OBJFS01.OpenTextFile("C:\tmp\LOGTEXT.log",8,False)'ストリーム化
'---------------------------------------------------------------
i = 0
Dim HAIRETU(27)'0~27要素の配列の作成
Do While i < 6
HAIRETU(27) = Split(CSVTEXT01, ",")'配列要素27に対し指定値の受け渡し、但しsplitエラー。エラーしたためResume Nextの効果によりこの行は無視して次を処理
LOGTEXT01.WriteLine(HAIRETU(2))'初期化されない変数の代入但しWriteLineの効果により文字列に自動キャスト。結果空文字+Lineの改行=空文字改行の出力
LOGTEXT01.WriteLine(HAIRETU(3))'上記同/ちなみに初期化されない変数に格納されているのは Empty であり。空を意味するキャストされると""になる。
LOGTEXT01.WriteLine(HAIRETU(4))'上記同
LOGTEXT01.WriteLine("----------------")
i = i + 1
Loop
LOGTEXT01.close
CSVTEXT01.close
あなたの書いた内容は下記のようになります
二つのテキストストリーム作成
下記処理をループで6回行う
配列27に対してありえない代入をしてスキップさせる
空文字改行を出力するx3
ハイフンの線を出力する
ループ
テキストを二つとも閉じる
さて、こうなります。
「お分かりいただけただろうか?」
と、最近知人が連呼しているのだけれどもまぁ即座に閑話休題。
見ての通りスクリプトは正しく解釈し正しく処理を行っている。
なんら問題ない。
そういえば
>Splitは使用できないのでしょうか?
なんて言っていましたっけ?いいえ、正しく動作し正しくエラーしていますよ?
・・・。
あぁまさか、splitの動作がなぜエラーするか分からない?って事でしょうか?あえてエラーさせているかと思っているのですが…。
なにせ、On Error Resume Nextを使ってエラーをスキップさせているのですから。本来正しく動作ように組んでいればOn Error Resume Nextは必要ありません。On Error Resume Nextを使うような機会は最初からエラーし得る処理でかつerr値を見て予定通りにエラーした場合中断もしくはリカバリへ変更などに使うのですから。
では、On Error Resume Nextをコメントアウトして実行してみましょう。
「C:\tmp\writecsv.vbs(11, 1) Microsoft VBScript 実行時エラー: オブジェクトでサポートされていないプロパティまたはメソッドです。」
この11行目は「HAIRETU(27) = Split(CSVTEXT01, ",")」
当たり前ですがここでエラーです。さて、では逆になぜこれがエラーしているのが説明しなければなりませんね。
さて、そもそもあなたがなぜsplitをこのように使えば正しく動くと思っているのかは私には分かりません。きっと、生まれた時から「splitはこのように扱うんだ!」と脳に刻まれていたのかも知れません。
ですが残念な事に本当にとてもとても非常に残念ながら私は最初からそんなものを知っているような脳は持ち合わせていませんでした。
では私はどのように知り、あなたの記述が間違っているかを証明せねばなりません。
さてvbsはそもそも何なのでしょうか?google先生に聞いてみたところWSHというものの一つらしいですね。
ではWSHっていうのは?Windows Script Hostというものらしいですよ。
さてWindowsは何処が提供しているのだろう?マイクロソフトらしい。
それでVBSの仕様はマニュアルは?中でも今しりたいsplitの仕様は何処でしょうか?調べてみるとMSDNというところにVBSの仕様が書かれているようです。調べてみましょう。
http://msdn.microsoft.com/ja-jp/library/cc410311 …
と、ここに説明がありました。
Split(expression[, delimiter[, count[, compare]]])
expression
必ず指定します。文字列と区切り文字を含んだ文字列式を指定します。引数 expression が長さ 0 の文字列 ("") である場合、Split 関数は、要素もデータもない空の配列を返します。
と、あります。
「必ず指定します。文字列…」とあります。そうですね。splitの第一引数はstringつまり文字列でなければならないのです。
「お分かりいただけただろうか?」
ん?文字列(string)を指定したつもり?私にはとてもそうは見えませんが検証して証明しなければなりませんね。
Set CSVTEXT01 =OBJFS01.OpenTextFile("C:\tmp\CSVTEXT.log")
Set LOGTEXT01 =OBJFS01.OpenTextFile("C:\tmp\LOGTEXT.log",8,False)
wsh.echo typename(CSVTEXT01)
結果
TextStream
まぁ当たり前ですが。setで渡せるのは参照値であり実値では在りません。setで作った変数がsplitで処理できるはずはありません。
setが何か分からない場合は下記を参照してください。
http://msdn.microsoft.com/ja-jp/library/cc392465 …
msgbox
http://msdn.microsoft.com/ja-jp/library/cc410277 …
とある専門家さんが「msgbox(CSVTEXT01)」なんて書いてますがmsgboxに渡せる値もstringでなければならない為どう考えてもこれもエラーします。どうしてこんな事をやらせたのか真意はわかりません。
そしてどうやって
>両方とも入っておりませんでした。
と、いう返答ができたのか実は不思議でしょうがありません。
さて、
>Splitは使用できないのでしょうか?
正しく動作します。仮におかしいと感じるのであれば正しく理解していなかっただけでしょう。
>どこが間違っているのかわかりません。
私にも分かりません。記述通り動作しているとおもわれます。
と、なるのですがこれで宜しいでしょうか?
参考URLをぜひ活用してください。
ポイントは要りません。専門家さんにでも振ってあげてください。
参考URL:http://www.google.co.jp/
No.3
- 回答日時:
こんばんは。
もうすでに、#2さんがご指摘のようですが、
HAIRETU(27) = Split(CSVTEXT01, ",")
そもそも、こんなことは出来ないですね。
Split の受ける側の変数は、あらかじめ決められた配列の変数に順序よく入らないはずです。
もちろん、Buffer を設けて、ひとつずつ入れるというなら別ですが。
それはともかく、このコードは、Do While ~ Loop を使っていますが、CSV は、3行と「----」の線だけの一回きりなのですか?ずっと続くのではないでしょうか?
実際に、動かしてはいませんが、こういうことではないでしょうか?
'-------------------------------------------
iFName = "C:\tmp\CSVTEXT.log"
oFName = "C:\tmp\LOGTEXT.log"
'-------------------------------------------
Set objFso = CreateObject("Scripting.FileSystemObject")
Set CSVTEXT01 = objFso.OpenTextFile(iFName)
Set LOGTEXT01 = objFso.CreateTextFile(oFName, 8, True)
Do Until CSVTEXT01.AtEndOfStream = True
txTmp = CSVTEXT01.ReadLine()
HAIRETU = Split(txTmp, ",", -1 , 1) 'TextCompare
For i = LBound(HAIRETU) To UBound(HAIRETU)
If i > 2 And i < 6 Then
flg = True
LOGTEXT01.WriteLine (HAIRETU(i))
End If
Next
If flg Then
LOGTEXT01.WriteLine ("----------------")
End If
flg = False
Loop
CSVTEXT01.Close
LOGTEXT01.Close
'-------------------------------------------
No.2
- 回答日時:
Dim HAIRETU(27)
Do While i < 6
HAIRETU(27) = Split(CSVTEXT01, ",")
これだと、HAIRETUの要素27にSplitの結果が格納されます。
Dim HAIRETU
Do While i < 6
HAIRETU = Split(CSVTEXT01, ",")
このように配列数を指定せずに試してみてください。
この回答への補足
おはようございます。
HAIRETU = Split(CSVTEXT01, ",")
にすると、改行がなくなり----------------だけになりました。
CSVTEXT01が認識されていない(?)のでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
- Visual Basic(VBA) vba 重複データ合算 5 2023/07/05 18:55
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
お助けください!VBAのファイル...
-
VBAでfunctionを利用しようとし...
-
UserForm1.Showでエラーになり...
-
「実行時エラー '3167' レコー...
-
【VBA】ワークブックを開く時に...
-
マクロで"#N/A"のエラー行を削...
-
SQLでエラーです。
-
String""から型'Double'への変...
-
エクセル関数式=ABSで#VALUE!...
-
インポート時のエラー「データ...
-
実行時エラー'-2147467259(8000...
-
ACCESSで値を代入できないとは?
-
IISの仮想ディレクトリ作成がわ...
-
マクロOn Error GoTo ErrLabel...
-
VBAで、Excelの選択範囲をWeb形...
-
ADO 「認証に失敗しました」
-
文字列内で括弧を使うには
-
ACCESS97 実行時エラー '2455'...
-
VBA エクセル で FIND でのエラ...
-
存在しないアドレスへ送信した...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
マクロOn Error GoTo ErrLabel...
-
UserForm1.Showでエラーになり...
-
お助けください!VBAのファイル...
-
VBAでfunctionを利用しようとし...
-
【VBA】ワークブックを開く時に...
-
String""から型'Double'への変...
-
文字列内で括弧を使うには
-
マクロで"#N/A"のエラー行を削...
-
Excel vbaについての質問
-
VBA データ(特定値)のある最...
-
On ErrorでエラーNoが0
-
インポート時のエラー「データ...
-
【VBAエラー】Nextに対するFor...
-
ACCESSで値を代入できないとは?
-
【Access】Excelインポート時に...
-
VBでSQL文のUPDATE構文を使った...
-
【VB.NET】 パワポ操作を非表示で
-
「実行時エラー '3167' レコー...
-
実行時エラー 438 の解決策をお...
-
実行時エラー'-2147467259(8000...
おすすめ情報