Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4823 / 13644 ツリー ←次へ | 前へ→

【54011】指定のファイルをインポートしてグループ別のファイルを出力するVBA まんじゅう 08/2/20(水) 2:10 質問[未読]
【54012】Re:指定のファイルをインポートしてグルー... りん 08/2/20(水) 6:20 回答[未読]
【54027】Re:指定のファイルをインポートしてグルー... まんじゅう 08/2/20(水) 15:19 質問[未読]
【54033】Re:指定のファイルをインポートしてグルー... りん 08/2/20(水) 19:07 回答[未読]
【54040】Re:指定のファイルをインポートしてグルー... まんじゅう 08/2/21(木) 10:18 質問[未読]
【54051】Re:指定のファイルをインポートしてグルー... りん 08/2/21(木) 18:46 回答[未読]
【54057】Re:指定のファイルをインポートしてグルー... まんじゅう 08/2/22(金) 10:50 お礼[未読]
【54135】Re:指定のファイルをインポートしてグルー... まんじゅう 08/2/26(火) 2:50 質問[未読]
【54231】Re:指定のファイルをインポートしてグルー... りん 08/3/1(土) 12:33 回答[未読]

【54011】指定のファイルをインポートしてグループ...
質問  まんじゅう  - 08/2/20(水) 2:10 -

引用なし
パスワード
   EXCELにて、指定のファイルをインポートして
グループ別のファイル(100バイトで改行)を出力するVBAの作成をしています。
先頭行の1から8までが1グループでグループごとのファイルを出力したいです。
先頭行9は最終行

・指定のテキストファイル(100バイトで改行されている)
------------------------------
1山田・・・・・・・・・・・□□
2猿川・・・・・・・・・・・□□
2出川・・・・・・・・・・・・□
2田部・・・・・・・・・・・□□
8殿堂・・・・・・・・・・・□□
------------------------------ここまで1グループ
1前田・・・・・・・・・・・□□
2布施・・・・・・・・・・・・・
2川崎・・・・・・・・・・・□□
2舎熊・・・・・・・・・・・□□
2ラルド・・・・・・・・・・□□
2皆川・・・・・・・・・・・□□
8海堂・・・・・・・・・・・□□
------------------------------ここまで2グループ
・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・
------------------------------ここまでnグループ
9・・・・・・・・・・・・・□□最終行
※□は半角スペース

イメージとしては、グループごとにグループ番号を付与し、(グループ1なら番号1)
それをファイル名別(out1.txt、out2.txt、・・・・outn.txt)にtxtで出力したいです。また最終行に半角スペースがある場合は半角スペースも含めたいです。

・出力ファイル
out1.txt
---------------------------------
1山田・・・・・・・・・・・□□
2猿川・・・・・・・・・・・□□
2出川・・・・・・・・・・・・□
2田部・・・・・・・・・・・□□
8殿堂・・・・・・・・・・・□□
---------------------------------

out2.txt
---------------------------------
1前田・・・・・・・・・・・□□
2布施・・・・・・・・・・・・・
2川崎・・・・・・・・・・・□□
2舎熊・・・・・・・・・・・□□
2ラルド・・・・・・・・・・□□
2皆川・・・・・・・・・・・□□
---------------------------------

outn.txt
---------------------------------
1○○・・・・・・・・・・・□□
2○○・・・・・・・・・・・・・
2○○・・・・・・・・・・・□□
2○○・・・・・・・・・・・□□
8○○・・・・・・・・・・・□□
---------------------------------

この仕様はエクセルで実現可能でしょうか。
よろしくお願いします。

【54012】Re:指定のファイルをインポートしてグル...
回答  りん E-MAIL  - 08/2/20(水) 6:20 -

引用なし
パスワード
   まんじゅう さん、おはようございます。

>EXCELにて、指定のファイルをインポートして
>グループ別のファイル(100バイトで改行)を出力するVBAの作成をしています。
>先頭行の1から8までが1グループでグループごとのファイルを出力したいです。
>先頭行9は最終

テキストファイルのようですので、LINE INPUTで取りこみました。
Sub test()
  Dim s1 As String, flg As Boolean, NN As Long, LL As Long
  flg = False
  '
  Open "C:\D\InputData.TXT" For Input As #1
   Do Until EOF(1)
     Line Input #1, s1
     'ファイルを開いていなければFile Open
     If flg = False Then GoSub OutOp
     Print #2, s1
     '8を書きこんだらFile Close
     If Left(s1, 1) = "8" Then GoSub OutCl
   Loop
  Close #1
  If flg = True Then GoSub OutCl
  'メイン終了
Exit Sub
'書き出すファイルを開くサブルーチンです
OutOp:
  NN = NN + 1
  Open "C:\D\out" & Format(NN, "000") & ".txt" For Output As #2
  flg = True
Return
'書き出すファイル閉じるサブルーチンです
OutCl:
  Close #2
  flg = False
Return
End Sub

