Vba excel если файл не найден

 

stevie44

Пользователь

Сообщений: 257
Регистрация: 02.06.2013

#1

24.11.2016 13:17:22

Здравствуйте!
Просьба подсказать, как можно игнорировать информационную ошибку, если файл не найден в VBA:

Код
        NewFilePath1 = Range("F5").Value
        NewFilePath2 = Range("F6").Value
        NewFilePath3 = Range("F7").Value
        NewFilePath4 = Range("F8").Value
        NewFilePath5 = Range("F10").Value        

        On Error Resume Next
        Workbooks.Open Filename:= _
            NewFilePath1, UpdateLinks:=False
        On Error GoTo 0
        
        On Error Resume Next
        Workbooks.Open Filename:= _
            NewFilePath2, UpdateLinks:=False
        On Error GoTo 0
        
        On Error Resume Next
        Workbooks.Open Filename:= _
            NewFilePath3, UpdateLinks:=False
        On Error GoTo 0
        
        On Error Resume Next
        Workbooks.Open Filename:= _
            NewFilePath4, UpdateLinks:=False
        On Error GoTo 0

Если какой-то файл не найден, то появляется табличка: «Не удается найти такой-то файл. Проверьте написание или измените путь».
Код после нажатия Enter продолжает далее обработку, т.к. On Error Resume Next везде прописал, однако как игнорировать информационное сообщение?
Спасибо.

Изменено: stevie4424.11.2016 13:18:18

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

#2

24.11.2016 13:21:02

Вначале пишем один раз:

Код
Application.DisplayAlerts = False

В конце пишем:

Код
Application.DisplayAlerts = True

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

#3

24.11.2016 13:23:15

У вас сообщение возникает из-за

Код
On Error GoTo 0

Вместо всей Вашей конструкции попробуйте эту

Код
On Error Resume Next
For I = 5 To 10
    Workbooks.Open Filename:=Range("F" & I).Value, UpdateLinks:=False
Next

Изменено: Sanja24.11.2016 13:25:44

Согласие есть продукт при полном непротивлении сторон.

 

Ігор Гончаренко

Пользователь

Сообщений: 13746
Регистрация: 01.01.1970

#4

24.11.2016 13:40:54

или без on error…

Код
for r = 5 to 10
  if dir(cells(r,6)) <> "" then Workbooks.Open cells(r,6), UpdateLinks:=False
next

Изменено: Ігор Гончаренко24.11.2016 13:41:53

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

#5

24.11.2016 13:58:44

Цитата
Sanja написал: У вас сообщение возникает из-за
Код
On Error GoTo 0

Мне не понятно почему Вы сделали такой вывод? Т.к. перед каждым открытием файла стоит:

Код
On Error Resume Next

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

Действительно, с чего это я… :oops:  

Согласие есть продукт при полном непротивлении сторон.

 

stevie44

Пользователь

Сообщений: 257
Регистрация: 02.06.2013

#7

07.12.2016 13:45:24

Здравствуйте!
А каким образом игнорировать ошибку, в случае закрытия файла, если он не открывался?
То есть мной были обозначены переменные, как указано в 1-м посте. А затем я открытые файлы в конце кода хочу закрыть.
К примеру, файл по переменной NewFilePath4 = Range(«F8»).Value не был найден, и следовательно не был открыт.

Однако мне нужно закрыть все. Я использую следующий метод:

Код
On Error GoTo Err4
    Workbooks(Dir(NewFilePath4)).Close False
Err4:

У меня появляется ошибка: runtime error 9 subscript out of range
Каким образом игнорировать ее?
Спасибо.

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

#8

07.12.2016 13:46:54

Код
if len(Dir(NewFilePath4))>0 then Workbooks(Dir(NewFilePath4)).Close False

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

stevie44

Пользователь

Сообщений: 257
Регистрация: 02.06.2013

#9

07.12.2016 14:44:44

JayBhagavan,спасибо огромное!!!)))

0 / 0 / 0

Регистрация: 29.03.2016

Сообщений: 37

1

Как вывести сообщение, если необходимый файл не найден?

22.11.2016, 08:48. Показов 3389. Ответов 1


Студворк — интернет-сервис помощи студентам

