Excel VBA質問箱 IV

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

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


3728 / 13645 ツリー ←次へ | 前へ→

【60410】複数のCSVのデータを読込で代入したい 初VBA 09/2/20(金) 11:22 質問[未読]
【60413】Re:複数のCSVのデータを読込で代入したい トト 09/2/20(金) 13:39 発言[未読]
【60419】Re:複数のCSVのデータを読込で代入したい 初VBA 09/2/20(金) 17:19 質問[未読]
【60420】Re:複数のCSVのデータを読込で代入したい トト 09/2/20(金) 18:18 発言[未読]
【60421】Re:複数のCSVのデータを読込で代入したい 初VBA 09/2/20(金) 19:02 質問[未読]
【60435】Re:複数のCSVのデータを読込で代入したい トト 09/2/21(土) 10:17 発言[未読]
【60452】Re:複数のCSVのデータを読込で代入したい 初VBA 09/2/23(月) 11:59 質問[未読]
【60462】Re:複数のCSVのデータを読込で代入したい トト 09/2/23(月) 13:52 発言[未読]
【60481】Re:複数のCSVのデータを読込で代入したい 初VBA 09/2/23(月) 17:24 質問[未読]
【60482】Re:複数のCSVのデータを読込で代入したい トト 09/2/23(月) 17:38 発言[未読]
【60495】Re:複数のCSVのデータを読込で代入したい 初VBA 09/2/24(火) 10:30 質問[未読]
【60496】Re:複数のCSVのデータを読込で代入したい トト 09/2/24(火) 11:30 発言[未読]
【60499】Re:複数のCSVのデータを読込で代入したい 初VBA 09/2/24(火) 17:13 お礼[未読]

【60410】複数のCSVのデータを読込で代入したい
質問  初VBA  - 09/2/20(金) 11:22 -

引用なし
パスワード
   こんにちわ
Excel2003を使っています
知識のある方ご教授願います以下説明文です
C\Dataというフォルダに、CSVファイルが毎日作っています3種類
CSVファイル名は、
 1. A20090219.BB.csv
 2. A20090219.CC.csv 
 3. A20090219.DD.csv  
CSVファイルの内容
 1. 1,11,12,13,〜70
      ↓
   24,11,12,13,〜70
   横70個縦24個カンマで区切られています。
 2.は横70個縦24個カンマで区切られています。
 3.は横70縦2個カンマで区切られています。
それをフォーマット.xlsというExcelファイルのセルに値を入れたい。
  1.の1行を11〜30個→sheet1 B9〜AE9
     31個目〜60個→sheet2 B9〜AE9
     61個目〜70個→sheet3 B9〜K9
  以下24行目    →sheet1 B32〜AE32
     31個目〜60個→sheet2 B32〜AE32
     61個目〜70個→sheet3 B32〜K32 

 2.の値は配列の変数で持ちたい
  1or0なので1だったらこのセルの背景色を赤とかの条件で使用したい。
 3.は1.みたいにセルに代入したい。B33〜sheet3.K34
 1.は読込できましたが、複数のCSV読込がわかりません?
 Dirの使い方とか?
 ファイル名の読込とか(今は固定ファイル読込)
 *読込方法は日付を選択してボタン押します。

 長くなってしまったのでここまでで、どなたか教えてください
 返信は自己都合の為、遅くなるかもしれませんが、
 宜しくお願い致します。
Sub test()
Dim csvFile As String
Dim ch As Integer
Dim csvStr As String
Dim str() As String
Dim i As Integer

csvFile = "C:\DataF\TEST.csv"  ’今は固定
'空いている番号を取得
ch = FreeFile
Open csvFile For Input As #ch
i = 8
Do While Not EOF(ch)
  Line Input #ch, csvStr
  'カンマ区切りで配列に格納
  str = Split(csvStr, ",")
  'セルのレンジを指定して、配列の値をセット長くなるので途中で区切ってる。
  With Worksheets("Sheet1")
    .Cells(i, 1).Value = str(1)
    .Cells(i, 2).Value = str(2)
    .Cells(i, 3).Value = str(3)
  End With
  With Worksheets("Sheet2")
    .Cells(i, 1).Value = str(11)
    .Cells(i, 2).Value = str(12)
    .Cells(i, 3).Value = str(13)   
  End With 
  i = i + 1
Loop
'ファイルクローズ
Close #ch
End Sub   

【60413】Re:複数のCSVのデータを読込で代入したい
発言  トト  - 09/2/20(金) 13:39 -

引用なし
パスワード
   ▼初VBA さん:
> 1.は読込できましたが、複数のCSV読込がわかりません?