こんな感じです。
ただし、改行コードがCR+LFでないもの(テレメーターやMAC由来のテキストファイル)では失敗します。FSOのReadLineメソッドを使用する方が安全かもしれません。

【54027】Re:指定のファイルをインポートしてグル...
質問  まんじゅう  - 08/2/20(水) 15:19 -

引用なし
パスワード
   りんさん こんにちわ

朝早くにありがとうございます。

できました!!

すごい!!

ちなみに先頭行の9を出力しないようにするには、どうすればよいでしょうか。

【54033】Re:指定のファイルをインポートしてグル...
回答  りん E-MAIL  - 08/2/20(水) 19:07 -

引用なし
パスワード
   まんじゅう さん、こんばんわ。

>ちなみに先頭行の9を出力しないようにするには、どうすればよいでしょうか。
最終行のフラグが9のようなので、9が来た時点で抜けるようにしました。
9が来なかった場合も考えてEOFは残してあります。

Sub test()
  Dim s1 As String, flg As Boolean, NN As Long, LL As Long
  flg = False
  '
  Open "C:\D\InputData.TXT" For Input As #1
   Do Until EOF(1)
     Line Input #1, s1
     '9だったらループから出る
     If Left(s1, 1) = "9" Then Exit Do
     'ファイルを開いていなければFile Open
     If flg = False Then GoSub OutOp
     Print #2, s1
     '8を書きこんだらFile Close
     If Left(s1, 1) = "8" Then GoSub OutCl
   Loop
  Close #1
  If flg = True Then GoSub OutCl
  'メイン終了
Exit Sub
'書き出すファイルを開くサブルーチンです
OutOp:
  NN = NN + 1
  Open "C:\D\out" & Format(NN, "000") & ".txt" For Output As #2
  flg = True
Return
'書き出すファイル閉じるサブルーチンです
OutCl:
  Close #2
  flg = False
Return
End Sub

こんな感じです。

【54040】Re:指定のファイルをインポートしてグル...
質問  まんじゅう  - 08/2/21(木) 10:18 -

引用なし
パスワード
   りん さん
こんにちわ。

すごい!!

先頭9データが出力されなくなりました!

グループ別(先頭1,2,8データ)の分離した各データの末尾に
先頭9のデータをつけることは可能でしょうか

出力イメージ
グループ1(先頭1,2,8,9データ)
グループ2(先頭1,2,8,9データ)
グループ3(先頭1,2,8,9データ)

出力される先頭データ9はすべて同じものです。

よろしくお願いします。

【54051】Re:指定のファイルをインポートしてグル...
回答  りん E-MAIL  - 08/2/21(木) 18:46 -

引用なし
パスワード
   まんじゅう さん、こんばんわ。

>グループ別(先頭1,2,8データ)の分離した各データの末尾に
>先頭9のデータをつけることは可能でしょうか
最後のレコードを追加したいということですか?
配列に入れて処理する方法も考えましたが、一旦書き出したファイルに1行追加する方法でいきます。

Sub test()
  Dim s1 As String, flg As Boolean, II As Long, NN As Long, LL As Long
  Dim Ifile As String, Ofile As String
  Ifile = "C:\D\InputData.TXT"'読みこむファイル
  Ofile = "C:\D\out___.txt"  '書き出すファイル ___ 部に3ケタの数字が入る
  flg = False
  '
  Open Ifile For Input As #1
   Do Until EOF(1)
     Line Input #1, s1
     '9だったらループから出る
     If Left(s1, 1) = "9" Then Exit Do
     'ファイルを開いていなければFile Open
     If flg = False Then GoSub OutOp
     Print #2, s1
     '8を書きこんだらFile Close
     If Left(s1, 1) = "8" Then GoSub OutCl
   Loop
  Close #1
  '念のため、開きっぱなしのファイルがないかチェック
  If flg = True Then GoSub OutCl
  '
  '最終行の追加(9じゃない時を考慮して分岐を入れました)
  If Left(s1, 1) = "9" Then
   For II = 1 To NN
     '追加モードで開き、書き込みます
     Open Replace(Ofile, "___", Format(II, "000")) For Append As #2
      Print #2, s1
     Close #2
   Next
  End If
  'メイン終了
Exit Sub
'書き出すファイルを開くサブルーチンです
OutOp:
  NN = NN + 1
  Open Replace(Ofile, "___", Format(NN, "000")) For Output As #2
  flg = True
Return
'書き出すファイル閉じるサブルーチンです
OutCl:
  Close #2
  flg = False
Return
End Sub

こんな感じです。
ファイル名の部分もちょっと変えました。

【54057】Re:指定のファイルをインポートしてグル...
お礼  まんじゅう  - 08/2/22(金) 10:50 -

引用なし
パスワード
   りん さん
こんにちわ!!

すごい!
できました!!

ありがとうございました。

【54135】Re:指定のファイルをインポートしてグル...
質問  まんじゅう  - 08/2/26(火) 2:50 -

引用なし
パスワード
   りん さん
 
こんばんわ。

