[[20120323105549]] 『Dir関数が上手くうごきません』(いち) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Dir関数が上手くうごきません』(いち)
Excel2003(英語版)Win7(英語版)

エクセルのsheetのA6から、選択したフォルダ内にあるCSVファイルのデータ内容をを貼り付けたいです。
空行から追加貼り付けしたいです。
※CSVファイルは精度が低い為、modGetCSVRecで、配列にデータをいれてsheetにCSVデータを貼り付けてます。

現状以下のソースの@の部分でデバックが発生します。デバックをとめると、フォルダ内の1つ目のCSVファイルのみを貼り付けます。
ソースを追って、@の部分をwithの中にいれましたが、デバック発生しました。
ご教授お願いいたします。

以下がデバックが起こっているソースです。

'*******************************************************************************
' CSV形式ファイル読み込み処理(カンマ数不定処理)
'*******************************************************************************
Option Explicit
Const cnsTITLE = "テキストファイル読み込み処理"
Const cnsFILTER = "全てのファイル (*.*),*.*"
Const cnsStartRow = 1
'Private Const ROW_STA_DATA As Integer = 6 '行
'Private Const ROW_STA_DATA As Long = 6 '行
Private Const ROW_STA_DATA As Long = 65536 '最終行

'*******************************************************************************

Sub CSVImport_Click()

    Dim MyObj As Object
    Dim MyFol As String
    Dim MyFnm As String
    Dim MyStr As String
    Dim i     As Long

    Dim intFF As Integer            ' FreeFile値
    Dim IX1 As Long                 ' CSV項目カラムINDEX
    Dim GYO As Long                 ' 収容するセルの行
    Dim lngREC As Long              ' レコード件数カウンタ
    Dim vntREC As Variant           ' レコード内容(配列)
    Dim strDummy As String          ' 読み飛ばし用ダミー
    Dim nNextRow As Long            '次に貼り付ける行

    'フォルダを選択する
    Set MyObj = CreateObject("Shell.Application") _
        .BrowseForFolder(0, "SelectFolder", 0)
    '選択なければ処理を抜ける
    If MyObj Is Nothing Then Exit Sub
    MyFol = MyObj.self.Path & "\"
    MsgBox MyFol & "を処理します。"
    Set MyObj = Nothing
    Application.ScreenUpdating = False
    MyFnm = Dir(MyFol & "*.csv") @
    'シート名管理表 (2012)にて処理
    With Sheets("管理表 (2012)")
    '開始行を貼り付ける

        nNextRow = Range("A" & ROW_STA_DATA).End(xlUp).Row + 1

        'Dir関数を使って指定フォルダ内csvファイルを順次処理
        Do Until Len(MyFnm) = 0&
            i = i + 1
            'データエリアを取得してセット先を変更

        ' FreeFile値の取得(以降この値で入出力する)
            intFF = FreeFile
        ' 指定ファイルをOPEN(入力モード)
            Open MyFnm For Input As #intFF

        ' 先頭行読み飛ばし
            If Not EOF(intFF) Then
                        Line Input #intFF, strDummy
            End If

        ' ファイルのEOF(End of File)まで繰り返す
            Do While Not EOF(intFF)
                ' レコード件数カウンタの加算
                lngREC = lngREC + 1
                ' 行単位にレコードを読み込む(共通処理)
                vntREC = modGetCSVRec.FP_GET_CSV_REC(intFF)
                IX1 = UBound(vntREC) + 1

                ' 行を加算しレコード内容を表示(先頭は2行目)

                Range(Cells(nNextRow, 1), Cells(nNextRow, IX1)).Value = vntREC   ' 配列渡し
                nNextRow = nNextRow + 1

            Loop
            Close #1
MsgBox "最終行は:" & nNextRow
            '次のファイルへ
            MyFnm = Dir()
        Loop
    End With
    If i > 0 Then
        MyStr = i & "個のファイルを処理しました。"
    Else
        '検索結果が0なら
        MyStr = "検索条件を満たすファイルはありません。"
    End If
    Application.ScreenUpdating = True
    MsgBox MyStr

End Sub

以下がmodGetCSVRecになります。

'*******************************************************************************
' CSV形式ファイル読み込み処理(カンマ数不定処理) '*******************************************************************************
Option Explicit
Const cnsDQ = """"
Const cnsDQCM = ""","
Const cnsCOM = ","
Const cnsBLNK = ""
Const cnsPROD = "."

