Excel VBA質問箱 IV

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

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


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

【64820】CSVの取込について たつ 10/3/16(火) 13:49 質問[未読]
【64822】Re:CSVの取込について 超初心者 10/3/16(火) 16:14 発言[未読]
【64824】Re:CSVの取込について たつ 10/3/16(火) 16:48 質問[未読]
【64825】Re:CSVの取込について 超初心者 10/3/16(火) 17:49 発言[未読]
【64832】Re:CSVの取込について たつ 10/3/17(水) 16:21 お礼[未読]
【64823】Re:CSVの取込について 超初心者 10/3/16(火) 16:44 発言[未読]
【64839】Re:CSVの取込について たつ 10/3/18(木) 13:06 質問[未読]
【64841】Re:CSVの取込について 超初心者 10/3/18(木) 13:45 発言[未読]
【64843】Re:CSVの取込について たつ 10/3/18(木) 14:06 質問[未読]
【64844】Re:CSVの取込について 超初心者 10/3/18(木) 14:20 発言[未読]
【64847】Re:CSVの取込について たつ 10/3/18(木) 15:43 お礼[未読]

【64820】CSVの取込について
質問  たつ  - 10/3/16(火) 13:49 -

引用なし
パスワード
   6万件以上のCSVデータをエクセルへ出力するようにマクロを組みました

2列目のデータをキーにして、
2列目のデータが1から始まるものをシート【1】へ・・・
2から始まるものをシート【2】へ・・・
その他はシート【その他】へと
データをシート別に振り分けています
各シートの1行目を項目にしたいのですが、そのやり方がいまいちわからず困ってます
どのように作成したらよいのでしょうか?
どうかアドバイスをお願いします

Sub test()

Dim Mystring As String
Dim MyVar As Variant
Dim MaxR As Long

Const MyFile As String = "C:TEST\集計.csv"

Open MyFile For Input Access Read As #1

i = 1