имеется переменная filename, значение которой формируется в зависимости от выбранных значений на форме, после чего файл открывается, с него копируется информация, filename закрывается.
как вывести сообщение что filename не найден, при этом чтоб выполнение процедуры не приводило к ошибки VBA



0



snipe

4038 / 1423 / 394

Регистрация: 07.08.2013

Сообщений: 3,541

22.11.2016, 09:16

2

Лучший ответ Сообщение было отмечено Lovinetskiy A как решение

Решение

если функция dir(«полный путь») вернет пустую строку то файла нет

Visual Basic
1
if dir("c:windowswin.ini")="" then msgbox "Файл не найден"



1



Sub test()

thesentence = InputBox("Type the filename with full extension", "Raw Data File")

Range("A1").Value = thesentence

If Dir("thesentence") <> "" Then
    MsgBox "File exists."
Else
    MsgBox "File doesn't exist."
End If

End Sub

In this when i pickup the text value from the input box, it doesn’t work. If however, if remove "the sentence" from If Dir() and replace it with an actual name in the code, it works. Can somebody help?

vba_user111's user avatar

asked Jul 20, 2012 at 6:25

Dinesh Goel's user avatar

Note your code contains Dir("thesentence") which should be Dir(thesentence).

Change your code to this

Sub test()

thesentence = InputBox("Type the filename with full extension", "Raw Data File")

Range("A1").Value = thesentence

If Dir(thesentence) <> "" Then
    MsgBox "File exists."
Else
    MsgBox "File doesn't exist."
End If

End Sub

answered Jul 20, 2012 at 6:31

Cylian's user avatar

CylianCylian

10.8k4 gold badges43 silver badges55 bronze badges

4

Use the Office FileDialog object to have the user pick a file from the filesystem. Add a reference in your VB project or in the VBA editor to Microsoft Office Library and look in the help. This is much better than having people enter full paths.

Here is an example using msoFileDialogFilePicker to allow the user to choose multiple files. You could also use msoFileDialogOpen.

'Note: this is Excel VBA code
Public Sub LogReader()
    Dim Pos As Long
    Dim Dialog As Office.FileDialog
    Set Dialog = Application.FileDialog(msoFileDialogFilePicker)

    With Dialog
        .AllowMultiSelect = True
        .ButtonName = "C&onvert"
        .Filters.Clear
        .Filters.Add "Log Files", "*.log", 1
        .Title = "Convert Logs to Excel Files"
        .InitialFileName = "C:InitialPath"
        .InitialView = msoFileDialogViewList

        If .Show Then
            For Pos = 1 To .SelectedItems.Count
                LogRead .SelectedItems.Item(Pos) ' process each file
            Next
        End If
    End With
End Sub

There are lots of options, so you’ll need to see the full help files to understand all that is possible. You could start with Office 2007 FileDialog object (of course, you’ll need to find the correct help for the version you’re using).

answered Jul 20, 2012 at 7:19

ErikE's user avatar

ErikEErikE

48.4k23 gold badges150 silver badges194 bronze badges

1

Correction to fileExists from @UberNubIsTrue :

Function fileExists(s_directory As String, s_fileName As String) As Boolean

  Dim obj_fso As Object, obj_dir As Object, obj_file As Object
  Dim ret As Boolean
   Set obj_fso = CreateObject("Scripting.FileSystemObject")
   Set obj_dir = obj_fso.GetFolder(s_directory)
   ret = False
   For Each obj_file In obj_dir.Files
     If obj_fso.fileExists(s_directory & "" & s_fileName) = True Then
        ret = True
        Exit For
      End If
   Next

   Set obj_fso = Nothing
   Set obj_dir = Nothing
   fileExists = ret

 End Function

EDIT: shortened version

' Check if a file exists
Function fileExists(s_directory As String, s_fileName As String) As Boolean

    Dim obj_fso As Object

    Set obj_fso = CreateObject("Scripting.FileSystemObject")
    fileExists = obj_fso.fileExists(s_directory & "" & s_fileName)

End Function

answered May 29, 2013 at 19:14

amackay11's user avatar

amackay11amackay11

7191 gold badge10 silver badges17 bronze badges

3

just get rid of those speech marks

Sub test()

Dim thesentence As String

