Excel VBA質問箱 IV

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

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


9683 / 13646 ツリー ←次へ | 前へ→

【26034】Input #ステートメントについて よち 05/6/22(水) 12:15 質問[未読]
【26035】Re:Input #ステートメントについて りん 05/6/22(水) 12:38 回答[未読]
【26037】Re:Input #ステートメントについて よち 05/6/22(水) 12:58 質問[未読]
【26040】Re:Input #ステートメントについて りん 05/6/22(水) 14:30 回答[未読]
【26048】Re:Input #ステートメントについて よち 05/6/22(水) 16:09 お礼[未読]
【26036】Re:Input #ステートメントについて(その2... りん 05/6/22(水) 12:42 回答[未読]
【26045】Re:Input #ステートメントについて だるま 05/6/22(水) 14:57 回答[未読]
【26049】Re:Input #ステートメントについて よち 05/6/22(水) 16:12 お礼[未読]

【26034】Input #ステートメントについて
質問  よち  - 05/6/22(水) 12:15 -

引用なし
パスワード
   Input # ステートメントは、データを囲むダブルクォーテンション(")、データを区切るカンマ(,)、また、行の終わりのキャリッジリターンや改行コードで区切ると思うのですが、下記のテキストを以下のように読み込むにはどのようにすればよいのか、わかる方がいましたら教えてください。

"プリント",2005/02/26 17:00:00,"JNB01177","た,め,し.pdf",0,0,1,0,0,0,0,0
"プリント",2005/02/26 18:00:00,"JNB01178","て,すと.pdf",0,0,1,0,0,0,0,0
"プリント",2005/02/26 19:00:00,"JNB01179","ためし.xls",0,0,1,0,0,0,0,0
"プリント",2005/02/26 20:00:00,"JNB01180","てす,と.doc",0,0,1,0,0,0,0,0
続く・・

    For p = 1 To 12
    Input #1, naiyou(p)
    Next p

naiyou(4)=た
ではなく、
naiyou(4)=た,め,し.pdf
と取得したいのです。