While Not EOF(1)
Line Input #1, Mystring
Mystring = Replace(Mystring, """", "")

MyVar = Split(Mystring, ",")
If MyVar(1) Like "1*" Then
  Sheets("1").Activate
  MaxR = Range("K" & Rows.Count).End(xlUp).Row
  For q = 0 To UBound(MyVar)
    ActiveSheet.Cells(MaxR + 1, (q + 1)) = MyVar(q)
  Next q
ElseIf MyVar(1) Like "2*" Then
  Sheets("2").Activate
  MaxR = Range("K" & Rows.Count).End(xlUp).Row
  For q = 0 To UBound(MyVar)
    ActiveSheet.Cells(MaxR + 1, (q + 1)) = MyVar(q)
  Next q
Else
  Sheets("その他").Activate
  MaxR = Range("K" & Rows.Count).End(xlUp).Row

  For q = 0 To UBound(MyVar)
  ActiveSheet.Cells(MaxR + 1, (q + 1)) = MyVar(q)
  Next q
End If
 
Wend

Close #1

End Sub

【64822】Re:CSVの取込について
発言  超初心者  - 10/3/16(火) 16:14 -

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

最初に入れてしまってはいかがでしょう。

Dim myHedF As Boolean

myHedF = True

> 〜

> Line Input #1, Mystring
> Mystring = Replace(Mystring, """", "")

> MyVar = Split(Mystring, ",")

If myHedF Then
  Sheets(Array("1", "2", "その他")).Select
  For q = 0 To UBound(myVar)
    Cells(MaxR + 1, (q + 1)).Activate
    ActiveCell.Value = myVar(q)
  Next q
  myHedF = False
End If

> 〜


こんな感じで。

【64823】Re:CSVの取込について
発言  超初心者  - 10/3/16(火) 16:44 -

引用なし
パスワード
   ▼たつ さん:
>6万件以上のCSVデータをエクセルへ出力するようにマクロを組みました

件数が多いようなので、余計な事とは思いつつ、
DAOを使ってみてはいかがかと思い、作ってみました。

'要参照設定「Microsoft DAO X.X Object Library」
Sub test_sample()
  Dim myDB As DAO.Database
  Dim myRS As DAO.Recordset
  Dim mySQL As String
  Dim myPath As String
  Dim myCsvNM As String
  Dim myField() As String
  Dim myLoop As Long
  
  myPath = "C:TEST"
  myCsvNM = "集計.csv"
  
  Set myDB = DBEngine.Workspaces(0).OpenDatabase(myPath, False, False, "Text;HDR=YES;")
  
  '項目名取得
  mySQL = "SELECT * FROM " & myCsvNM
  Set myRS = myDB.OpenRecordset(mySQL, dbOpenSnapshot)
  For myLoop = 1 To myRS.Fields.Count
    ReDim Preserve myField(1 To 1, 1 To myLoop)
    myField(1, myLoop) = myRS(myLoop - 1).Name
  Next myLoop
  Set myRS = Nothing
  
  '出力x3
  mySQL = "SELECT * FROM " & myCsvNM & " WHERE [" & myField(1, 2) & "] Like '1*' "
  Set myRS = myDB.OpenRecordset(mySQL, dbOpenSnapshot)
  With Sheets("1")
    .Range(.Cells(1, 1), .Cells(1, UBound(myField, 2))).Value = myField
    .Range("A2").CopyFromRecordset myRS
  End With
  Set myRS = Nothing
  
  mySQL = "SELECT * FROM " & myCsvNM & " WHERE [" & myField(1, 2) & "] Like '2*' "
  Set myRS = myDB.OpenRecordset(mySQL, dbOpenSnapshot)
  With Sheets("2")
    .Range(.Cells(1, 1), .Cells(1, UBound(myField, 2))).Value = myField
    .Range("A2").CopyFromRecordset myRS
  End With
  Set myRS = Nothing
  
  mySQL = "SELECT * FROM " & myCsvNM & " WHERE [" & myField(1, 2) & "] Not Like '1*'" & _
      " And [" & myField(1, 2) & "] Not Like '2*' "
  Set myRS = myDB.OpenRecordset(mySQL, dbOpenSnapshot)
  With Sheets("その他")
    .Range(.Cells(1, 1), .Cells(1, UBound(myField, 2))).Value = myField
    .Range("A2").CopyFromRecordset myRS
  End With
  Set myRS = Nothing
  
  Set myDB = Nothing
End Sub

半分、私の"自己満足"なので、不要ならスルーして下さい^^;

【64824】Re:CSVの取込について
質問  たつ  - 10/3/16(火) 16:48 -

引用なし
パスワード
   ▼超初心者 さん:

>最初に入れてしまってはいかがでしょう。

シート数が決まってないため、
例えば、シート【1】のデータが結果的に6万件以上ある場合があると、シート【1】をシート追加させようと考えてもいます。

この場合の対処はどうしたらよいのでしょうか?

何度もすみませんがよろしくお願いします


>
>Dim myHedF As Boolean
>
>myHedF = True
>
>> 〜
>
>> Line Input #1, Mystring
>> Mystring = Replace(Mystring, """", "")
>
>> MyVar = Split(Mystring, ",")
>
>If myHedF Then
>  Sheets(Array("1", "2", "その他")).Select
>  For q = 0 To UBound(myVar)
>    Cells(MaxR + 1, (q + 1)).Activate
>    ActiveCell.Value = myVar(q)
>  Next q
>  myHedF = False
>End If
>
>> 〜
>
>
>こんな感じで。

【64825】Re:CSVの取込について
発言  超初心者  - 10/3/16(火) 17:49 -

引用なし
パスワード
   ▼たつ さん:
>▼超初心者 さん:
>
>>最初に入れてしまってはいかがでしょう。
>↑
>シート数が決まってないため、
>例えば、シート【1】のデータが結果的に6万件以上ある場合があると、シート【1】をシート追加させようと考えてもいます。
>
>この場合の対処はどうしたらよいのでしょうか?

それでは、別途、ヘッダー情報保管用の変数を作り、
それに格納しておくのは如何でしょう。

「MaxR = 1 」の場合にヘッダー挿入。とか。

【64832】Re:CSVの取込について
お礼  たつ  - 10/3/17(水) 16:21 -

引用なし
パスワード
   ▼超初心者 さん:

いろいろあどばいすありがとうございました

超初心者さんが作ってくれたプログラムはうまく活用することができました

本当に助かりました

ありがとうございます

【64839】Re:CSVの取込について
質問  たつ  - 10/3/18(木) 13:06 -

引用なし
パスワード
   ▼超初心者 さん:

二つの条件をつけるにはどうしたらよいのでしょうか?

>  mySQL = "SELECT * FROM " & myCsvNM & " WHERE [" & myField(1, 2) & "] Like '1*' "
>  Set myRS = myDB.OpenRecordset(mySQL, dbOpenSnapshot)
>  With Sheets("1")
>    .Range(.Cells(1, 1), .Cells(1, UBound(myField, 2))).Value = myField
>    .Range("A2").CopyFromRecordset myRS
>  End With
>  Set myRS = Nothing

↑ここの部分を
下記のように変えてみましたが、型が一致しませんと表示されます
今の条件にもう一つ、フィールド4が空白のものを抽出したいのです

mySQL = "SELECT * FROM " & myCsvNM & " WHERE [" & myField(1, 2) & "] Like '1*' " And "SELECT * FROM " & myCsvNM & " WHERE [" & myField(1, 4) & "] ="""

何がどこが間違っているのか教えていただけるとありがたいです
お願いします

【64841】Re:CSVの取込について
発言  超初心者  - 10/3/18(木) 13:45 -

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

mySQL = "SELECT * FROM " & myCsvNM & " WHERE " & _
    "[" & myField(1, 2) & "] Like '1*' Or " & _
    "[" & myField(1, 4) & "] ="""

こんな感じです。

> "[" & myField(1, 2) & "] Like '1*' Or " & _

 "[" & myField(1, 2) & "] Like '1*' And " & _
かも?


こういったところを見ておくと良いかもです。
h t t p ://sql.1keydata.com/jp/sql-where.php

【64843】Re:CSVの取込について
質問  たつ  - 10/3/18(木) 14:06 -

引用なし
パスワード
   ▼超初心者 さん:

ありがとうございます
下記のように作成してみたところ、
構文エラーとなってしまいます
次のコードのところ【Set myRS = myDB.OpenRecordset(mySQL, dbOpenSnapshot)】
で構文エラーとなってしまいます

何度もすみませんが、原因がいまいちわかっていません
なんでエラーになってしまうのでしょうか?

>mySQL = "SELECT * FROM " & myCsvNM & " WHERE " & _
>    "[" & myField(1, 2) & "] Like '1*' Or " & _
>    "[" & myField(1, 4) & "] ="""
>
>こんな感じです。
>
>> "[" & myField(1, 2) & "] Like '1*' Or " & _
>は
> "[" & myField(1, 2) & "] Like '1*' And " & _
>かも?
>
>
>こういったところを見ておくと良いかもです。
>h t t p ://sql.1keydata.com/jp/sql-where.php

【64844】Re:CSVの取込について
発言  超初心者  - 10/3/18(木) 14:20 -

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

失礼しました。

mySQL = "SELECT * FROM " & myCsvNM & " WHERE " & _
    "[" & myField(1, 2) & "] Like '1*' Or " & _
    "[" & myField(1, 4) & "] ="""""

最後のダブルクォーテーションの数が不足していたようです^^;

【64847】Re:CSVの取込について
お礼  たつ  - 10/3/18(木) 15:43 -

引用なし
パスワード
   ▼超初心者 さん:

ありがとうございました
下記のように最後に""""とつけてやってみましたが、どうもうまく空白だけを抽出することができず、なぜなのか分からないです。
なんとか試行錯誤して、
「Is Null」をつけてやってみたところ思い通りに動きました。


mySQL = "SELECT * FROM " & myCsvNM & " WHERE " & _
    "[" & myField(1, 2) & "] Like '1*' And " & _
    "[" & myField(1, 4) & "] is null"

いろいろとアドバイスありがとうございました

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