ほぼ出来ているようにも見えますが
一応、コードを追加してみました(一部改)
(テストはしてません。ごめんなさい)

Sub test()
Dim csvFile As String
Dim ch As Integer
Dim csvStr As String
Dim str() As String
Dim i As Integer
Dim myLooP As Long   '追加
Dim myDATA(1 To 24, 1 To 70) As String '変数に格納するデータ用


csvFile = "C:\DataF\TEST.csv"  '今は固定
'空いている番号を取得
ch = FreeFile
Open csvFile For Input As #ch
i = 8
Do While Not EOF(ch)
  Line Input #ch, csvStr
  'カンマ区切りで配列に格納
  str = Split(csvStr, ",")
  'セルのレンジを指定して、配列の値をセット長くなるので途中で区切ってる。
'  With Worksheets("Sheet1")
'    .Cells(i, 1).Value = str(1)
'    .Cells(i, 2).Value = str(2)
'    .Cells(i, 3).Value = str(3)
'  End With
'  With Worksheets("Sheet2")
'    .Cells(i, 1).Value = str(11)
'    .Cells(i, 2).Value = str(12)
'    .Cells(i, 3).Value = str(13)
'  End With
  'ちょっと改良?
  For myLooP = 1 To 30
    Worksheets("Sheet1").Cells(i, myLooP) = str(myLooP - 1)
    Worksheets("Sheet2").Cells(i, myLooP) = str(myLooP + 29)
    If myLooP <= 10 Then
      Worksheets("Sheet3").Cells(i, myLooP) = str(myLooP + 59)
    End If
  Next myLooP
  
  i = i + 1
Loop
'ファイルクローズ
Close #ch


'==== 3番目のファイルを取込) =====
csvFile = "C:\DATA\A20090219.DD.csv"
'空いている番号を取得
ch = FreeFile
Open csvFile For Input As #ch
'i = 8   ’上の続きなので設定不要
Do While Not EOF(ch)
  '〜上と同じ処理〜
Loop
'ファイルクローズ
Close #ch


'==== 2番目のファイルを取込) =====
csvFile = "C:\DATA\A20090219.CC.csv"
'空いている番号を取得
ch = FreeFile
Open csvFile For Input As #ch
i = 1
Do While Not EOF(ch)
  Line Input #ch, csvStr
  If i <= 24 Then   '一応
    'カンマ区切りで配列に格納
    str = Split(csvStr, ",")
    For myLooP = 1 To 70
      myDATA(i, myLooP) = str(myLooP - 1)
    Next myLooP
  End If
  i = i + 1
Loop
'ファイルクローズ
Close #ch

End Sub

【60419】Re:複数のCSVのデータを読込で代入したい
質問  初VBA  - 09/2/20(金) 17:19 -

引用なし
パスワード
   トトさん
ご回答ありがとうございます。
重ねて質問で申し訳ありませんが、
配列myDATAの中身1個1個判断し
セル1個1個の背景色(赤)の条件にしたい

If (myDATA(1, 1) = 1) Then
With Range(Cells(8, 1), Cells(8, 1)).Interior
    .ColorIndex = 3
    .Pattern = xlSolid
End With
End If

現在、配列myDATA1(1,1)1個でセル1個判断してます。
上記だと代入したセル全部になるので
ループで一括で判断したい

csvファイルもA20090219.??.CSV
??の部分しか違わないんで一括で読込方法とかありますか?

お手数をお掛けしますが、宜しくお願い致します。

【60420】Re:複数のCSVのデータを読込で代入したい
発言  トト  - 09/2/20(金) 18:18 -

引用なし
パスワード
   ▼初VBA さん:
> ループで一括で判断したい
myDATAは、縦24、横70 を想定しているのは分かりますか?
24 と 70 をループでまわせば良いかと思います。
For i = 1 to 24
  For myLooP = 1 to 70 '??でよい?
    If myDATA(i, myLooP) = 1 Then
      '〜 色変え 〜
    End If
  Next myLooP
Next i
こんな感じです。


> csvファイルもA20090219.??.CSV
> ??の部分しか違わないんで一括で読込方法とかありますか?
ごめんなさい。質問の意味が分かりません。
上のコードは3つのファイルを全て読み込んでいるのですが・・・
(1番目だけ、元のコードを生かす為、ファイル名が違いますが)

何か別の要素があるのでしょうか?

【60421】Re:複数のCSVのデータを読込で代入したい
質問  初VBA  - 09/2/20(金) 19:02 -

引用なし
パスワード
   配列の件は素晴らしい回答ありがとうございます。