thesentence = InputBox("Type the filename with full extension", "Raw Data File")

Range("A1").Value = thesentence

If Dir(thesentence) <> "" Then
    MsgBox "File exists."
Else
    MsgBox "File doesn't exist."
End If

End Sub

This is the one I like:

Option Explicit

Enum IsFileOpenStatus
    ExistsAndClosedOrReadOnly = 0
    ExistsAndOpenSoBlocked = 1
    NotExists = 2
End Enum


Function IsFileReadOnlyOpen(FileName As String) As IsFileOpenStatus

With New FileSystemObject
    If Not .FileExists(FileName) Then
        IsFileReadOnlyOpen = 2  '  NotExists = 2
        Exit Function 'Or not - I don't know if you want to create the file or exit in that case.
    End If
End With

Dim iFilenum As Long
Dim iErr As Long
On Error Resume Next
    iFilenum = FreeFile()
    Open FileName For Input Lock Read As #iFilenum
    Close iFilenum
    iErr = Err
On Error GoTo 0

Select Case iErr
    Case 0: IsFileReadOnlyOpen = 0 'ExistsAndClosedOrReadOnly = 0
    Case 70: IsFileReadOnlyOpen = 1 'ExistsAndOpenSoBlocked = 1
    Case Else: IsFileReadOnlyOpen = 1 'Error iErr
End Select

End Function    'IsFileReadOnlyOpen

answered Jul 21, 2012 at 13:52

whytheq's user avatar

whytheqwhytheq

34k64 gold badges170 silver badges265 bronze badges

4

Function FileExists(fullFileName As String) As Boolean
    FileExists = VBA.Len(VBA.Dir(fullFileName)) > 0
End Function

Works very well, almost, at my site. If I call it with «» the empty string, Dir returns «connection.odc«!! Would be great if you guys could share your result.

Anyway, I do like this:

Function FileExists(fullFileName As String) As Boolean
  If fullFileName = "" Then
    FileExists = False
  Else
    FileExists = VBA.Len(VBA.Dir(fullFileName)) > 0
  End If
End Function

answered Oct 22, 2015 at 11:12

Joachim Brolin's user avatar

1

Function FileExists(fullFileName As String) As Boolean
    FileExists = VBA.Len(VBA.Dir(fullFileName)) > 0
End Function

answered Jun 14, 2015 at 2:09

Ronnie Royston's user avatar

Ronnie RoystonRonnie Royston

16k6 gold badges73 silver badges88 bronze badges

0

I’m not certain what’s wrong with your code specifically, but I use this function I found online (URL in the comments) for checking if a file exists:

Private Function File_Exists(ByVal sPathName As String, Optional Directory As Boolean) As Boolean
    'Code from internet: http://vbadud.blogspot.com/2007/04/vba-function-to-check-file-existence.html
    'Returns True if the passed sPathName exist
    'Otherwise returns False
    On Error Resume Next
    If sPathName <> "" Then

        If IsMissing(Directory) Or Directory = False Then

            File_Exists = (Dir$(sPathName) <> "")
        Else

            File_Exists = (Dir$(sPathName, vbDirectory) <> "")
        End If

    End If
End Function

answered Jul 20, 2012 at 6:31

Dan's user avatar

DanDan

44.9k17 gold badges88 silver badges157 bronze badges

2

Very old post, but since it helped me after I made some modifications, I thought I’d share. If you’re checking to see if a directory exists, you’ll want to add the vbDirectory argument to the Dir function, otherwise you’ll return 0 each time. (Edit: this was in response to Roy’s answer, but I accidentally made it a regular answer.)

Private Function FileExists(fullFileName As String) As Boolean
    FileExists = Len(Dir(fullFileName, vbDirectory)) > 0
End Function

answered Dec 19, 2018 at 3:55

Word Nerd's user avatar

based on other answers here I’d like to share my one-liners that should work for dirs and files:

  • Len(Dir(path)) > 0 or Or Len(Dir(path, vbDirectory)) > 0  'version 1 - ... <> "" should be more inefficient generally
    
    • (just Len(Dir(path)) did not work for directories (Excel 2010 / Win7))
  • CreateObject("Scripting.FileSystemObject").FileExists(path)  'version 2 - could be faster sometimes, but only works for files (tested on Excel 2010/Win7)
    

