Excel VBA質問箱 IV

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

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


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

【40863】テキストデータの読込み後の処理に関して 質問(初心者A氏) 06/7/25(火) 14:18 質問[未読]
【40864】Re:テキストデータの読込み後の処理に関して Blue 06/7/25(火) 14:23 発言[未読]
【40865】Re:テキストデータの読込み後の処理に関して 質問(初心者A氏) 06/7/25(火) 14:32 質問[未読]
【40867】Re:テキストデータの読込み後の処理に関して Kein 06/7/25(火) 14:54 回答[未読]
【40870】Re:テキストデータの読込み後の処理に関して 質問(初心者A氏) 06/7/25(火) 15:01 お礼[未読]
【40868】Re:テキストデータの読込み後の処理に関して ハト 06/7/25(火) 14:54 発言[未読]
【40877】Re:テキストデータの読込み後の処理に関して 質問(初心者A氏) 06/7/25(火) 17:24 質問[未読]
【40881】Re:テキストデータの読込み後の処理に関して ハト 06/7/25(火) 17:41 発言[未読]
【40906】Re:テキストデータの読込み後の処理に関して ichinose 06/7/25(火) 23:19 発言[未読]
【40920】Re:テキストデータの読込み後の処理に関して ハト 06/7/26(水) 11:13 発言[未読]
【40914】Re:テキストデータの読込み後の処理に関して 質問(初心者A氏) 06/7/26(水) 9:14 お礼[未読]

【40863】テキストデータの読込み後の処理に関して
質問  質問(初心者A氏)  - 06/7/25(火) 14:18 -

引用なし
パスワード
   1点教えて下さい。
TXTデータのEXCELでの読み込み後の編集方法です。

1.TXTデータを読み込む。
2.読み込んだ内容を項目毎に区切る。
3.内容編集後CSVファイルに保存したい。

A 項目1
BB 項目2
C 項目3 
D 項目4 

A1BB1C1D1
A2BB2C2D2
A3BB3C3D3
A4BB4C4D4
A5BB5C5D5

前処理で読み込んだファイルをセル毎に定義して
データの編集を行いたい。

A1,BB1,C1,D1
A2,BB2,C2,D2
A3,BB3,C3,D3
A4,BB4,C4,D4
A5,BB5,C5,D5

通常で読み込むとセルに1個の項目で読み込まれてしまいます。
読み込んだ後にデータを編集で利用したいのですが、毎回MID
関数で位置・長さを定義しないとできないのか教えて下さい。

以上お願いします。

【40864】Re:テキストデータの読込み後の処理に関...
発言  Blue  - 06/7/25(火) 14:23 -

引用なし
パスワード
   一項目の長さが決まっているのであれば、普通にテキストで読み込んでから、

メニューのデータ→区切り位置

を使えば、分割できると思います。

【40865】Re:テキストデータの読込み後の処理に関...
質問  質問(初心者A氏)  - 06/7/25(火) 14:32 -

引用なし
パスワード
   回答ありがとうございました。
そのやり方も考えたのですが・・・

複数のファイルを編集しようとしていたので、

CSVファイルをTXTに編集するやり方の逆
ができないものかと思い質問しました。・・・

Type recFormat
  f1 As String * 10
End Type

For i = 1 To UBound(mArray, 1)
  With rFormat
    RSet .f1 = mArray(i, 1)
   End With

宜しくお願いします。


【40867】Re:テキストデータの読込み後の処理に関...
回答  Kein  - 06/7/25(火) 14:54 -

引用なし
パスワード
   >毎回MID関数で位置・長さを定義
というところから推測すると、固定長のテキストですか ?
それならLeft,Right,Mid関数を使っても問題ないと思います。
ただし、わざわざワークシートに書き出す必要はありません。
以下のようにして、読み込みと書き出しを一度で済ませてしまえば
良いのです。

Sub Mk_ReNewText()
  Dim MyF As String, MyF2 As String
  Dim Buf1 As String, Buf2 As String
  Dim Fnum1 As Long, Fnum2 As Long

  MyF = Application _
  .GetOpenFilename("テキストファイル(*.txt),*.txt")
  If MyF = "False" Then Exit Sub
  MyF2 = Left$(MyF, Len(MyF) - 4) & "ReNew.txt"
  Fnum1 = FreeFile()
  Open MyF For Input Access Read As #Fnum1
  Fnum2 = FreeFile()
  Open MyF2 For OutPut Access Write As #Fnum2
  Do Until EOF(Fnum1)
   Line Input #Fnum1, Buf1
   Buf2 = Left$(Buf1, 2) & "," & Mid$(Buf1, 3, 3) & _
   "," & Mid$(Buf1, 6, 2) & "," & Right$(Buf1, 2)
   Print #Fnum2, Buf2
   Buf1 = "": Buf2 = ""
  Loop
  Close #Fnum2: Close #Fnum1
  MsgBox Dir(MyF2) & vbLf & "を作成しました", 64
