Excel vba не находит файл

 

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,спасибо огромное!!!)))

Автор vasa, 04 апреля 2019, 17:13


vasa

  • Посетитель форума
  • Сообщения: 31
  • Записан

Проверяю наличие конкретного файла в конкретной папке.
Файл находится в папке  «ИО».
Как прописать проверку вордовского файла «ги.docx»?
Файл реально существует, но макрос его не находит.

Макрос

Sub VerifyFile()

    Dim strPath As String, strFileName As String

        strPath = «G:ИДИО»
    strFileName = «ги.docx»

        If Dir(strPath & «» & strFileName) <> «» Then
        MsgBox «Файл » & strFileName & » найден»
    Else
        MsgBox «Файл » & strFileName & » не найден»
    End If

    End Sub

[свернуть]



Администратор

  • Administrator
  • Сообщения: 2,251
  • Записан

Не записывайте крайний правый слеш в переменную «strPath»
strPath = «G:ИДИО»

Иначе в этой строке после «ИО» появляется два слеша подряд:
If Dir(strPath & «» & strFileName) <> «» Then



vasa

  • Посетитель форума
  • Сообщения: 31
  • Записан

удалил слзш, а изменений нет



Администратор

  • Administrator
  • Сообщения: 2,251
  • Записан

Заново скопируйте путь и имя файла и вставьте в макрос. Вручную не пишите, чтобы не сделать опечатку.



vasa

  • Посетитель форума
  • Сообщения: 31
  • Записан

Большое спасибо, помогло.


  • Форум по VBA, Excel и Word

  • VBA, Excel

  • VBA, макросы в Excel

  • Excel VBA: Почему файл существует, а макрос его не находит?

Здравствуйте, уважаемые форумчане.

Заранее прошу меня простить за возможно неграмотное изложение, ибо я не профессионал в работе с excel, а лишь любитель, которому приходится много с ним работать….
Столкнулся с такой проблемой. Сменил комп с 32-битной разрядной системой на другой с 64-битной. Скопировал на него нужный мне файл excel c макросом, использующий динамическую библиотеку dll. Сначала возникла проблема совместимости 64-битной системы и кода (как я понимаю) предназначенного для 32-битной системы в участке кода, имеющего вид

[vba]

Код

Declare Function XAXL Lib «CXA32.dll» (ByVal XAControl&, ByVal XAWndHnd&, ByVal XAMaxMem&, ByVal XAMaxRow&, ByVal XAMaxCol&, ByVal XAMaxNonZro&) As Integer
Declare Function XAXLREV Lib «CXA32.dll» (ByVal XAControl&) As Integer
Declare Function XAXLDONE Lib «CXA32.dll» (ByVal XAControl&) As Integer

[/vba]

Погуглив данную проблему добавил ключевое слово PtrSafe после каждого слова Declare – вроде проблема совместимости кода решилась… но теперь при запуске макроса возникает ошибка “Run-time error ‘48’: File not found: CXA32.dll” – то есть макрос не видит файл…

По инструкции к данному макросу файлы (библиотеки), относящиеся к данному макросу должны располагаться в папке Windows и вроде бы не требуют дополнительной регистрации. “В интренeтах” также пишут, что 64-битной системе подобные файлы должны быть в папке SysWOW64… Я пробовал копировать нужные файлы в эти и в разные другие папки (типа System32 и др.), а также пробовал прописывать в кавычках прямой путь к файлу, но результат один – макрос не находит данный файл.

Сначала думал, может в данном случае есть проблема работы с файлами «вообще», однако если через VBA просить excel открыть другую книгу, он это делает, то есть файлы видит… Возникает ощущение, что-либо я что-то не знаю о коде и там должно быть что-то допрописано для работы в 64-битной системе, или косяк в настройках excel (пользуюсь excel 2013).

Может кто сталкивался с подобным и подскажет что это за проблема и как ее решить?

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

Поделиться

Ещё вопросы

  • 1Оператор Bitshift на беззнаковых коротких в NodeJS
  • 0Iframe другого сайта
  • 1Как объявить динамический массив в C #
  • 0Как я могу сохранить данные в цикле forEach?
  • 1Генератор на основе другого генератора
  • 0Angular не может отправить вычисленные данные из функции как JSON
  • 0Нельзя использовать тег <a> для ссылки на позицию на той же странице
  • 1Android NDK получает доступ к родным функциям Bluetooth bluedroid
  • 0IE фокус при прокрутке div
  • 0Сложение и вычитание чисел в классах с ++
  • 0Нет высоты в контейнерах макета сетки
  • 0Как преобразовать изображение OpenCV Mat в GDI растровое изображение
  • 1Лучший способ уведомить пользовательский интерфейс, что происходит в другом потоке в wpf?
  • 0Сценарии автозагрузки ExtJs не выполнены
  • 0MySql запрос не работает в PHP, но работает в phpMyAdmin
  • 0отображать анимацию загрузки, когда пользователь нажимает на элемент, пока страница не загрузится
  • 1Как найти все подпапки папки (View) в Lotus Notes
  • 0Javascript / jQuery — создать массив на основе индекса переменной <option>
  • 1Как отправить байты из Python в Java с помощью сокетов?
  • 0Указатель на неполный тип класса не допускается при использовании внутреннего класса в C ++
  • 0невозможно привязать данные в выпадающем меню с помощью ng-repeat
  • 0Как включить MySQL с PHP 7
  • 0Как получить IP-адрес клиента в Openshift?
  • 1фабричный шаблон в node.js (экспресс)
  • 1Проверка входных данных Python — положительное число с плавающей запятой или int приняты
  • 1SQL работает в Access, но не в веб-форме ASP.NET
  • 0Рассчитать массив уникальных стеблей в JavaScript?
  • 0Выровнять текст по правому краю только в CSS в UL LI
  • 0Код завален утверждениями
  • 0C ++ Неопределенная ссылка на функцию MIDI
  • 0подключение к базе данных Mysql с помощью файла свойств с Hibernate
  • 0Разрешение AngularJS UI-маршрутизатора не определено
  • 0как удалить текст между <> примером <это текст>
  • 0Jquery событие не работает во второй раз, когда я называю это
  • 0Как передать аргумент родительского метода его внутренним вызывающим методам?
  • 0Как сделать фильтрацию по выбору в Angular JS?
  • 0Справка по маршрутизации воспламенителя кода, выпуск 404
  • 1Приведите каждый T в IEnumerable <Grouping <, >> к Grouping <,>
  • 1Android Intent putExtra (String, Serializable)
  • 0Проблема в jQuery Scroll в Chrome, Opera и Safari
  • 1Обновление сущностей «один ко многим» при использовании независимых связей в отдельном сценарии
  • 1Как программно изменить цвет текста панели действий Шерлока?
  • 1Linq to Entities ObjectContext и соединения с БД
  • 0Поиск пути в C ++ с использованием рекурсии
  • 1Ошибка GeneratorsNeeded в SymPy с использованием суммы с постоянным полиномом
  • 1Почему в моем слоте с областью видимости ничего не отображается?
  • 0Изменение разрешения файла
  • 1Дело против If-else в jdk7
  • 1Сортировка ключей HashMap по размеру ключа
  • 0JQuery / CSS Div не остается видимым / всегда исчезают

Понравилась статья? Поделить с друзьями:
  • Excel vba не выдавать ошибку
  • Excel vba оператор select case
  • Excel vba не виден лист
  • Excel vba оператор do while
  • Excel vba начало программирования