as PathExists(path) function:

Public Function PathExists(path As String) As Boolean
    PathExists = Len(Dir(path)) > 0 Or Len(Dir(path, vbDirectory)) > 0
End Function

answered Aug 12, 2019 at 9:21

Andreas Covidiot's user avatar

Andreas CovidiotAndreas Covidiot

4,1785 gold badges50 silver badges95 bronze badges

I don’t do a lot of VBA. I have some code:

If Target.Address = "$H$1" Then
    Range("A13").Comment.Shape.Fill.UserPicture Range("H2").Value
End If

Simple. Changes Comment BG image based on criteria in cell A13, plugs in a file/path generated by H2. However…

Sometimes the file/path doesn’t exist for what’s in H2 (as H2 is created based on user input/selection).

I’ve tried this:

If Target.Address = "$H$1" Then
    Range("A13").Comment.Shape.Fill.UserPicture Range("H2").Value
Else
    Range("A13").Comment.Shape.Fill.UserPicture Range("H6").Value
End If

Where H6 is another generated file/path to «NOIMAGE.jpg», which would be a constant for any entry that doesn’t have an associated image. It doesn’t like that either.

I can’t find an else expression that will do what it needs before the method tried to run/find what’s in H2.

Ideas?

7 ответов

что-то вроде этого

лучше использовать переменную рабочей книги для обеспечения дальнейшего контроля (при необходимости) открытой рабочей книги

обновлено, чтобы проверить, что имя файла является реальной рабочей книгой, — которая также делает избыточную первоначальную проверку, отличную от сообщения пользователя, чем текстовое поле пустым

Dim strFile As String
Dim WB As Workbook
strFile = Trim(TextBox1.Value)
Dim DirFile As String
If Len(strFile) = 0 Then Exit Sub

DirFile = "C:Documents and SettingsAdministratorDesktop" & strFile
If Len(Dir(DirFile)) = 0 Then
  MsgBox "File does not exist"
Else
 On Error Resume Next
 Set WB = Workbooks.Open(DirFile)
 On Error GoTo 0
 If WB Is Nothing Then MsgBox DirFile & " is invalid", vbCritical
End If

brettdj
03 май 2013, в 06:15

Поделиться

Я использую эту функцию для проверки существования файла:

Function IsFile(ByVal fName As String) As Boolean
'Returns TRUE if the provided name points to an existing file.
'Returns FALSE if not existing, or if it a folder
    On Error Resume Next
    IsFile = ((GetAttr(fName) And vbDirectory) <> vbDirectory)
End Function

Patrick Honorez
30 янв. 2015, в 14:37

Поделиться

Для проверки существования можно также использовать (работает как для файлов, так и для файлов):

Not Dir(DirFile, vbDirectory) = vbNullString

Результатом является True если файл или каталог существует.

Пример:

If Not Dir("C:Temptest.xlsx", vbDirectory) = vbNullString Then
    MsgBox "exists"
Else
    MsgBox "does not exist"
End If

ZygD
18 нояб. 2015, в 06:21

Поделиться

Вот мой обновленный код. Проверяет, существует ли версия до сохранения и сохраняет в качестве следующего доступного номера версии.

Sub SaveNewVersion()
    Dim fileName As String, index As Long, ext As String
    arr = Split(ActiveWorkbook.Name, ".")
    ext = arr(UBound(arr))

    fileName = ActiveWorkbook.FullName

    If InStr(ActiveWorkbook.Name, "_v") = 0 Then
        fileName = ActiveWorkbook.Path & "" & Left(ActiveWorkbook.Name, InStr(ActiveWorkbook.Name, ".") - 1) & "_v1." & ext
    End If

   Do Until Len(Dir(fileName)) = 0

        index = CInt(Split(Right(fileName, Len(fileName) - InStr(fileName, "_v") - 1), ".")(0))
        index = index + 1
        fileName = Left(fileName, InStr(fileName, "_v") - 1) & "_v" & index & "." & ext

    'Debug.Print fileName
   Loop

    ActiveWorkbook.SaveAs (fileName)
End Sub

Andrew Prostko
21 март 2018, в 21:18

Поделиться