End Sub

【40868】Re:テキストデータの読込み後の処理に関...
発言  ハト  - 06/7/25(火) 14:54 -

引用なし
パスワード
   おはようございます

▼質問(初心者A氏) さん:
>1点教えて下さい。
>TXTデータのEXCELでの読み込み後の編集方法です。
>
>1.TXTデータを読み込む。
>2.読み込んだ内容を項目毎に区切る。
>3.内容編集後CSVファイルに保存したい。
>
>A 項目1
>BB 項目2
>C 項目3 
>D 項目4 
>
>A1BB1C1D1
>A2BB2C2D2
>A3BB3C3D3
>A4BB4C4D4
>A5BB5C5D5
>
>前処理で読み込んだファイルをセル毎に定義して
>データの編集を行いたい。
>
>A1,BB1,C1,D1
>A2,BB2,C2,D2
>A3,BB3,C3,D3
>A4,BB4,C4,D4
>A5,BB5,C5,D5
>
>通常で読み込むとセルに1個の項目で読み込まれてしまいます。
>読み込んだ後にデータを編集で利用したいのですが、毎回MID
>関数で位置・長さを定義しないとできないのか教えて下さい。
>
>以上お願いします。

お求めの方法とは違うかと思いますが
読み込んでエクセルに書き込む時に分割する方法です
(1行のレコード長、項目の文字数が固定の場合)

Type T_DATA
  f1 As String * 10
  f2 As String * 10
  f3 As String * 10
  f4 As String * 10
End Type

Sub RD_TXT()

Dim RData As T_DATA
Dim FName As String 'ファイルパス取得
Dim i As Long

  i = 0
  FName = "C:\xxxxxx\xxxx\xxxx.txt"
  
  'ファイルオープン
  Open FName For Binary As #1

  Get #1, , RData
  Do While Not EOF(1)
    i = i + 1
    With ThisWorkbook.Worksheets("Sheet1")
      .Cells(i, 1) = RData.f1
      .Cells(i, 2) = RData.f2
      .Cells(i, 3) = RData.f3
      .Cells(i, 4) = RData.f4
    End With
    Get #1, , BRec
  Loop
  
  Close #1

End Sub

【40870】Re:テキストデータの読込み後の処理に関...
お礼  質問(初心者A氏)  - 06/7/25(火) 15:01 -

引用なし
パスワード
   みなさん、回答ありがとうございました。
試してみます。

【40877】Re:テキストデータの読込み後の処理に関...
質問  質問(初心者A氏)  - 06/7/25(火) 17:24 -

引用なし
パスワード
   この処理をした時に、読込みデータの1件目のデータを毎回
取り込んでしまいます。

また、Get #1, , BRecの箇所の定義は
Dim BRec As T_DATAで定義すればいいのか教えて下さい。

読込みは21件あるが、区切りの処理をすると
1件目のデータが24件処理されるのですが・・・

【40881】Re:テキストデータの読込み後の処理に関...
発言  ハト  - 06/7/25(火) 17:41 -

引用なし
パスワード
   ▼質問(初心者A氏) さん:
>この処理をした時に、読込みデータの1件目のデータを毎回
>取り込んでしまいます。
>
>また、Get #1, , BRecの箇所の定義は
>Dim BRec As T_DATAで定義すればいいのか教えて下さい。
>
>読込みは21件あるが、区切りの処理をすると
>1件目のデータが24件処理されるのですが・・・

申し訳ありません、いくつかミスがありました

Type T_DATA
  f1 As String * 10 ’バイト単位での処理のため
  f2 As String * 10 ’日本語(全角文字)の場合は文字数の2倍にする
  f3 As String * 10 
  f4 As String * 10 
  DMY As String * 2 ’←改行文字がある場合に必要
End Type

Sub RD_TXT()

Dim RData As T_DATA
Dim FName
Dim i As Long

  i = 0
'  FName = "C:\xxxxxx\xxxx\xxxx.txt"
  'ファイル選択ダイアログを開きファイル名を取得
  FName = Application.GetOpenFilename("ファイル (*.*),*.*")

  'キャンセルを選択?
  If FName = False Then Exit Sub
  
  'ファイルオープン
  Open FName For Binary As #1

  Get #1, , RData
  Do While Not EOF(1)
    i = i + 1
    With ThisWorkbook.Worksheets("Sheet4")
      .Cells(i, 1) = RData.f1
      .Cells(i, 2) = RData.f2
      .Cells(i, 3) = RData.f3
      .Cells(i, 4) = RData.f4
    End With
