Excel VBA質問箱 IV

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

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


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

【46648】CSVファイルでカンマの数を数えたい 質問(煮詰まった) 07/2/9(金) 9:31 質問[未読]
【46650】Re:CSVファイルでカンマの数を数えたい ハチ 07/2/9(金) 9:48 発言[未読]
【46738】Re:CSVファイルでカンマの数を数えたい 質問(煮詰まった) 07/2/13(火) 15:04 お礼[未読]
【46651】Re:CSVファイルでカンマの数を数えたい Jaka 07/2/9(金) 11:33 発言[未読]
【46658】Re:CSVファイルでカンマの数を数えたい Hirofumi 07/2/9(金) 20:49 回答[未読]
【46661】Re:CSVファイルでカンマの数を数えたい Hirofumi 07/2/10(土) 0:46 回答[未読]
【46737】Re:CSVファイルでカンマの数を数えたい 質問(煮詰まった) 07/2/13(火) 15:03 お礼[未読]
【46698】Re:CSVファイルでカンマの数を数えたい Kein 07/2/12(月) 15:04 回答[未読]

【46648】CSVファイルでカンマの数を数えたい
質問  質問(煮詰まった)  - 07/2/9(金) 9:31 -

引用なし
パスワード
   教えて下さい。
CSVファイルにおいて、項目中のカンマの数を1行毎に数えて
キーとなる項目1番目とカンマの数を1行毎に
一覧表に集計したいのですが、過去の例を見ても方法が判りません
お手数をお掛け致しますが宜しくお願いします。

1行の項目数は400項目程度ありその数は一律です。
また各行の最後に改行マークがあります。

どうも項目中にカンマが紛れ込んでおり、カンマ数が一定ではない
ための調査をしたく依頼いたしました。

【46650】Re:CSVファイルでカンマの数を数えたい
発言  ハチ  - 07/2/9(金) 9:48 -

引用なし
パスワード
   ▼質問(煮詰まった) さん:
>どうも項目中にカンマが紛れ込んでおり、カンマ数が一定ではない
>ための調査をしたく依頼いたしました。

こういう書き方をすると、作成依頼は云々となりますよ。

元の文字列から,をReplaceで消した文字列を作って
Len(元の文字列)- Len(Replaceした文字列)
で数えられます。

【46651】Re:CSVファイルでカンマの数を数えたい
発言  Jaka  - 07/2/9(金) 11:33 -

引用なし
パスワード
   正確にやるとこんな感じになります。
HTTP://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=6642;id=excel
                            ↑
記事番号に「6642」と打ち込んでもいけます。
また、Hirofumiさんも同じような事をしていたと思うので、「CSV」かなにかで検索すると見つかると思います。

【46658】Re:CSVファイルでカンマの数を数えたい
回答  Hirofumi  - 07/2/9(金) 20:49 -

引用なし
パスワード
   こんなで善いのかな?

Option Explicit

Public Sub DelimCount()

  Dim vntFileName As Variant
  Dim lngRow As Long
  Dim rngResult As Range
  Dim strProm As String

  '出力先頭セル位置を設定(基準セル位置)
  Set rngResult = ActiveSheet.Cells(1, "A")

  '読み込むファイルを取得
  If Not GetReadFile(vntFileName, ThisWorkbook.Path) Then
    strProm = "マクロがキャンセルされました"
    GoTo Wayout
  End If

  '画面更新を停止
  Application.ScreenUpdating = False

  '列見出しを出力
  rngResult.Resize(, 4).Value = Array("Key", "半角カンマ", "全半角カンマ", "区切りのカンマ")
  
  '出力行初期値(基準セル位置からの行Offset)
  lngRow = 1

  'データの読み込み
  CSVRead vntFileName, rngResult, lngRow

  strProm = "処理が完了しました"

Wayout:

  Set rngResult = Nothing

  '画面更新を再開
  Application.ScreenUpdating = True

  MsgBox strProm, vbInformation