Я брошу это там, а потом утку. Обычная причина, чтобы проверить, существует ли файл, — это избежать ошибки при попытке ее открыть. Как насчет использования обработчика ошибок, чтобы справиться с этим:

Function openFileTest(filePathName As String, ByRef wkBook As Workbook, _
                      errorHandlingMethod As Long) As Boolean
'Returns True if filePathName is successfully opened,
'        False otherwise.
   Dim errorNum As Long

'***************************************************************************
'  Open the file or determine that it doesn't exist.
   On Error Resume Next:
   Set wkBook = Workbooks.Open(fileName:=filePathName)
   If Err.Number <> 0 Then
      errorNum = Err.Number
      'Error while attempting to open the file. Maybe it doesn't exist?
      If Err.Number = 1004 Then
'***************************************************************************
      'File doesn't exist.
         'Better clear the error and point to the error handler before moving on.
         Err.Clear
         On Error GoTo OPENFILETEST_FAIL:
         '[Clever code here to cope with non-existant file]
         '...
         'If the problem could not be resolved, invoke the error handler.
         Err.Raise errorNum
      Else
         'No idea what the error is, but it not due to a non-existant file
         'Invoke the error handler.
         Err.Clear
         On Error GoTo OPENFILETEST_FAIL:
         Err.Raise errorNum
      End If
   End If

   'Either the file was successfully opened or the problem was resolved.
   openFileTest = True
   Exit Function

OPENFILETEST_FAIL:
   errorNum = Err.Number
   'Presumabley the problem is not a non-existant file, so it's
   'some other error. Not sure what this would be, so...
   If errorHandlingMethod < 2 Then
      'The easy out is to clear the error, reset to the default error handler,
      'and raise the error number again.
      'This will immediately cause the code to terminate with VBA standard
      'run time error Message box:
      errorNum = Err.Number
      Err.Clear
      On Error GoTo 0
      Err.Raise errorNum
      Exit Function

   ElseIf errorHandlingMethod = 2 Then
      'Easier debugging, generate a more informative message box, then terminate:
      MsgBox "" _
           & "Error while opening workbook." _
           & "PathName: " & filePathName & vbCrLf _
           & "Error " & errorNum & ": " & Err.Description & vbCrLf _
           , vbExclamation _
           , "Failure in function OpenFile(), IO Module"
      End

   Else
      'The calling function is ok with a false result. That is the point
      'of returning a boolean, after all.
      openFileTest = False
      Exit Function
   End If

End Function 'openFileTest()

riderBill
10 дек. 2015, в 06:57

Поделиться

Возможно, это вызвано переменной Filename

File = TextBox1.Value

Должен быть

Filename = TextBox1.Value

matzone
03 май 2013, в 04:48

Поделиться

Вы должны установить цикл условий, чтобы проверить значение TextBox1.

If TextBox1.value = "" then
   MsgBox "The file not exist" 
   Exit sub 'exit the macro
End If

Надеюсь, это поможет вам.

Leng Keong
03 май 2013, в 04:48

Поделиться