'    Get #1, , BRec
    Get #1, , RData
  Loop
  
  Close #1

End Sub

【40906】Re:テキストデータの読込み後の処理に関...
発言  ichinose  - 06/7/25(火) 23:19 -

引用なし
パスワード
   こんばんは。
テキストファイルの順次読込みは
やっぱり Line inputが速いと思いますけどねえ・・・
全角文字が入っていても対応できるようにしました。

'=============================================================
Sub main()
  Dim mnum As Variant
  Dim dat As String
  Dim idx As Long, jdx As Long
  mnum = Array(2, 3, 2, 2)
'   A1BB1C1D1 −−−−−>A1,BB1,C1,D1
'   とする場合は、mnum = Array(2, 3, 2, 2) と指定します
'   尚、単位は、バイトです
  ReDim csv(1 To UBound(mnum) + 1)
  Open ThisWorkbook.Path & "\test.txt" For Input As #1
  Open ThisWorkbook.Path & "\test.csv" For Output As #2
'            ここは本来のファイル名を指定して下さい     
  Do Until EOF(1)
    Line Input #1, dat
    dat = StrConv(dat, vbFromUnicode)
    idx = 0
    jdx = 1
    Do While idx <= UBound(mnum)
     csv(idx + 1) = StrConv(MidB(dat, jdx, mnum(idx)), vbUnicode)
     jdx = jdx + mnum(idx)
     idx = idx + 1
     Loop
    MsgBox Join(csv(), ",")
   
    Print #2, Join(csv(), ",")
    Loop
  Close #1, #2
End Sub

試してみて下さい。


ハトさん、こんばんは。
質問(初心者A氏)さんは、ユーザー定義型を使用したいみたいなので

>
>Type T_DATA
>  f1 As String * 10 ’バイト単位での処理のため
>  f2 As String * 10 ’日本語(全角文字)の場合は文字数の2倍にする
>  f3 As String * 10 
>  f4 As String * 10 
>  DMY As String * 2 ’←改行文字がある場合に必要
>End Type
>
>Sub RD_TXT()
>
>Dim RData As T_DATA
>Dim FName
>Dim i As Long
>
>  i = 0
>'  FName = "C:\xxxxxx\xxxx\xxxx.txt"
>  'ファイル選択ダイアログを開きファイル名を取得
>  FName = Application.GetOpenFilename("ファイル (*.*),*.*")
>
>  'キャンセルを選択?
>  If FName = False Then Exit Sub
>  
>  'ファイルオープン
>  Open FName For Binary As #1
>
>  Get #1, , RData
>  Do While Not EOF(1)
'これだと仮に一行のみのファイルだと何も処理しないで終わってしまいますよ!!
>    i = i + 1
>    With ThisWorkbook.Worksheets("Sheet4")
>      .Cells(i, 1) = RData.f1
>      .Cells(i, 2) = RData.f2
>      .Cells(i, 3) = RData.f3
>      .Cells(i, 4) = RData.f4
>    End With
>'    Get #1, , BRec
>    Get #1, , RData
>  Loop
>  
>  Close #1
>
>End Sub

気になったので投稿しました。
修正はおまかせします。

【40914】Re:テキストデータの読込み後の処理に関...
お礼  質問(初心者A氏)  - 06/7/26(水) 9:14 -

引用なし
パスワード
   試してみます。
ありがとうございました。

【40920】Re:テキストデータの読込み後の処理に関...
発言  ハト  - 06/7/26(水) 11:13 -

引用なし
パスワード
   おはようございます

ichinose さん、ご指摘ありがとうございます
自分の思慮不足を痛感いたしました

EOFがTrueとなるのは[EOF]を読み込んだ時ですので
TXTファイルの最後の1行の形式が

パターン1
AxBBxCxDx[改行]
AyBByCyDy[改行]
[EOF]

パターン2
AxBBxCxDx[改行]
AyBByCyDy[EOF]

のどちらになっているかで処理を変えないといけませんでした

パターン1の場合

  Get #1, , RData
  Do While Not EOF(1)

    [処理]

    Get #1, , RData
  Loop

これなら1行しかなくても処理されます
しかし、パターン2の形式だとご指摘のように最後の1行が処理されなくなります

パターン2の場合

  Do While Not EOF(1)
    Get #1, , RData

    [処理]

  Loop

のようにする必要があります

この場合、パターン1のデータだと
最後に空データで1回処理されてしまいます


私はパターン1のケースだと思い込んでいました
申し訳ありませんでした

質問(初心者A氏)さん
TXTファイルの形式によって処理の変更をお願いいたします

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