Excel VBA質問箱 IV

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

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


6560 / 13644 ツリー ←次へ | 前へ→

【44554】CSVの30個のカンマ ポンポコリン 06/11/21(火) 19:07 質問[未読]
【44558】Re:CSVの30個のカンマ neptune 06/11/21(火) 20:03 回答[未読]
【44563】Re:CSVの30個のカンマ ポンポコリン 06/11/21(火) 21:58 お礼[未読]

【44554】CSVの30個のカンマ
質問  ポンポコリン  - 06/11/21(火) 19:07 -

引用なし
パスワード
   お願い致します。
vba初心者です。

以下のvbaのコードがあるのですが、
選択したCSVファイルのカンマの数を数えて
1レコードに30個カンマが無い場合は
異常CSVなのでメッセージボックスにて
エラーとしたいのですが、現状、マクロエラーとなります。
どう修正して良いのかわかりません。

どなたかご教授下さい。

-----正常CSVデータ----------------------------------------
0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0 ←正常
0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0 ←正常

-----異常CSVデータ----------------------------------------
0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0 ←正常
0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0 ←正常
0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9 ←異常

-----コード-----------------------------------------------
Sub testCSV取込()
 
  Dim FSO As Object, MyCSV As Object
  Dim MyF As String, Buf As String
  Dim GetR As Long, Flg As Long
  Dim i As Long, Acnt As Long, Ucnt As Long, Dcnt As Long
  Dim Ary As Variant
 
  With Application
   MyF = .GetOpenFilename("CSVファイル(*.csv),*.csv")
   
   If MyF = "False" Then
     Exit Sub
    Else
     .ScreenUpdating = False
   End If
   
  End With
 
  Set FSO = CreateObject("Scripting.FileSystemObject")
 
  GetR = FSO.OpenTextFile(MyF, 8).Line
 
  If GetR = 1 Then
   
   MsgBox "ファイルにデータが存在しません。", 48
   Set FSO = Nothing: Application.ScreenUpdating = True
   Exit Sub
 
  End If
 
  Worksheets("Sheet1").Activate:
 
  Range("A2:K2").Select
  Range(Selection, Selection.End(xlDown)).Select
  Selection.ClearContents
 
  Set MyCSV = FSO.OpenTextFile(MyF, 1)
 
  i = 1
  Acnt = 0
  Ucnt = 0
  Dcnt = 0
  Flg = 0
  Do Until MyCSV.AtEndOfStream
   
   Buf = MyCSV.ReadLine
   Ary = Split(Buf, ",")
   
   If Ary(0) = "D07" Then
    If Ary(1) = "A" Or Ary(1) = "U" Or Ary(1) = "D" Then
      Flg = 1
      i = i + 1
      Select Case Ary(1)
          Case "A":
             Acnt = Acnt + 1
          Case "U":
             Ucnt = Ucnt + 1
          Case "D":
             Dcnt = Dcnt + 1
      End Select
      If Ary(9) = 1 Then
        Ary(9) = "有"
       Else
        Ary(9) = ""
      End If
      If Ary(12) = 1 Then
        Ary(12) = "有"
       Else
        Ary(12) = ""
      End If
      If Ary(15) = 1 Then
        Ary(15) = "有"
       Else
        Ary(15) = ""
      End If
      If Ary(18) = 1 Then
        Ary(18) = "有"
       Else
        Ary(18) = ""
      End If
      If Ary(21) = 1 Then
        Ary(21) = "有"
       Else
        Ary(21) = ""
      End If
      If Ary(24) = 1 Then
        Ary(24) = "有"
       Else
        Ary(24) = ""
      End If
      If Ary(27) = 1 Then
        Ary(27) = "有"
       Else
        Ary(27) = ""
      End If
      If Ary(30) = 1 Then
        Ary(30) = "有"
       Else
        Ary(30) = ""
      End If
      Cells(i, 1).Resize(, 11).Value = _
      Array(Ary(2), Ary(3), Ary(1), Ary(9), _
         Ary(12), Ary(15), Ary(18), _
         Ary(21), _
         Ary(24), Ary(27), Ary(30))
    End If
   End If
   Erase Ary
  Loop
 
  MyCSV.Close: Set MyCSV = Nothing
 
  If Flg = 1 Then
   i = i - 1
   MsgBox "追加(A)データは【" & Acnt & "】件です。" & Chr(13) & _
       "更新(U)データは【" & Ucnt & "】件です。" & Chr(13) & _
       "削除(D)データは【" & Dcnt & "】件です。" & Chr(13) & Chr(13) & _
       "データ抽出総件数は【" & i & "】件です。", 64
   
   MsgBox "データの抽出を終了しました。", 64
   Else
   MsgBox "対象データは存在しませんでした。", 64
  End If
End Sub

【44558】Re:CSVの30個のカンマ
回答  neptune  - 06/11/21(火) 20:03 -

引用なし
パスワード
   ▼ポンポコリン さん:
こんにちは
> Dim Ary As Variant

Dim Ary() As string
に変更
>  Do Until MyCSV.AtEndOfStream
>   
>   Buf = MyCSV.ReadLine
erase ary
>   Ary = Split(Buf, ",")

if ubound(a)<31 then
  msgbox "カンマ30個未満"
  30個未満の時にする処理
end if

でどうでしょう?

【44563】Re:CSVの30個のカンマ
お礼  ポンポコリン  - 06/11/21(火) 21:58 -

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

こんばんわです。

思う通りに処理できました。

ありがとうございますです。

一点だけ質問です。
以下は⇒で宜しいですよね?
型が違いますと実行エラーが出ましたので、
私の方で色々と試してみました。
もし間違っていましたらツッコミを入れて下さい。

本当に助かりました、ありがとうございました。

>if ubound(a)<31 then
⇒if ubound(Ary)<31 then

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