End Sub

Private Sub CSVRead(ByVal strFileName As String, _
          ByRef rngWrite As Range, _
          Optional ByRef lngRow As Long = 1, _
          Optional strDelim As String = ",")

  Dim dfn As Integer
  Dim vntField As Variant
  Dim strBuff As String
  Dim blnMulti As Boolean
  Dim strRec As String
  Dim vntResult As Variant
  
  '出力用配列を確保
  ReDim vntResult(3)
  
  'ファイルをOpen
  dfn = FreeFile
  Open strFileName For Input As dfn

  Do Until EOF(dfn)
    '1行読み込み
    Line Input #dfn, strBuff
    '論理レコードに物理レコードを追加
    strRec = strRec & strBuff
    '論理レコードをフィールドに分割
    vntField = SplitCsv(strRec, strDelim, , , blnMulti)
    'フィールド内で改行が有る場合
    If Not blnMulti Then
      'Keyを代入
      vntResult(0) = vntField(0)
      '半角カンマの数を代入
      vntResult(1) = CommaCount(strRec, vbBinaryCompare)
      '全角+半角カンマの数を代入
      vntResult(2) = CommaCount(strRec, vbTextCompare)
      '区切り文字としてのカンマ数を代入
      vntResult(3) = UBound(vntField)
      With rngWrite.Offset(lngRow)
        With .Resize(, UBound(vntResult) + 1)
          'データを出力
          .Value = vntResult
        End With
      End With
      '出力行をインクリメント
      lngRow = lngRow + 1
      strRec = ""
    Else
      'セル内改行として残す場合
      strRec = strRec & vbLf
    End If
  Loop

  Close #dfn

End Sub