Ещё вопросы

  • 0Рендеринг переменной из макета в другой макет
  • 1Оповещение о редактировании сетки в зависимости от разрешения
  • 0Ограничение текстовых полей числами
  • 1найти количество слов в строке, используя рекурсивный метод
  • 0deadline_timer странное поведение
  • 0При запуске тестового приложения VirtualBoxSDK возвращается ошибка «Ошибка создания экземпляра виртуальной коробки»
  • 1Использование фонового рабочего в GTK # для доступа к элементам графического интерфейса без исключения незаконного доступа
  • 0Как записать выражение boost :: lambda в качестве аргумента обратного вызова функции
  • 1Экономия: использование внешнего Java-класса в определении списка
  • 1Как использовать клиентскую библиотеку Google API?
  • 1Добавление простой функциональности Enter key в мою программу на Java
  • 1Добавление члена данных в уже существующий класс в C #
  • 1Приложение Windows Form не будет инициализировано
  • 0Почему сессия является ложной в Codeigniter?
  • 0использование group by и показ-скрытие группы div для выбранного флажка
  • 0jQuery из Google CDN не работает
  • 0Как получить входное значение в php var
  • 0AngularJS добавляет действие в контроллер
  • 0Выберите строку с наибольшим значением между двумя таблицами, а также выберите другие столбцы в группе по
  • 0Создать индекс в Mysql для строки и даты и времени
  • 1DbContext с Ninject ADO.NET
  • 1Как создать класс, который не может иметь экземпляр?
  • 0Удалить лишний столбец иконок из Angular UI-Grid TreeView
  • 1Ошибка: пакет «@ anuglar / compiler-cli» установлен неправильно
  • 0Angularjs) выбор всего числа при фокусировке на вводе
  • 0Что вызывает разрыв анимации SVG / CSS в некоторых браузерах?
  • 0Требовать завершения определенного события перед запуском приложения
  • 0манипулирование строками нескольких векторов
  • 1Установка значения в одном классе и извлечение из другого класса в Java (приложение Android)
  • 1Может ли Aparapi обрабатывать обработку строк с помощью Java 8?
  • 0mysq — использовать переменную (дату), когда SELECT * INTO OUTFILE (по имени файла)
  • 0Сбой вызова include и require при использовании двойной кавычки в php 5.4 easy php dev server
  • 0создание класса контейнера для boost :: ptr_vector
  • 1Добавить пустой верхний или нижний колонтитул в ListView программно
  • 0Можно ли выровнять текст по диагонали в css?
  • 0SyntaxError при попытке получить стиль
  • 0Проблемы с обработкой памяти
  • 0Изменить объект JQuery
  • 1Как отобразить ImageView немного за пределами RelativeLayout или за пределами экрана? Как вывести резину на верхнюю часть экрана
  • 1Использование Matlab из обновления переменной c #
  • 0Ввод и получение информации из CPtrArray MFC
  • 0извлечение идентификатора сеанса из ответа curl
  • 1Определить тип файла в Java
  • 0удаление дубликатов массива из ассоциативного массива
  • 0Выберите не рендеринг в материализации CSS и AngularJS
  • 0Возврат константной ссылки на интеллектуальный указатель против использования ссылки в качестве параметра
  • 1Android — Переключить громкость уведомлений программно
  • 1Возвращение данных из функции обещания поставщика в Javascript
  • 0Как передать структуру функции в C ++
  • 1Python — удаление пропорции / процента словарных пар

Настоящая заметка продолжает знакомство с VBA. В ней представлены некоторые «практичные» функции, которые могут использоваться в ваших приложениях либо помогут в создании аналогичных функций. Эти функции наиболее полезны, когда вызываются из другой процедуры VBA. Следовательно, они объявляются с ключевым словом Private и не отображаются в диалоговом окне Excel Мастер функций (подробнее см. Работа с процедурами VBA).[1]

Функция FileExists

Данная функция получает один аргумент (путь и имя файла) и возвращает ИСТИНА, если файл существует.

Private Function FileExists(fname) As Boolean

   Возвращает TRUE, если файл существует

    Dim x As String

    x = Dir(fname)

    If x <> «» Then FileExists = True _

        Else FileExists = False

End Function

Скачать заметку в формате Word или pdf, примеры в архиве (политика безопасности провайдера не позволяет загружать файлы Excel с поддержкой макросов)

Функция FileNameOnly

Функция получает один аргумент (путь и имя файла; не забывайте брать строку в кавычки) и возвращает только имя файла.

Private Function FileNameOnly(pname) As String

   Возвращает имя файла из строки путь/имя файла

    Dim temp As Variant

    temp = Split(pname, Application.PathSeparator)

    FileNameOnly = temp(UBound(temp))

End Function

Функция использует функцию VBA Split, которая принимает строку (вместе с символами-разделителями) и возвращает массив типа variant, содержащий элементы, которые находятся между символами-разделителями. В рассматриваемом случае переменной temp присваивается массив, содержащий текстовые строки между Application.PathSeparater (обычно в качестве разделителя используется обратная косая черта).

Если в качестве аргумента указать "с:excelfiles2010backupbudget.xlsx", функция возвратит строку budget.xlsx.

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

Private Function FileNameOnly2(pname) As String

FileNameOnly2 = Dir(pname)

End Function

Функция PathExists

Функция получает один аргумент (путь) и возвращает ИСТИНА, если путь существует.

