Excel VBA質問箱 IV

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

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


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

【22176】csvファイルから、カンマの数を得る。 Aiz 05/2/10(木) 15:35 質問[未読]
【22179】Re:csvファイルから、カンマの数を得る。 Jaka 05/2/10(木) 16:02 回答[未読]
【22186】Re:csvファイルから、カンマの数を得る。 Jaka 05/2/10(木) 16:39 回答[未読]
【22194】Re:csvファイルから、カンマの数を得る。 Aiz 05/2/10(木) 17:38 お礼[未読]
【22193】Re:csvファイルから、カンマの数を得る。 りすりす 05/2/10(木) 17:29 発言[未読]
【22195】Re:csvファイルから、カンマの数を得る。 Aiz 05/2/10(木) 17:44 発言[未読]
【22197】Re:csvファイルから、カンマの数を得る。 Hirofumi 05/2/10(木) 18:55 発言[未読]
【22210】Re:csvファイルから、カンマの数を得る。 sa 05/2/11(金) 16:45 発言[未読]
【22265】Re:csvファイルから、カンマの数を得る。 sa 05/2/14(月) 11:26 発言[未読]

【22176】csvファイルから、カンマの数を得る。
質問  Aiz  - 05/2/10(木) 15:35 -

引用なし
パスワード
   お世話になってます。
csvファイルからデータを読み込んでエクセルファイルに貼り付ける作業をやっていてわからなくなりました。

以下、csvのデータとソースです。
★csvファイル
1,大阪,101,E-6,1234000,5200,52360,125200,45520
2,大阪,102,C-4,2354,2354,2354,2354,2354

★ソース
Const csv1 = "H.csv"
Const csv2 = "B.csv"

Sub Auto_Open()
  Dim fname As String
  Dim fno As Integer
  Dim col(0 To 255) As Variant '<-- 可変のため最大値で設定
  Dim i As Integer
  Dim sts As String
  Dim flg As Integer
  Dim ii As Integer
  
  'ファイル名
  fname1 = ActiveWorkbook.Path & "\" & csv1
  fname2 = ActiveWorkbook.Path & "\" & csv2
  
  'CSVファイルの内容を貼り付ける(ボディ部)
  fno = FreeFile
  On Error GoTo file_not_found
  Open fname2 For Input As #fno
  On Error GoTo 0
  l = 7
  flg = 1 '上段の場合は1をセット。下段の場合は2をセットする。
  Do Until EOF(fno)
    '一旦String型で受けてVariant型に入れなおす
    For i = 0 To 8 ' <-- (1)
      Input #fno, sts '↑今までは1件のデータの長さが固定だったから数字を指定できた。
      col(i) = sts
    Next
    
    l = l + 1
    Range(Cells(l, 1), Cells(l, 9)).Value = col
  Loop
  Close #fno
  
  'オートフォーマット
  Cells(7, 1).CurrentRegion.AutoFormat _
    Format:=xlRangeAutoFormatLocalFormat3, _
    Number:=False, _
    Font:=False, _
    Alignment:=False
  
  Exit Sub
file_not_found:
  MsgBox "CSVファイルが見つかりません", vbCritical + vbOKOnly, "システムエラー"
End Sub

今まではcsvの1件の長さが決まっていたため(1)の部分は8のように値を固定できていたんですが、csvによっては(1)の部分が変動するため固定値を設定することができなくなりました。
それでまず1.の部分に変数をセットし、csvの1件のデータを読んでカンマの数を数えて、(1)の部分の変数に値をセットしようと思っているのですが、1行を読み込んでカンマの数を数えるというやりかたがわかりません。

どなたか助言をお願いします。
説明が下手で申し訳ありません。説明不足なら言ってください。
よろしくお願いします。

【22179】Re:csvファイルから、カンマの数を得る。
回答  Jaka  - 05/2/10(木) 16:02 -

引用なし
パスワード
   こんにちは。

>それでまず1.の部分に変数をセットし、csvの1件のデータを読んでカンマの数を数えて、(1)の部分の変数に値をセットしようと思っているのですが、1行を読み込んでカンマの数を数えるというやりかたがわかりません。

厳密にやると大変ですよ。
ここ見てみてね。
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=4512;id=excel

他、Hirofumiさんも似たようなやっていたような記憶が...。
探せませんでした。

【22186】Re:csvファイルから、カンマの数を得る。
回答  Jaka  - 05/2/10(木) 16:39 -

引用なし
パスワード
   Line inputで、変数に1行読み込んでクローズ。
その変数の1文字ずつチェックの簡単で良いと思います。
(ダブルクォーテーションが入っていなければ)


Line Input #1, stst
Close #1

こんなデータだとして
stst = "1,大阪,101,E-6,1234000,5200,52360,125200,45520"

CC = 0
For i = 1 To Len(stst)
  If Mid(stst, i, 1) = "," Then
    CC = CC + 1
  End If
Next
MsgBox CC

【22193】Re:csvファイルから、カンマの数を得る。
発言  りすりす  - 05/2/10(木) 17:29 -

引用なし
パスワード
   行ごと読み込んで
LBound
UBound
Split(, ",")
つかえば簡単だと思いますが

Private Sub CommandButton1_Click()

 Dim s, r As String
 Dim St As Variant
 Dim i As Long
  
 s = " w,w,w,wwww"
 St = Split(s, ",")