Public Function SplitCsv(ByVal strLine As String, _
            Optional strDelimiter As String = ",", _
            Optional strQuote As String = """", _
            Optional strRet As String = vbCrLf, _
            Optional blnMulti As Boolean) As Variant

  Dim i As Long
  Dim lngDPos As Long
  Dim vntData() As Variant
  Dim lngStart As Long
  Dim vntField As Variant
  Dim lngLength As Long

  i = 0
  lngStart = 1
  lngLength = Len(strLine)
  blnMulti = False
  Do
    ReDim Preserve vntData(i)
    If Mid$(strLine, lngStart, 1) <> strQuote Then
      lngDPos = InStr(lngStart, strLine, _
            strDelimiter, vbBinaryCompare)
      If lngDPos > 0 Then
        vntField = Mid$(strLine, lngStart, _
                  lngDPos - lngStart)
        If lngDPos = lngLength Then
          ReDim Preserve vntData(i + 1)
        End If
        lngStart = lngDPos + 1
      Else
        vntField = Mid$(strLine, lngStart)
        lngStart = lngLength + 1
      End If
    Else
      lngStart = lngStart + 1
      Do
        lngDPos = InStr(lngStart, strLine, _
                strQuote, vbBinaryCompare)
        If lngDPos > 0 Then
          vntField = vntField & Mid$(strLine, _
                lngStart, lngDPos - lngStart)
          lngStart = lngDPos + 1
          Select Case Mid$(strLine, lngStart, 1)
            Case ""
              Exit Do
            Case strDelimiter
              lngStart = lngStart + 1
              Exit Do
            Case strQuote
              lngStart = lngStart + 1
              vntField = vntField & strQuote
          End Select
        Else
          blnMulti = True
          vntField = Mid$(strLine, lngStart)
          lngStart = lngLength + 1
          Exit Do
        End If
      Loop
    End If
    vntData(i) = vntField
    vntField = Empty
    i = i + 1
  Loop Until lngLength < lngStart

  SplitCsv = vntData()

End Function

Private Function CommaCount(strValue As String, _
              Optional lngCompare As Long _
                  = vbBinaryCompare) As Long
  Dim i As Long
  Dim lngPos As Long
  Dim lngCount As Long
  
  lngPos = InStr(1, strValue, ",", lngCompare)
  
  Do Until lngPos = 0
    lngCount = lngCount + 1
    i = lngPos
    lngPos = InStr(i + 1, strValue, ",", lngCompare)
  Loop
  
  CommaCount = lngCount

End Function

Public Function GetReadFile(vntFileNames As Variant, _
            Optional strFilePath As String, _
            Optional blnMultiSel As Boolean _
                    = False) As Boolean

  Dim strFilter As String

  'フィルタ文字列を作成
  strFilter = "CSV File (*.csv),*.csv," _
        & "Text File (*.txt),*.txt," _
        & "CSV and Text (*.csv; *.txt),*.csv;*.txt," _
        & "全て (*.*),*.*"
  '読み込むファイルの有るフォルダを指定
  If strFilePath <> "" Then
    'ファイルを開くダイアログ表示ホルダに移動
    ChDrive Left(strFilePath, 1)
    ChDir strFilePath
  End If
  'もし、ディフォルトのファイル名が有る場合
  If vntFileNames <> "" Then
    SendKeys vntFileNames & "{TAB}", False
  End If
  '「ファイルを開く」ダイアログを表示
  vntFileNames _
      = Application.GetOpenFilename(strFilter, 1, , , blnMultiSel)
  If VarType(vntFileNames) = vbBoolean Then
    Exit Function
  End If

  GetReadFile = True

End Function

【46661】Re:CSVファイルでカンマの数を数えたい
回答  Hirofumi  - 07/2/10(土) 0:46 -

引用なし
パスワード
   もし、データが、「 【42104】セル中の文字の置き換え方法での質問(煮詰まった」の

(例)

="AAA1,BBB1,CCC1",="11",="12",="13,A",="99A"\n
="AAA2,BBB2,CCC2",="21",="22",="23,A",="99B"\n

の様なデータで有るならば、"="を""に置き換えなければ上手く行かないかも?
其の場合、「Sub DelimCount()」に以下の部分を追加して下さい

    '論理レコードに物理レコードを追加
    strREC = strREC & strBuff
    '"="を""に置き換え
    strREC = Replace(strREC, "=", "")          '☆追加
    '論理レコードをフィールドに分割
    vntField = SplitCsv(strREC, strDelim, , , blnMulti)
    'フィールド内で改行が有る場合

【46698】Re:CSVファイルでカンマの数を数えたい
回答  Kein  - 07/2/12(月) 15:04 -

引用なし
パスワード
   これでどうかな ?

Sub Check_Comma()
  Dim i As Long
  Dim MyF As String, Buf As String
  Dim Ary As Variant
  Dim RExp As Object, Matches As Object

  MyF = Application _
  .GetOpenFilename("CSVファイル(*.csv),*.csv")
  If MyF = "False" Then Exit Sub
  Range("A:B").ClearContents: i = 1
  Range("A1:B1").Value = Array("項目1", "カンマ数")
  Set RExp = CreateObject("VBScript.RegExp")
  With RExp
   .Pattern = "(,)"
   .Global = True
  End With
  Open MyF For Input Access Read As #1
  Do Until EOF(1)
   Line Input #1, Buf
   Set Matches = RExp.Execute(Buf)
   Ary = Split(Buf, ","): i = i + 1
   Cells(i, 1).Value = Ary(0)
   Cells(i, 2).Value = Matches.Count
   Set Matches = Nothing
  Loop
  Close #1: Set RExp = Nothing
End Sub

【46737】Re:CSVファイルでカンマの数を数えたい
お礼  質問(煮詰まった)  - 07/2/13(火) 15:03 -

引用なし
パスワード
   うまくできました。
ありがとうございました。

【46738】Re:CSVファイルでカンマの数を数えたい
お礼  質問(煮詰まった)  - 07/2/13(火) 15:04 -

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

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