Импорт файлов в Excel — пропустить, если не найдено

Это мой первый вопрос здесь, у меня есть макрос для импорта файлов .txt с разделителями «точка с запятой» в Excel. Каждому файлу присваивается имя, и каждый файл импортируется на новый лист. Но если один из этих файлов не существует, макрос не работает. Я хочу добавить «On Erro» для обработки этих случаев, если файл не существует, пропустите его. Вот код:

Sub Importar_Dep()

Dim Caminho As String


Caminho = Sheets("DADOS").Cells(5, 8).Value
    Sheets("DEP").Select
    With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;" & Caminho, _
        Destination:=Range("$A$1"))
        .Name = "RECONQUISTA_DEP_0"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 850
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = False
        .TextFileSemicolonDelimiter = True
        .TextFileCommaDelimiter = False
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With
End Sub

person Diego Patrocinio    schedule 04.02.2014    source источник


Ответы (2)


Вот ваш код с проверкой существования файла:

Sub Importar_Dep()

    Dim Caminho As String
    Caminho = Sheets("DADOS").Cells(5, 8).Value
    Sheets("DEP").Select

    '+++++ Added block to check if file exists +++++
    Dim FS
    Set FS = CreateObject("Scripting.FileSystemObject")

    Dim TextFile_FullPath As String
    'The textfile_fullPath should be like:
    TextFile_FullPath = "C:\Users\Username\Desktop\" & _
                         RECONQUISTA_DEP_0 & _
                         ".txt"

    If FS.FileExists(TextFile_FullPath) Then
    '++++++++++++++++++++++++++++++++++++++++++++++++
        With ActiveSheet.QueryTables.Add(Connection:= _
            "TEXT;" & Caminho, _
            Destination:=Range("$A$1"))
            .Name = "RECONQUISTA_DEP_0"
            .FieldNames = True
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .TextFilePromptOnRefresh = False
            .TextFilePlatform = 850
            .TextFileStartRow = 1
            .TextFileParseType = xlDelimited
            .TextFileTextQualifier = xlTextQualifierDoubleQuote
            .TextFileConsecutiveDelimiter = False
            .TextFileTabDelimiter = False
            .TextFileSemicolonDelimiter = True
            .TextFileCommaDelimiter = False
            .TextFileSpaceDelimiter = False
            .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1)
            .TextFileTrailingMinusNumbers = True
            .Refresh BackgroundQuery:=False
        End With

    End If

End Sub

Как и в вашем комментарии, если вы хотите просмотреть все файлы, которые имеют определенное общее имя (фильтр), вы можете использовать этот код. Вышеупомянутые модификации затем стали бесполезными, потому что при этом вам больше не нужно проверять, существует ли файл, поскольку он просто просматривает все существующие файлы. Возможно, вам придется проверить, существует ли папка:

Sub RunThroughAllFiles()

    Dim Caminho As String
    Caminho = Sheets("DADOS").Cells(5, 8).Value
    Sheets("DEP").Select

    Dim FS
    Set FS = CreateObject("Scripting.FileSystemObject")

    Dim Filter As String: Filter = "RECONQUISTA_DEP_*.txt"
    Dim dirTmp As String

    If FS.FolderExists(Caminho) Then
        dirTmp = Dir(Caminho & "\" & Filter)
        Do While Len(dirTmp) > 0
            Call Importar_Dep(Caminho & "\" & dirTmp, _
                            Left(dirTmp, InStrRev(dirTmp, ".") - 1))
            dirTmp = Dir
        Loop
    Else
        MsgBox "Folder """ & Caminho & """ does not exists", vbExclamation
    End If

End Sub

Sub Importar_Dep(iFullFilePath As String, iFileNameWithoutExtension)

    With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;" & iFullFilePath, _
        Destination:=Range("$A$1"))
        .Name = iFileNameWithoutExtension
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 850
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = False
        .TextFileSemicolonDelimiter = True
        .TextFileCommaDelimiter = False
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With

End Sub

Для получения дополнительной информации см. Каталог, FileExists и FolderExists

person simpLE MAn    schedule 04.02.2014
comment
Большое спасибо, бро! Работает как часы! У меня есть еще один вопрос, не могли бы вы мне помочь... как я могу установить RECONQUISTA_DEP_0 в качестве переменной? Например, заставить его импортировать файл, даже если имя RECONQUISTA_DEP_12, что-то вроде RECONQUISTA_DEP_* - person Diego Patrocinio; 04.02.2014
comment
@ user3271315, рад, что смог помочь :) Конечно, я отредактирую свой ответ. - person simpLE MAn; 04.02.2014
comment
Теперь это не сработало, не знаю почему.. просто ничего не импортирует, даже если в папке есть файл... Например, мое значение Caminho - C:\Bases Geradas\Movel Reconquista \2014\16 01 14 - person Diego Patrocinio; 04.02.2014
comment
@DiegoPatrocinio, как изменится стоимость Caminho? он держит полный путь к файлу, верно? то есть: C:\blah\textfile.txt - person simpLE MAn; 04.02.2014
comment
Нет, он содержит только каталог. Позволь мне объяснить. Каждый день я получаю эти файлы по электронной почте и вставляю их в новую папку с текущей датой. Имя файла всегда RECONQUISTA_DEP_, где = любое число, и существует только по файлу в день. Затем я вставляю путь к созданной папке в ячейку, чтобы Каминьо читал эту ячейку. Итак, я хочу сделать что-то вроде Open: ( Caminho & FileName & .txt), но если я установлю FileName = RECONQUISTA_DEP_*, макрос не работает. - person Diego Patrocinio; 04.02.2014
comment
@DiegoPatrocinio, вот. Это будет перебирать все файлы, содержащиеся в папке Caminho, которые имеют RECONQUISTA_DEP_* в качестве общего имени. Если вы не хотите, чтобы это зацикливалось, просто удалите Do While Len(dirTmp) > 0, dirTmp = Dir и следующие за ними Loop. - person simpLE MAn; 04.02.2014
comment
Эй, извините, я только вчера вышел из офиса, когда вы ответили.. так что, только что попробовал, не сработало =( я просто ничего не импортирую.. ни сообщения об ошибке, ничего.. - person Diego Patrocinio; 05.02.2014
comment
@DiegoPatrocinio, добавьте последние три строки над первым End Sub. Чтобы добавить предупреждение, когда папка не существует. И скажи мне, что случилось. - person simpLE MAn; 05.02.2014
comment
Эй, извините, это сработало просто отлично! Это была моя ошибка! Правильный путь для Caminho — Cells(5,5), и я запускал макрос с (5,8), поэтому он не работал! Спасибо большое, чувак, ты мне ОЧЕНЬ помог! Если есть что-то, что я могу сделать, просто ударь меня! - person Diego Patrocinio; 05.02.2014
comment
@ДиегоПатрочинио; Нет проблем, я очень рад, что наконец-то все получилось. В любом случае, добавление MsgBox является обязательным, чтобы вы могли видеть, что происходит, когда он ничего не делает, я должен был поставить его раньше :) Увидимся! - person simpLE MAn; 05.02.2014
comment
Привет, приятель, извини, что снова беспокою тебя, но не мог бы ты помочь мне с последним вопросом? Когда я использую код, который вы мне прислали, если в папке больше одного файла, он импортирует их рядом друг с другом. Мне нужно, чтобы он импортировал их под последним ... например, если первый файл идет до столбца D , следующий будет импортирован на E... Код добавлю под этим комментарием. - person Diego Patrocinio; 06.02.2014
comment
@ДиегоПатрочинио; вы должны начать новый вопрос для этого, чтобы другим пользователям было легче найти тему, которую они ищут. Спасибо - person simpLE MAn; 06.02.2014
comment
Здесь: stackoverflow.com/questions/21608393/ - person Diego Patrocinio; 06.02.2014

Здесь:

Sub Abrir_PORT()

    Dim Caminho As String
    Caminho = Sheets("DADOS").Cells(5, 5).Value
    Sheets("PORT").Select

    Dim FS
    Set FS = CreateObject("Scripting.FileSystemObject")

    Dim Filter As String: Filter = "ATENTO_TLMKT_REC*.txt"
    Dim dirTmp As String

    If FS.FolderExists(Caminho) Then
        dirTmp = Dir(Caminho & "\" & Filter)
        Do While Len(dirTmp) > 0
            Call Importar_PORT(Caminho & "\" & dirTmp, _
                            Left(dirTmp, InStrRev(dirTmp, ".") - 1))
            dirTmp = Dir
        Loop
    End If

End Sub

Sub Importar_PORT(iFullFilePath As String, iFileNameWithoutExtension)

    With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;" & iFullFilePath, _
        Destination:=Range("$A$1"))
        .Name = iFileNameWithoutExtension
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 850
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = False
        .TextFileSemicolonDelimiter = True
        .TextFileCommaDelimiter = False
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False

    iRow = 2

    Do While Sheets("PORT").Cells(iRow, 1) <> ""

                If Cells(iRow, 2) = IsNumber Then

                Else

                Rows(iRow).Select
                Selection.EntireRow.Delete

                iRow = iRow - 1
                contagem = contagem + 1

                End If

 iRow = iRow + 1

 Loop

    End With

End Sub
person Diego Patrocinio    schedule 06.02.2014