りんさんからおそわった
最新のプログラムで出力するファイル名の名前を変更したいと考えています。
先頭番号2のファイルの80バイトから81バイトで各グループごと
に同じ番号が入っております。
その番号をグループ別の出力されるファイル番号にすれには
どうしたらよいでしょうか。
番号は、10、20、30、40、50,60です。
番号は、インポートするファイルにより
10から60のすべて入っている場合もありますし
10、20、30だけの場合もあります。
この番号分(10,20,30なら3つ)のグループ
にしたいのですが。
ご教授よろしくお願いします


・指定のテキストファイル(100バイトで改行されている)
80から81バイトに10、20、30、40、50,60
の番号があります。
------------------------------
1山田・・・・・・・・・・・・□□
2猿川・・・・・・10・・・・□□
2出川・・・・・・10・・・・・□
2田部・・・・・・10・・・・□□
8殿堂・・・・・・・・・・・・□□
------------------------------ここまで1グループ
1前田・・・・・・・・・・・・・□□
2布施・・・・・・20・・・・・・・
2川崎・・・・・・20・・・・・□□
2舎熊・・・・・・20・・・・・□□
2ラルド・・・・・20・・・・・□□
2皆川・・・・・・20・・・・・□□
8海堂・・・・・・・・・・・・・□□
------------------------------ここまで2グループ
・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・
------------------------------ここまでnグループ
9・・・・・・・・・・・・・□□最終行
※□は半角スペース


・出力ファイル
out10.txt
---------------------------------
1山田・・・・・・・・・・・・□□
2猿川・・・・・・10・・・・□□
2出川・・・・・・10・・・・・□
2田部・・・・・・10・・・・□□
8殿堂・・・・・・・・・・・・□□
---------------------------------

out20.txt
---------------------------------
1前田・・・・・・・・・・・・・□□
2布施・・・・・・20・・・・・・・
2川崎・・・・・・20・・・・・□□
2舎熊・・・・・・20・・・・・□□
2ラルド・・・・・20・・・・・□□
2皆川・・・・・・20・・・・・□□
8海堂・・・・・・・・・・・・・□□

---------------------------------

outn.txt
---------------------------------
1○○・・・・・・・・・・・□□
2○○・・・・・・n・・・・・・・
2○○・・・・・・n・・・・・□□
2○○・・・・・・n・・・・・□□
8○○・・・・・・・・・・・□□
---------------------------------

【54231】Re:指定のファイルをインポートしてグル...
回答  りん E-MAIL  - 08/3/1(土) 12:33 -

引用なし
パスワード
   まんじゅう さん、こんにちわ。
遅くなってすみません。さっき気づきました。

>最新のプログラムで出力するファイル名の名前を変更したいと考えています。
>先頭番号2のファイルの80バイトから81バイトで各グループごと
>に同じ番号が入っております。

「1」はキープしておき、最初に出てきた「2」でファイル名を決定して書き出しています。
Sub test()
  Dim s1 As String, s2 As String, flg As Boolean, II As Long, NN As Long, LL As Long
  Dim Ifile As String, Ofile As String
  ReDim Ofiles(1 To 10) As String 'とりあえず10個
  Ifile = "C:\D\InputData.TXT" '読みこむファイル
  Ofile = "C:\D\out__.txt"  '書き出すファイル __ 部に文字が入る
  flg = False
  '
  Open Ifile For Input As #1
   Do Until EOF(1)
     Line Input #1, s1
     '9だったらループから出る
     If Left(s1, 1) = "9" Then Exit Do
     If Left(s1, 1) = "1" Then
      '1の時はキープ
      s2 = s1
     Else
      'ファイルを開いていなければFile Open
      If flg = False Then GoSub OutOp
      Print #2, s1
      '8を書きこんだらFile Close
      If Left(s1, 1) = "8" Then GoSub OutCl
     End If
   Loop
  Close #1
  '念のため、開きっぱなしのファイルがないかチェック
  If flg = True Then GoSub OutCl
  '
  '最終行の追加(9じゃない時を考慮して分岐を入れました)
  If Left(s1, 1) = "9" Then
   For II = 1 To NN
     '追加モードで開き、書き込みます
     Open Ofiles(II) For Append As #2
      Print #2, s1
     Close #2
   Next
  End If
  'メイン終了
  Erase Ofiles
Exit Sub
'書き出すファイルを開くサブルーチンです
OutOp:
  NN = NN + 1
  If NN > UBound(Ofiles) Then ReDim Preserve Ofiles(1 To NN) As String '拡張
  '80-81バイト目を切り出してファイル名決定
  Ofiles(NN) = Replace(Ofile, "__", StrConv(MidB(StrConv(s1, vbFromUnicode), 80, 2), vbUnicode))
  'ファイルオープン
  Open Ofiles(NN) For Output As #2
  If s2 <> "" Then Print #2, s2
  '
  flg = True
Return
'書き出すファイル閉じるサブルーチンです
OutCl:
  Close #2
  s2 = ""
  flg = False
Return
End Sub

こんな感じです。

4823 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free