Private Function PathExists(pname) As Boolean

   Возвращает TRUE, если путь существует

    If Dir(pname, vbDirectory) = «» Then

        PathExists = False

    Else

        PathExists = (GetAttr(pname) And vbDirectory) = vbDirectory

    End If

End Function

Функция RangeNameExists

Функция получает один аргумент (название диапазона) и возвращает ИСТИНА, если в активной рабочей книге существует указанное название диапазона.

Private Function RangeNameExists(nname) As Boolean

   Возвращает TRUE, если имя диапазона существует

    Dim n As Name

    RangeNameExists = False

    For Each n In ActiveWorkbook.Names

        If UCase(n.Name) = UCase(nname) Then

            RangeNameExists = True

            Exit Function

        End If

    Next n

End Function

Функция SheetExists

Функция получает один аргумент (название рабочего листа) и возвращает ИСТИНА, если данный рабочий лист существует в активной рабочей книге.

Private Function SheetExists(sname) As Boolean

   Возвращает TRUE, если лист существует в активной рабочей книге

    Dim x As Object

    On Error Resume Next

    Set x = ActiveWorkbook.Sheets(sname)

    If Err = 0 Then SheetExists = True _

        Else SheetExists = False

End Function

Функция WorkbooklsOpen

Функция получает один аргумент (название рабочей книги) и возвращает ИСТИНА, если данная рабочая книга открыта.

Private Function WorkbookIsOpen(wbname) As Boolean

   Возвращает TRUE, если рабочая книга открыта

    Dim x As Workbook

    On Error Resume Next

    Set x = Workbooks(wbname)

    If Err = 0 Then WorkbookIsOpen = True _

        Else WorkbookIsOpen = False

End Function

Проверка принадлежности к коллекции

Следующая функция представляет собой образец «групповой» функции, с помощью которой можно определить, является ли объект членом коллекции.

Private Function IsInCollection(Coin As Object, _

    Item As String) As Boolean

    Dim Obj As Object

    On Error Resume Next

    Set Obj = Coin(Item)

    IsInCollection = Not Obj Is Nothing

End Function

Эта функция имеет два аргумента: коллекцию (объект) и элемент (строка), который может быть либо не быть членом коллекции. Функция будет создавать объектную переменную, представляющую элемент коллекции. Если попытка увенчается успехом, функция возвратит True; иначе — False. Функцию IsInCollection можно использовать вместо трех других функций, приведенных выше. Чтобы определить, содержится ли в активной рабочей книге диапазон Data, вызовите функцию IsInCollection с помощью следующего оператора:

MsgBox IsInCollection(ActiveWorkbook.Names, "Data")

Для того чтобы определить, открыта ли рабочая книга с названием Budget, используйте следующий оператор:

MsgBox IsInCollection(Workbooks, "budget.xlsx")

Чтобы узнать, содержит ли активная рабочая книга рабочий лист Лист1, используйте следующий оператор:

MsgBox IsInCollection(ActiveWorkbook.Worksheets, "Лист1")

Получение значения из закрытой рабочей книги

В VBA не существует метода получения значения из закрытого файла рабочей книги. Однако вы можете воспользоваться возможностью управления ссылками на файлы, которая предоставляется в Excel. В настоящем разделе описана функция VBA GetValue, которая получает значение из закрытой книги. Эта задача выполняется в результате вызова макроса XLM, который появился в «доисторических» версиях Excel (до версии 5), но поддерживается до сих пор (подробнее о макрофункциях xlm см. Функция Получить.Ячейку).

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

Private Function GetValue(path, file, sheet, ref)

‘   Выборка значения из закрытой книги

    Dim arg As String

   Проверка существования файла

    If Right(path, 1) <> «» Then path = path & ««

    If Dir(path & file) = «» Then

        GetValue = «Файл не найден»

        Exit Function

    End If

‘   Создание аргумента

    arg = «‘» & path & «[» & file & «]» & sheet & «‘!» & _

      Range(ref).Range(«A1»).Address(, , xlR1C1)

   Вызов макроса XLM

    GetValue = ExecuteExcel4Macro(arg)

End Function