'*******************************************************************************
' CSV形式の1レコードの受け取り ※現時点ではエラー処理なし
' (引数はファイル,戻り値はCSVレコード内容の配列)
'*******************************************************************************
Public Function FP_GET_CSV_REC(intFF As Integer) As Variant

    Dim strREC As String        ' レコード内容(連結後)
    Dim strREC2 As String       ' レコード内容(連結前)
    Dim strTEXT As String       ' 1項目の内容
    Dim strTEXT2 As String      ' Work
    Dim POS As Long             ' 項目先頭カラム
    Dim POS2 As Long            ' 項目間のカンマ位置
    Dim X() As Variant          ' レコード内容WORK
    Dim IX As Long              ' 項目INDEX
    Dim lngLEN As Long          ' レコード長
    Dim swTRUE As Boolean       ' レコード連結判断スイッチ
    Dim swDQ As Byte            ' ダブルクォーテーションスイッチ
    Dim lngERR As Long          ' エラーコード
    Dim dteDate As Date         ' 日付試験用Work

    strREC = ""
    ' 項目途中改行対応のため、行末判定は独自に行なう
    Do Until swTRUE = True

        swTRUE = True
        ' レコードの読込み
        Line Input #intFF, strREC2
        ' 分断レコード対応のため文字列を接合する
        strREC = strREC & strREC2
        lngLEN = Len(strREC)

        ' 配列を初期化
        IX = -1
        ReDim X(0)
        ' レコード内容を1文字ずつ判定する
        POS = 1
        Do While POS <= lngLEN

            POS2 = POS + 1
            swDQ = 0
            If Mid$(strREC, POS, 1) = cnsDQ Then
                swDQ = 1
                ' 先頭がダブルクォーテーションの場合、項目末のダブルクォーテーションを探す
                Do While POS2 < lngLEN
                    If Mid$(strREC, POS2, 2) = cnsDQCM Then Exit Do
                    POS2 = POS2 + 1
                Loop

                If POS2 >= lngLEN Then
                    ' 行末に達した場合は正しい文字列か判定する
                    If Right$(strREC, 1) = cnsDQ Then
                        strTEXT = Trim$(Mid$(strREC, POS + 1, lngLEN - POS - 1))
                    Else
                        ' 不揃いの場合は次レコードを読み込むように指示する
                        strTEXT = cnsBLNK
                        swTRUE = False
                    End If
                ElseIf POS2 > (POS + 1) Then
                    ' 両端のダブルクォーテーションを外す
                    strTEXT = Trim$(Mid$(strREC, POS + 1, POS2 - POS - 1))
                Else
                    strTEXT = cnsBLNK
                End If
                POS2 = POS2 + 1

            ElseIf Mid$(strREC, POS, 1) = cnsCOM Then
                ' カンマのみの場合はEmptyをセットさせる
                strTEXT = ""
                POS2 = POS2 - 1
            Else
                ' 先頭がダブルクォーテーションでない場合は単純にカンマを探す
                Do While POS2 <= lngLEN
                    If Mid$(strREC, POS2, 1) = cnsCOM Then Exit Do
                    POS2 = POS2 + 1
                Loop
                If POS2 > POS Then
                    strTEXT = Trim$(Mid$(strREC, POS, POS2 - POS))
                Else
                    strTEXT = cnsBLNK
                End If
            End If

            ' テーブル要素数を追加して内容をセット
            IX = IX + 1
            ReDim Preserve X(IX)
            strTEXT2 = StrConv(strTEXT, vbUpperCase)
            If ((IsNumeric(strTEXT) = True) And (swDQ <> 1)) Then
                ' 数値でダブルクォーテーションで囲われていない
                If InStr(1, strTEXT, cnsPROD, vbTextCompare) <> 0 Then
                    X(IX) = CDbl(strTEXT)   ' 実数は浮動小数点型
                Else
                    X(IX) = CCur(strTEXT)   ' 整数は通貨型
                End If
            ElseIf IsDate(strTEXT) Then
                X(IX) = CDate(strTEXT)      ' 日付型
                On Error Resume Next
                dteDate = X(IX)
                lngERR = Err.Number
                On Error GoTo 0
                If lngERR <> 0 Then
                    ' 日付エラー!
                    X(IX) = strTEXT         ' 文字列型に変更
                ElseIf dteDate < #1/1/1900# Then
                    ' 日付範囲外
                    X(IX) = strTEXT         ' 文字列型に変更
                Else
                    X(IX) = dteDate
                End If
            ElseIf ((strTEXT2 = "TRUE") Or (strTEXT2 = "FALSE")) Then
                X(IX) = CBool(strTEXT)      ' Boolean型
            ElseIf strTEXT <> cnsBLNK Then
                X(IX) = strTEXT             ' 文字列型
            Else
                ' ブランクの場合は初期化(Empty)
                X(IX) = Empty
            End If

            POS = POS2 + 1
        Loop

        ' EOFの場合は無条件に終了とする
        If EOF(intFF) = True Then swTRUE = True

    Loop

    ' 配列を戻り値にセット
    FP_GET_CSV_REC = X
End Function

'-----------------------------<< End of Source >>-------------------------------


 なんというエラーが発生するかも書いたほうがいいよ。
 (春日野馨)


 春日野馨さんと衝突。

 コードを読む元気がないので、まだ目を通していないけど、エラー発生時のメッセージを教えてくれる?

 *「デバッグが発生する」という表現はないんだけど、テーマとは関係ないし、
  ざらっと目に入ったコードの最初に、Const と Private Const があるところも、なんだかなぁ・・とは思うけど
  これも、テーマとは関係ないので、ただの「つぶやき」としてスルーして。

 (ぶらっと)

 エラーて、

    MyFnm = Dir(MyFol & "*.csv") @

 て、此処では無く

            ' 指定ファイルをOPEN(入力モード)
            Open MyFnm For Input As #intFF

 此処で起きているのでは?
 Dirは確か、ファイル名だけを返すのでPathが無いのでは?

             ' 指定ファイルをOPEN(入力モード)
            Open MyFol & MyFnm For Input As #intFF

 とすれば善いかも?

 (Bun)


Bunさん

' 指定ファイルをOPEN(入力モード) Open MyFol & MyFnm For Input As #intFF このコードに変えたら動きました!!
ありがとうございました!!

春日野馨さん、ぶらっとさん
ご指摘ありがとうございます。

以下のメッセージがでます。

eroer 53
this files not fined

(いち)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.