読込の件について、
フォルダに1日3種類のcsvファイルができます。
エクセルのフォームで日付を選択したら3種類のcsvファイルの情報を読込たい。

例えば下記を3回定義しないといけないんですか?
一回の定義で3種類のcsvは読込できますか?

'==== 3番目のファイルを取込) =====
csvFile = "C:\DATA\A20090219.DD.csv"
'空いている番号を取得
ch = FreeFile
Open csvFile For Input As #ch
'i = 8   ’上の続きなので設定不要
Do While Not EOF(ch)
  '〜上と同じ処理〜
Loop
'ファイルクローズ
Close #ch

返信は月曜になると思いますが、
来週以降も宜しくお願い致します。

【60435】Re:複数のCSVのデータを読込で代入したい
発言  トト  - 09/2/21(土) 10:17 -

引用なし
パスワード
   ▼初VBA さん:
>読込の件について、
>フォルダに1日3種類のcsvファイルができます。
>エクセルのフォームで日付を選択したら3種類のcsvファイルの情報を読込たい。

>csvFile = "C:\DATA\A20090219.DD.csv"
csvFile = "C:\DATA\A" & Format([日付],"yyyymmdd") & ".DD.csv"
こういうことで良いのでしょうか?

【60452】Re:複数のCSVのデータを読込で代入したい
質問  初VBA  - 09/2/23(月) 11:59 -

引用なし
パスワード
   読込の件、ありがとう御座います。
配列について質問です。
例 入る値は 1 or 0

(1)myDATA(1,1),(2)myDATA(2,1),(3)myDATA(3,1),(4)myDATA(4,1)
(1)or(2)が1だったら
セル(A1,1)の背景赤
(3)or(4)が1だったら
セル(A1,1)の背景黄色
-----------------------------
(1)myDATA(1,2),(2)myDATA(2,2),(3)myDATA(3,2),(4)myDATA(4,2)
(1)or(2)が1だったら
セル(A1,2)の背景赤
(3)or(4)が1だったら
セル(A1,2)の背景黄色
---------------------------
(1)myDATA(5,1),(2)myDATA(6,1),(3)myDATA(7,1),(4)myDATA(8,1)
(1)or(2)が1だったら
セル(A2,1)の背景赤
(3)or(4)が1だったら
セル(A2,1)の背景黄色
----------------------------
のループ処理を教えてください。

【60462】Re:複数のCSVのデータを読込で代入したい
発言  トト  - 09/2/23(月) 13:52 -

引用なし
パスワード
   ▼初VBA さん:
> (1)or(2)が1だったら
> セル(A1,1)の背景赤
> (3)or(4)が1だったら
> セル(A1,1)の背景黄色
(1)が1 かつ(3)が1となるような事は無いのでしょうか?

> セル(A1,1)
> セル(A1,2)
> セル(A2,1)
とは何を指すのでしょうか?(Cell(1,1) ? Range("A1") ?)


上記コード内の変数 myDATA と考えて良いのですよね?
1 to 24 、 1 to 70
での法則性などが提示されてないので、

1 to 24
1〜4は1行目
5〜8は2行目
・・・
21〜24は6行目
(色変えは6行目まで?)

1 to 70 は列番号
1〜30 はSheet1 の A〜AD
31〜60 はSheet2 の A〜AD
61〜70 はSheet3 の A〜J
と勝手に判断させていただきます。

【60420】にて書いた
> For i = 1 to 24
>   For myLooP = 1 to 70 '??でよい?
>     If myDATA(i, myLooP) = 1 Then
>       '〜 色変え 〜
>     End If
>   Next myLooP
> Next i

For i = 1 to 24 Step 4
  For myLooP = 1 to 30
    '判断基準の見直しは必要?
    If myDATA(i, myLooP) = 1 Or myDATA(i + 1, myLooP) = 1 Then
      '〜 色変え 赤 〜
    End If
    If myDATA(i + 2, myLooP) = 1 Or myDATA(i + 3, myLooP) = 1 Then
      '〜 色変え 黄 〜
    End If
  Next myLooP
Next i
と出来るかと思います。

Sheet1 〜 3 へ分割する方法は【60413】のコード内に示していますので、
参考にして下さい。
上記 myLooP = 1 to 30 〜 Next myLooP の後に
myLooP = 31 to 60 〜 Next myLooPと続けても良いかと思います。

【60481】Re:複数のCSVのデータを読込で代入したい
質問  初VBA  - 09/2/23(月) 17:24 -

引用なし
パスワード
   ▼トト さん:

>1 to 24
>1〜4は1行目
>5〜8は2行目
>・・・
>21〜24は6行目
>(色変えは6行目まで?)
>
>1 to 70 は列番号
>1〜30 はSheet1 の A〜AD
>31〜60 はSheet2 の A〜AD
>61〜70 はSheet3 の A〜J
>と勝手に判断させていただきます。
>

先程の質問説明不足で申し訳ありません。
配列の法則性等の解釈は完璧です。

質問です。
For i = 1 To 24 Step 4
  For myLooP = 1 To 30

    If myDATA(i, myLooP) = "1" Or myDATA(i + 1, myLooP) = "1" Then
      Worksheets("Sheet1").Cells(i, myLooP).Select
       With Selection.Interior
        .ColorIndex = 6
        .Pattern = xlSolid
       End With
    End If
    
    If myDATA(i + 2, myLooP) = "1" Or myDATA(i + 3, myLooP) = "1" Then
      Worksheets("Sheet1").Cells(i, myLooP).Select
        With Selection.Interior
        .ColorIndex = 3
        .Pattern = xlSolid
        End With
    End If
    
  Next myLooP
Next i

上記のコードだと1行、5行、9行の背景色が変わります。
iが1,5,9と増える為、色々試してみましたが・・
1行〜6行まで連番にするにはどうすればいいですか?
宜しくお願いします。

【60482】Re:複数のCSVのデータを読込で代入したい
発言  トト  - 09/2/23(月) 17:38 -

引用なし
パスワード
   ▼初VBA さん:
>1 to 24
>1〜4は1行目
>5〜8は2行目
>・・・
>21〜24は6行目
この形にする、ということですよね。

私の場合、エクセルに1〜24まで並べて、
その隣に色々式を入れてみて試していきます。

この場合、
行 = Int((i - 1) / 4) + 1
として求める事が出来るかと思います。

【60495】Re:複数のCSVのデータを読込で代入したい
質問  初VBA  - 09/2/24(火) 10:30 -

引用なし
パスワード
   ▼トト さん:

>For i = 1 to 24 Step 4
>  For myLooP = 1 to 30
>    '判断基準の見直しは必要?
>    If myDATA(i, myLooP) = 1 Or myDATA(i + 1, myLooP) = 1 Then
>      '〜 色変え 赤 〜
>    End If
>    If myDATA(i + 2, myLooP) = 1 Or myDATA(i + 3, myLooP) = 1 Then
>      '〜 色変え 黄 〜
>    End If
>  Next myLooP
>Next i
>と出来るかと思います。
>
>Sheet1 〜 3 へ分割する方法は【60413】のコード内に示していますので、
>参考にして下さい。
>上記 myLooP = 1 to 30 〜 Next myLooP の後に
>myLooP = 31 to 60 〜 Next myLooPと続けても良いかと思います。

今までのご教授ありがとうございました。
やりたい事がなんとかできました。

>上記 myLooP = 1 to 30 〜 Next myLooP の後に
>myLooP = 31 to 60 〜 Next myLooPと続けても良いかと思います。
の件につきまして、質問なんですが、

myLooP = 31 to 60 〜 Next myLooPを、myLooP = 1 to 30 〜 Next myLooP の下
に入れると、
For文で指定された変数は既に使用されています。とコンパイルエラーがでます。
myLooP = 1 to 30 〜 Next myLooP の中には挿入できないんですか?

【60496】Re:複数のCSVのデータを読込で代入したい
発言  トト  - 09/2/24(火) 11:30 -

引用なし
パスワード
   ▼初VBA さん:
>myLooP = 1 to 30 〜 Next myLooP の中には挿入できないんですか?

はい。残念ながら「中」に入れる事はできません。
For myLooP = 1 To 30
  For myLooP = 31 To 60
    '〜処理など
  Next myLooP
Next myLooP
このような記述ではエラーになります。
中に入れる場合は「i」など他の変数を利用しなければなりません。

次のように「後」に続けて下さい
For myLooP = 1 To 30
  '〜処理など
Next myLooP
For myLooP = 31 To 60
  '〜処理など
Next myLooP

【60499】Re:複数のCSVのデータを読込で代入したい
お礼  初VBA  - 09/2/24(火) 17:13 -

引用なし
パスワード
   誤って消してしまったのでもう一度お礼申し上げます。

今まで親切に、ご教授有難うございます。
エクセルマクロは初めてだったので、
質問も言葉足らずな説明になり申し訳ありませんでした。

これからも VBA質問箱を使う、予定なので、
”初VBA”を見かけたら、宜しくお願い致します。

本当にどうも有難う御座いました。

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