' MsgBox IsArray(St)
 r = ""
 For i = LBound(St) To UBound(St)
  r = r + St(i) + vbCrLf
 Next
  MsgBox r
End Sub


先月作った
ごちゃごちゃしたコードでなら
""対応のもっていますけど
直接文字をきりぬいて、文字を返すので
使い方が ちょっと難しいんでヘ(^o^)/
今回は だしおしみです。

splitと同じように配列で返すような機能に改良してもいいんですけどね・・・

【22194】Re:csvファイルから、カンマの数を得る。
お礼  Aiz  - 05/2/10(木) 17:38 -

引用なし
パスワード
   ▼Jaka さん:
ホントに毎度毎度ありがとうございます。
CSVのデータには""が入っていなかったので、教えて頂いたLine inputのでやることにしました。
おかげで助かりました。ありがとうございます。

【22195】Re:csvファイルから、カンマの数を得る。
発言  Aiz  - 05/2/10(木) 17:44 -

引用なし
パスワード
   ▼りすりす さん:
>行ごと読み込んで
> LBound
> UBound
> Split(, ",")
>つかえば簡単だと思いますが

自分で調べててSplitやLBound使う案もあったんですが、いまいち使い方がわからなくて、JakaさんのLine inputの案を使うことにしました^^;
csvデータに""が入ったのはないんでいいんですが(今のとこはですが)、""の入ったのがでてきたときが恐怖ですね^^;

ご助言ありがとうございます(´∀`)

【22197】Re:csvファイルから、カンマの数を得る。
発言  Hirofumi  - 05/2/10(木) 18:55 -

引用なし
パスワード
   解決しているみたいだけど?
ダブルクォーツで、括られたフィールドを読み込むコードの例です

http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=17643;id=excel

【22210】Re:csvファイルから、カンマの数を得る。
発言  sa  - 05/2/11(金) 16:45 -

引用なし
パスワード
   すみませんいきなり
>    For i = 0 To 8 ' <-- (1)
>      Input #fno, sts '↑今までは1件のデータの長さが固定だったから数字を指定できた。
>      col(i) = sts
>    Next

のところ
    Dim col As Variant ’←に変更

    Line Input #fno, sts
    col = Split(sts,",") ’ split関数でcolの配列にstsのカンマ区切ってデータを入れます
   
    Ubound(col)
   すれば、col配列の 最大の係数が判るので
   それを使えばうまくいけませんか?


▼Aiz さん:
>お世話になってます。
>csvファイルからデータを読み込んでエクセルファイルに貼り付ける作業をやっていてわからなくなりました。
>
>以下、csvのデータとソースです。
>★csvファイル
>1,大阪,101,E-6,1234000,5200,52360,125200,45520
>2,大阪,102,C-4,2354,2354,2354,2354,2354
>
>★ソース
>Const csv1 = "H.csv"
>Const csv2 = "B.csv"
>
>Sub Auto_Open()
>  Dim fname As String
>  Dim fno As Integer
>  Dim col(0 To 255) As Variant '<-- 可変のため最大値で設定
>  Dim i As Integer
>  Dim sts As String
>  Dim flg As Integer
>  Dim ii As Integer
>  
>  'ファイル名
>  fname1 = ActiveWorkbook.Path & "\" & csv1
>  fname2 = ActiveWorkbook.Path & "\" & csv2
>  
>  'CSVファイルの内容を貼り付ける(ボディ部)
>  fno = FreeFile
>  On Error GoTo file_not_found
>  Open fname2 For Input As #fno
>  On Error GoTo 0
>  l = 7
>  flg = 1 '上段の場合は1をセット。下段の場合は2をセットする。
>  Do Until EOF(fno)
>    '一旦String型で受けてVariant型に入れなおす
>    For i = 0 To 8 ' <-- (1)
>      Input #fno, sts '↑今までは1件のデータの長さが固定だったから数字を指定できた。
>      col(i) = sts
>    Next
>    
>    l = l + 1
>    Range(Cells(l, 1), Cells(l, 9)).Value = col
>  Loop
>  Close #fno
>  
>  'オートフォーマット
>  Cells(7, 1).CurrentRegion.AutoFormat _
>    Format:=xlRangeAutoFormatLocalFormat3, _
>    Number:=False, _
>    Font:=False, _
>    Alignment:=False
>  
>  Exit Sub
>file_not_found:
>  MsgBox "CSVファイルが見つかりません", vbCritical + vbOKOnly, "システムエラー"
>End Sub
>
>今まではcsvの1件の長さが決まっていたため(1)の部分は8のように値を固定できていたんですが、csvによっては(1)の部分が変動するため固定値を設定することができなくなりました。
>それでまず1.の部分に変数をセットし、csvの1件のデータを読んでカンマの数を数えて、(1)の部分の変数に値をセットしようと思っているのですが、1行を読み込んでカンマの数を数えるというやりかたがわかりません。
>
>どなたか助言をお願いします。
>説明が下手で申し訳ありません。説明不足なら言ってください。
>よろしくお願いします。

【22265】Re:csvファイルから、カンマの数を得る。
発言  sa  - 05/2/14(月) 11:26 -

引用なし
パスワード
   りすりすさん と
かぶっていましたね
すみませんでした

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