12項目をCSVファイルに格納されているファイルからの読み込みです。
文字の場合、"○○○"という形のデータを囲むダブルクォーテンション(")にて区分したいのですが、文字列の中にカンマ(,)が存在すると、そこで分離してしまい、12項目で1行のものが13、14項目になってしまい読み込みが正しく出来ません。

"○○○"を1項目として読み込むにはどのようにすればよいのでしょうか。
どう質問してよいのか、また、どう過去の質問を検索すればよいのかわからない状態での新規投稿です。
宜しくお願い致します。

【26035】Re:Input #ステートメントについて
回答  りん E-MAIL  - 05/6/22(水) 12:38 -

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

>Input # ステートメントは、データを囲むダブルクォーテンション(")、データを区切るカンマ(,)、また、行の終わりのキャリッジリターンや改行コードで区切ると思うのですが、下記のテキストを以下のように読み込むにはどのようにすればよいのか、わかる方がいましたら教えてください。
>"プリント",2005/02/26 17:00:00,"JNB01177","た,め,し.pdf",0,0,1,0,0,0,0,0
>"プリント",2005/02/26 18:00:00,"JNB01178","て,すと.pdf",0,0,1,0,0,0,0,0
>"プリント",2005/02/26 19:00:00,"JNB01179","ためし.xls",0,0,1,0,0,0,0,0
>"プリント",2005/02/26 20:00:00,"JNB01180","てす,と.doc",0,0,1,0,0,0,0,0

Sub test()
  Dim NN&, A$
  'Dドライブのルートにtest.csvという名前で保存してあるとして
  Open "d:\test.csv" For Input As #1
   Do Until EOF(1)
     NN& = NN& + 1
     Line Input #1, A$ 'とりあえず区切らずに読み込む
     Cells(NN&, 1).Value = A$
   Loop
  Close #1
  'データ→区切り位置→タブやカンマ(略)
  Range(Cells(1, 1), Cells(NN&, 1)).TextToColumns Destination:=Range("A1"), _
     DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, Comma:=True
End Sub

こんな感じです。

【26036】Re:Input #ステートメントについて(その...
回答  りん E-MAIL  - 05/6/22(水) 12:42 -

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

拡張子がcsvでなければ、これでも可能です。

Sub Test2()
  Workbooks.OpenText Filename:="D:\test.txt", StartRow:=1, DataType:= _
    xlDelimited, TextQualifier:=xlDoubleQuote, Comma:=True
End Sub

【26037】Re:Input #ステートメントについて
質問  よち  - 05/6/22(水) 12:58 -

引用なし
パスワード
   りんさん ありがとうございます。

もう少しで解決できそうです。

あと、問題点があります。
この処理には、前段階で、2項目目の日時をIFで判別しています。
期間的に何日〜何日の間のデータの抽出なので、
出来れば、セルに入力させてからの処理ではなく、変数内での処理は出来ないでしょうか。

宜しくお願いします。


▼りん さん:
>よち さん、こんにちわ。
>
>>Input # ステートメントは、データを囲むダブルクォーテンション(")、データを区切るカンマ(,)、また、行の終わりのキャリッジリターンや改行コードで区切ると思うのですが、下記のテキストを以下のように読み込むにはどのようにすればよいのか、わかる方がいましたら教えてください。
>>"プリント",2005/02/26 17:00:00,"JNB01177","た,め,し.pdf",0,0,1,0,0,0,0,0
>>"プリント",2005/02/26 18:00:00,"JNB01178","て,すと.pdf",0,0,1,0,0,0,0,0
>>"プリント",2005/02/26 19:00:00,"JNB01179","ためし.xls",0,0,1,0,0,0,0,0
>>"プリント",2005/02/26 20:00:00,"JNB01180","てす,と.doc",0,0,1,0,0,0,0,0
>
>Sub test()
>  Dim NN&, A$
>  'Dドライブのルートにtest.csvという名前で保存してあるとして
>  Open "d:\test.csv" For Input As #1
>   Do Until EOF(1)
>     NN& = NN& + 1
>     Line Input #1, A$ 'とりあえず区切らずに読み込む
>     Cells(NN&, 1).Value = A$
>   Loop
>  Close #1
>  'データ→区切り位置→タブやカンマ(略)
>  Range(Cells(1, 1), Cells(NN&, 1)).TextToColumns Destination:=Range("A1"), _
>     DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, Comma:=True
>End Sub
>
>こんな感じです。

【26040】Re:Input #ステートメントについて
回答  りん E-MAIL  - 05/6/22(水) 14:30 -

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

>この処理には、前段階で、2項目目の日時をIFで判別しています。

Sub test()
  Dim JJ&, NN&, RR&, A$, wb As Workbook, ws As Worksheet
  Application.ScreenUpdating = False '処理を画面に表示しない
  '作業用ブックを作成
  Set wb = Application.Workbooks.Add
  With wb.Worksheets(1)
   'Dドライブのルートにtest.csvという名前で保存してあるとして
   Open "d:\test.txt" For Input As #1
     Do Until EOF(1)
      NN& = NN& + 1
      Line Input #1, A$ 'とりあえず区切らずに読み込む
      .Cells(NN&, 1).Value = A$ '転記用
      .Cells(NN&, 2).Value = A$ '区切り用
     Loop
   Close #1
   'B列で区切る:データ→区切り位置→タブやカンマ(略)
   .Range(.Cells(1, 2), .Cells(NN&, 2)).TextToColumns Destination:=.Range("B1"), _
      DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, Comma:=True
   For RR& = 1 To NN&
     '区切ったものはB列から始まるので、日付は3列目
     '日付で抽出(時刻は小数なので切り捨てて分岐)
     Select Case Int(.Cells(RR&, 3).Value)
      Case DateSerial(2005, 2, 25) To DateSerial(2005, 2, 26)
        JJ& = JJ& + 1
        'マクロのあるブックの左端のシートに転記(読み込んだままの文字列)
        ThisWorkbook.Worksheets(1).Cells(JJ&, 1).Value = .Cells(RR&, 1).Value
     End Select
   Next
  End With
  '再カット
  If JJ& > 0 Then
   Application.DisplayAlerts = False
   With ThisWorkbook.Worksheets(1)
     .Range(.Cells(1, 1), .Cells(NN&, 1)).TextToColumns Destination:=.Range("A1"), _
        DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, Comma:=True
   End With
   Application.DisplayAlerts = True
  End If
  '作業用ブックを保存しないで閉じる
  wb.Saved = True: wb.Close
  Application.ScreenUpdating = True '処理を画面に表示する
  Set wb = Nothing
End Sub

直接当該ブックによみこまずに、作業ブックをつくって、処理後破棄するようにしています。
処理を繰返すならば、転記先のシートの値の範囲をクリアしてから読み込むようにして下さい。

【26045】Re:Input #ステートメントについて
回答  だるま WEB  - 05/6/22(水) 14:57 -

引用なし
パスワード
   >文字の場合、"○○○"という形のデータを囲むダブルクォーテンション(")にて区分した
>いのですが、文字列の中にカンマ(,)が存在すると、そこで分離してしまい、

読み込み用の変数がバリアント型だからではありませんか。
文字型の変数に読み込めば、希望どおり読み込めると思います。^d^

【26048】Re:Input #ステートメントについて
お礼  よち  - 05/6/22(水) 16:09 -

引用なし
パスワード
   りんさん ありがとうございました。

無事出来ました。
ありがとうございます。


▼りん さん:
>よち さん、こんにちわ。
>
>>この処理には、前段階で、2項目目の日時をIFで判別しています。
>
>Sub test()
>  Dim JJ&, NN&, RR&, A$, wb As Workbook, ws As Worksheet
>  Application.ScreenUpdating = False '処理を画面に表示しない
>  '作業用ブックを作成
>  Set wb = Application.Workbooks.Add
>  With wb.Worksheets(1)
>   'Dドライブのルートにtest.csvという名前で保存してあるとして
>   Open "d:\test.txt" For Input As #1
>     Do Until EOF(1)
>      NN& = NN& + 1
>      Line Input #1, A$ 'とりあえず区切らずに読み込む
>      .Cells(NN&, 1).Value = A$ '転記用
>      .Cells(NN&, 2).Value = A$ '区切り用
>     Loop
>   Close #1
>   'B列で区切る:データ→区切り位置→タブやカンマ(略)
>   .Range(.Cells(1, 2), .Cells(NN&, 2)).TextToColumns Destination:=.Range("B1"), _
>      DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, Comma:=True
>   For RR& = 1 To NN&
>     '区切ったものはB列から始まるので、日付は3列目
>     '日付で抽出(時刻は小数なので切り捨てて分岐)
>     Select Case Int(.Cells(RR&, 3).Value)
>      Case DateSerial(2005, 2, 25) To DateSerial(2005, 2, 26)
>        JJ& = JJ& + 1
>        'マクロのあるブックの左端のシートに転記(読み込んだままの文字列)
>        ThisWorkbook.Worksheets(1).Cells(JJ&, 1).Value = .Cells(RR&, 1).Value
>     End Select
>   Next
>  End With
>  '再カット
>  If JJ& > 0 Then
>   Application.DisplayAlerts = False
>   With ThisWorkbook.Worksheets(1)
>     .Range(.Cells(1, 1), .Cells(NN&, 1)).TextToColumns Destination:=.Range("A1"), _
>        DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, Comma:=True
>   End With
>   Application.DisplayAlerts = True
>  End If
>  '作業用ブックを保存しないで閉じる
>  wb.Saved = True: wb.Close
>  Application.ScreenUpdating = True '処理を画面に表示する
>  Set wb = Nothing
>End Sub
>
>直接当該ブックによみこまずに、作業ブックをつくって、処理後破棄するようにしています。
>処理を繰返すならば、転記先のシートの値の範囲をクリアしてから読み込むようにして下さい。

【26049】Re:Input #ステートメントについて
お礼  よち  - 05/6/22(水) 16:12 -

引用なし
パスワード
   だるまさん ありがとうございます。

一応
Dim naiyou(13) As String
と宣言したのですが・・

りんさんの解答でなんとか出来ました。
ありがとうございました。


▼だるま さん:
>>文字の場合、"○○○"という形のデータを囲むダブルクォーテンション(")にて区分した
>>いのですが、文字列の中にカンマ(,)が存在すると、そこで分離してしまい、
>
>読み込み用の変数がバリアント型だからではありませんか。
>文字型の変数に読み込めば、希望どおり読み込めると思います。^d^

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