Функция GetValue принимает четыре аргумента:

  • path — путь к закрытому файлу (например, "d:files");
  • file — название рабочей книги (например, "budget.xlsх");
  • sheet — название рабочего листа (например, "Лист1");
  • ref — ссылка на ячейку (например, "С4").

Следующая процедура демонстрирует, как используется функция GetValue. В этой процедуре отображается значение ячейки С1 листа Лист2 файла Закрытая_книга.xlsx, расположенного в текущей папке:

Sub TestGetValue()

    Dim p As String, f As String

    Dim s As String, a As String

    p = ThisWorkbook.path

    f = «Закрытая_книга.xlsx»

    s = «Лист2»

    a = «C1»

    MsgBox GetValue(p, f, s, a)

End Sub

Ниже приведен еще один пример. Эта процедура считывает 160 значений (20 строк и 8 столбцов) из закрытого файла и помещает эти значения на активный рабочий лист:

Sub TestGetValue2()

    Dim p As String, f As String

    Dim s As String, a As String

    Dim r As Long, c As Long

    p = ThisWorkbook.path

    f = «Закрытая_книга.xlsx»

    s = «Лист1»

    Application.ScreenUpdating = False

    For r = 1 To 20

        For c = 1 To 8

            a = Cells(r, c).Address

            Cells(r, c) = GetValue(p, f, s, a)

        Next c

    Next r

End Sub

Функция GetValue не работает, если ее использовать в формуле рабочего листа. Эту функцию вообще не следует использовать в листах Excel, поскольку для получения значения из закрытого файла можно просто создать формулу со ссылкой.

[1] По материалам книги Джон Уокенбах. Excel 2010. Профессиональное программирование на VBA. – М: Диалектика, 2013. – С. 358–362.

Return to VBA Code Examples

VBA allows you to check if a file or folder exists by using the Dir function.

Using the Dir Command to Check If a File Exists

As we mentioned in the introduction, the Dir function allows us to check if a selected file exists on the computer. Here is the code:

Sub CheckFileExists ()

Dim strFileName As String
Dim strFileExists As String

    strFileName = "C:UsersNikolaDesktopVBA articlesTest File Exists.xlsx"
    strFileExists = Dir(strFileName)

   If strFileExists = "" Then
        MsgBox "The selected file doesn't exist"
    Else
        MsgBox "The selected file exists"
    End If

End Sub

We first assigned the file path to the variable strFileName. Then we use the Dir function to get the file name into the variable strFileExists. If the file exists in the directory, its name will be assigned to the string variable strFileExists.  If it does not exist then strFileExists will remain blank.  Finally, the message box appears informing us if the file exists or not.

Using the Dir Command to Check If a Folder Exists

Similarly to checking if a file exists, you can check if a folder exists. You just need to add one argument to the Dir command. Let’s look at the code:

Sub CheckFolderExists ()

Dim strFolderName As String
Dim strFolderExists As String

    strFolderName = "C:UsersNikolaDesktopVBA articlesTest Folder"
    strFolderExists = Dir(strFolderName, vbDirectory)

    If strFolderExists = "" Then
        MsgBox "The selected folder doesn't exist"
    Else
        MsgBox "The selected folder exists"
    End If

End Sub

We first assigned the folder path to the variable strFolderName. Then we use the Dir function to get the file name into the variable strFileExists. In order to check a folder, we need to add the second argument to the function – vbDirecotry. If the folder exists in the directory, its name will be assigned to the variable strFolderExists. If not strFolderExists will remain blank.

VBA Coding Made Easy

Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
vba save as

Learn More!

Формулировка задачи:

имеется переменная filename, значение которой формируется в зависимости от выбранных значений на форме, после чего файл открывается, с него копируется информация, filename закрывается.
как вывести сообщение что filename не найден, при этом чтоб выполнение процедуры не приводило к ошибки VBA

Код к задаче: «Как вывести сообщение если необходимый файл не найден»

textual

if dir("c:windowswin.ini")="" then msgbox "Файл не найден"

Полезно ли:

14   голосов , оценка 3.929 из 5

Like this post? Please share to your friends:
  • Vba excel если файл есть то удалить
  • Vba excel если то иначе
  • Vba excel добавление кнопки
  • Vba excel добавить ячейки в диапазоне
  • Vba excel добавить текст в ячейку