Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/функция работы с файлами и папками - Мир MS Excel

Старая форма входа
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » функция работы с файлами и папками (Макросы/Sub)
функция работы с файлами и папками
t330 Дата: Понедельник, 06.05.2019, 15:44 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 147
Репутация: 0 ±
Замечаний: 20% ±

Excel 2016
Всем добрый день.
Помогите пожалуйста понять логику работы кода PathExists ниже

Если pname - это не существующий путь к папке (например: c:\windows100500\) , то GetAttr (pname) должен вернуть ошибку File not found
далее срабатывает инструкция On Error Resume Next и код идет на строку номер 10, где какое-то странное равенство:

(GetAttr(pname) And vbDirectory) = vbDirectory

в чем логика этого равенства?

[vba]
Код

Function PathExists(pname) As Boolean
'   Возвращает TRUE, если путь существует
    On Error Resume Next
10   PathExists = (GetAttr(pname) And vbDirectory) = vbDirectory
    Debug.Print GetAttr(pname), (GetAttr(pname) And vbDirectory)
End Function

[/vba]
К сообщению приложен файл: file_functions.xlsm (13.8 Kb)
 
Ответить
СообщениеВсем добрый день.
Помогите пожалуйста понять логику работы кода PathExists ниже

Если pname - это не существующий путь к папке (например: c:\windows100500\) , то GetAttr (pname) должен вернуть ошибку File not found
далее срабатывает инструкция On Error Resume Next и код идет на строку номер 10, где какое-то странное равенство:

(GetAttr(pname) And vbDirectory) = vbDirectory

в чем логика этого равенства?

[vba]
Код

Function PathExists(pname) As Boolean
'   Возвращает TRUE, если путь существует
    On Error Resume Next
10   PathExists = (GetAttr(pname) And vbDirectory) = vbDirectory
    Debug.Print GetAttr(pname), (GetAttr(pname) And vbDirectory)
End Function

[/vba]

Автор - t330
Дата добавления - 06.05.2019 в 15:44
Pelena Дата: Понедельник, 06.05.2019, 17:40 | Сообщение № 2
Группа: Админы
Ранг: Местный житель
Сообщений: 19179
Репутация: 4419 ±
Замечаний: ±

Excel 365 & Mac Excel
Здравствуйте.
Думаю, что сработает и вариант
[vba]
Код
PathExists = GetAttr(pname) = vbDirectory
[/vba]
Если путь к папке существует, то GetAttr(pname) вернёт 16 (vbDirectory). Соответственно, вышеуказанная строка вернёт True, во всех остальных случаях - False


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеЗдравствуйте.
Думаю, что сработает и вариант
[vba]
Код
PathExists = GetAttr(pname) = vbDirectory
[/vba]
Если путь к папке существует, то GetAttr(pname) вернёт 16 (vbDirectory). Соответственно, вышеуказанная строка вернёт True, во всех остальных случаях - False

Автор - Pelena
Дата добавления - 06.05.2019 в 17:40
t330 Дата: Понедельник, 06.05.2019, 18:25 | Сообщение № 3
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 147
Репутация: 0 ±
Замечаний: 20% ±

Excel 2016
Думаю, что сработает и вариант


Нет не срабатывает, так как Getattr(pname) возвращает 48 если папка существует (в окне Intermediate дебагпринт показывает эти значения)
 
Ответить
Сообщение
Думаю, что сработает и вариант


Нет не срабатывает, так как Getattr(pname) возвращает 48 если папка существует (в окне Intermediate дебагпринт показывает эти значения)

Автор - t330
Дата добавления - 06.05.2019 в 18:25
Pelena Дата: Понедельник, 06.05.2019, 18:42 | Сообщение № 4
Группа: Админы
Ранг: Местный житель
Сообщений: 19179
Репутация: 4419 ±
Замечаний: ±

Excel 365 & Mac Excel
А, значит, там прибавляются ещё атрибуты, типа архивный или скрытый.
Тогда читаем справку
Цитата
Чтобы определить, какие атрибуты заданы, используйте оператор and для выполнения поразрядного сравнения значения, возвращаемого функцией GetAttr , и значения атрибута каждого файла, который требуется. Если результат не является нулем, то атрибут для заданного файла установлен. Например, возвращаемое значение следующего выражения And является нулем, если не установлен атрибут "Архив":
Result = GetAttr(FName) And vbArchive
Если атрибут "Архив" установлен, возвращается ненулевое значение.


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеА, значит, там прибавляются ещё атрибуты, типа архивный или скрытый.
Тогда читаем справку
Цитата
Чтобы определить, какие атрибуты заданы, используйте оператор and для выполнения поразрядного сравнения значения, возвращаемого функцией GetAttr , и значения атрибута каждого файла, который требуется. Если результат не является нулем, то атрибут для заданного файла установлен. Например, возвращаемое значение следующего выражения And является нулем, если не установлен атрибут "Архив":
Result = GetAttr(FName) And vbArchive
Если атрибут "Архив" установлен, возвращается ненулевое значение.

Автор - Pelena
Дата добавления - 06.05.2019 в 18:42
t330 Дата: Понедельник, 06.05.2019, 23:39 | Сообщение № 5
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 147
Репутация: 0 ±
Замечаний: 20% ±

Excel 2016
Тогда читаем справку


Так а как расшифровать это выражение?

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

(GetAttr(pname) And vbDirectory) = (48 and 16) = "ненулевое значение"

далее этот (GetAttr(pname) And vbDirectory), который выдал "ненулевое значение" приравниваем к vbDirectory , которое равно 16...

И что?

Никак не могу понять логику этой строки...
 
Ответить
Сообщение
Тогда читаем справку


Так а как расшифровать это выражение?

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

(GetAttr(pname) And vbDirectory) = (48 and 16) = "ненулевое значение"

далее этот (GetAttr(pname) And vbDirectory), который выдал "ненулевое значение" приравниваем к vbDirectory , которое равно 16...

И что?

Никак не могу понять логику этой строки...

Автор - t330
Дата добавления - 06.05.2019 в 23:39
Pelena Дата: Вторник, 07.05.2019, 09:10 | Сообщение № 6
Группа: Админы
Ранг: Местный житель
Сообщений: 19179
Репутация: 4419 ±
Замечаний: ±

Excel 365 & Mac Excel
Ключевое слово здесь "поразрядное" сравнение.
16 это 00010000
48 это 00110000
AND = 00010000 - ненулевое значение, равное 16


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеКлючевое слово здесь "поразрядное" сравнение.
16 это 00010000
48 это 00110000
AND = 00010000 - ненулевое значение, равное 16

Автор - Pelena
Дата добавления - 07.05.2019 в 09:10
RAN Дата: Вторник, 07.05.2019, 10:30 | Сообщение № 7
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
так как Getattr(pname) возвращает 48

Интересное кино
А у меня 16.


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщение
так как Getattr(pname) возвращает 48

Интересное кино
А у меня 16.

Автор - RAN
Дата добавления - 07.05.2019 в 10:30
Pelena Дата: Вторник, 07.05.2019, 10:45 | Сообщение № 8
Группа: Админы
Ранг: Местный житель
Сообщений: 19179
Репутация: 4419 ±
Замечаний: ±

Excel 365 & Mac Excel
А у меня 16

У меня тоже)
Видимо, добавляет ещё 32 (архивная)


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
Сообщение
А у меня 16

У меня тоже)
Видимо, добавляет ещё 32 (архивная)

Автор - Pelena
Дата добавления - 07.05.2019 в 10:45
t330 Дата: Вторник, 07.05.2019, 17:24 | Сообщение № 9
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 147
Репутация: 0 ±
Замечаний: 20% ±

Excel 2016
Всем спасибо, особенно Pelene!
Вдобавок к задачке, очень полезно было разобраться с двоичной системой исчисления!
 
Ответить
СообщениеВсем спасибо, особенно Pelene!
Вдобавок к задачке, очень полезно было разобраться с двоичной системой исчисления!

Автор - t330
Дата добавления - 07.05.2019 в 17:24
InExSu Дата: Четверг, 09.05.2019, 00:13 | Сообщение № 10
Группа: Друзья
Ранг: Ветеран
Сообщений: 648
Репутация: 96 ±
Замечаний: 0% ±

Excel 2010, 365
Привет!
Использование
[vba]
Код
On Error Resume Next
[/vba]
приводит к появлению странных ошибок - надстройка работала на 2010, но отказывалась работать на 2016. После вычистки Resume Next - заработала.
Плюс я противник загадочных функций :-)

[vba]
Код
Public Function Каталог_Есть_FSO(ByVal msg As String) _
        As Boolean

    With CreateObject("Scripting.FileSystemObject")

        If .FolderExists(msg) Then

            Каталог_Есть_FSO = True

        End If
    End With
End Function
[/vba]


Разработчик Битрикс24 php, Google Apps Script, VBA Excel Windows/Mac
 
Ответить
СообщениеПривет!
Использование
[vba]
Код
On Error Resume Next
[/vba]
приводит к появлению странных ошибок - надстройка работала на 2010, но отказывалась работать на 2016. После вычистки Resume Next - заработала.
Плюс я противник загадочных функций :-)

[vba]
Код
Public Function Каталог_Есть_FSO(ByVal msg As String) _
        As Boolean

    With CreateObject("Scripting.FileSystemObject")

        If .FolderExists(msg) Then

            Каталог_Есть_FSO = True

        End If
    End With
End Function
[/vba]

Автор - InExSu
Дата добавления - 09.05.2019 в 00:13
bmv98rus Дата: Четверг, 09.05.2019, 07:42 | Сообщение № 11
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4107
Репутация: 768 ±
Замечаний: 0% ±

Excel 2013/2016
InExSu,
Плюс я противник загадочных функций :-)
Но есть ли уверенность что при ответе False FolderExists - каталога нет, а не его нельзя прочесть из-за отсутствия доступа, в виду ограничения прав, слишком длинного пути. … В таком случае без обработки ошибки не обойтись.


Замечательный Временно просто медведь , процентов на 20.
 
Ответить
СообщениеInExSu,
Плюс я противник загадочных функций :-)
Но есть ли уверенность что при ответе False FolderExists - каталога нет, а не его нельзя прочесть из-за отсутствия доступа, в виду ограничения прав, слишком длинного пути. … В таком случае без обработки ошибки не обойтись.

Автор - bmv98rus
Дата добавления - 09.05.2019 в 07:42
InExSu Дата: Четверг, 09.05.2019, 10:05 | Сообщение № 12
Группа: Друзья
Ранг: Ветеран
Сообщений: 648
Репутация: 96 ±
Замечаний: 0% ±

Excel 2010, 365
без обработки ошибки не обойтись

Легко. Если не охота погрязнуть обработке ошибок - планируйте программу.
Надеюсь Вам знаком стиль программирования, которого я придерживаюсь: обработка ошибок, в основном, в юнит-тестах.
Мудрые научили, что функция-артефакт не должна заниматься обработкой ошибок. Можете поручить это декоратору.


Разработчик Битрикс24 php, Google Apps Script, VBA Excel Windows/Mac
 
Ответить
Сообщение
без обработки ошибки не обойтись

Легко. Если не охота погрязнуть обработке ошибок - планируйте программу.
Надеюсь Вам знаком стиль программирования, которого я придерживаюсь: обработка ошибок, в основном, в юнит-тестах.
Мудрые научили, что функция-артефакт не должна заниматься обработкой ошибок. Можете поручить это декоратору.

Автор - InExSu
Дата добавления - 09.05.2019 в 10:05
bmv98rus Дата: Четверг, 09.05.2019, 17:22 | Сообщение № 13
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4107
Репутация: 768 ±
Замечаний: 0% ±

Excel 2013/2016
[offtop] InExSu, Михаил, напишите код обхода каталога с рекурсивным вложением с учетом полного пути более 260 символов и с различным уровнем доступа, без обработки ошибок и я сотру пост 11. Не надо путать бездумное использование On Error Resume Next и обработку ошибок вызванных, как специально, так и внешними факторами.
Давайте приземлённее. Нужно проверить, наличие листа с заданными именем. Есть вариант перебрать все и сравнивать имя, а можно просто обратится к листу по заданному и проверить наличие ошибки.[/offtop]


Замечательный Временно просто медведь , процентов на 20.
 
Ответить
Сообщение[offtop] InExSu, Михаил, напишите код обхода каталога с рекурсивным вложением с учетом полного пути более 260 символов и с различным уровнем доступа, без обработки ошибок и я сотру пост 11. Не надо путать бездумное использование On Error Resume Next и обработку ошибок вызванных, как специально, так и внешними факторами.
Давайте приземлённее. Нужно проверить, наличие листа с заданными именем. Есть вариант перебрать все и сравнивать имя, а можно просто обратится к листу по заданному и проверить наличие ошибки.[/offtop]

Автор - bmv98rus
Дата добавления - 09.05.2019 в 17:22
InExSu Дата: Четверг, 09.05.2019, 18:25 | Сообщение № 14
Группа: Друзья
Ранг: Ветеран
Сообщений: 648
Репутация: 96 ±
Замечаний: 0% ±

Excel 2010, 365
обратится к листу по заданному и проверить наличие ошибки.

именно такой код
[vba]
Код
    On Error Resume Next
    Wb_Act.Worksheets(msg).Delete
    On Error GoTo 0
[/vba]в надстройке и вызывал ошибку Appliction-defined or object-defined error
в 2016 офисе (Break on Unhandled Errors не помог), без указания строки ошибки, хотя работал в 2010. И пришлось использовать
перебрать все и сравнивать имя


Разработчик Битрикс24 php, Google Apps Script, VBA Excel Windows/Mac
 
Ответить
Сообщение
обратится к листу по заданному и проверить наличие ошибки.

именно такой код
[vba]
Код
    On Error Resume Next
    Wb_Act.Worksheets(msg).Delete
    On Error GoTo 0
[/vba]в надстройке и вызывал ошибку Appliction-defined or object-defined error
в 2016 офисе (Break on Unhandled Errors не помог), без указания строки ошибки, хотя работал в 2010. И пришлось использовать
перебрать все и сравнивать имя

Автор - InExSu
Дата добавления - 09.05.2019 в 18:25
InExSu Дата: Четверг, 09.05.2019, 18:34 | Сообщение № 15
Группа: Друзья
Ранг: Ветеран
Сообщений: 648
Репутация: 96 ±
Замечаний: 0% ±

Excel 2010, 365
напишите код обхода каталога с рекурсивным вложением с учетом полного пути более 260 символов и с различным уровнем доступа
.
У VBA Excel примитивные инструменты для исследования файловой системы. Зачем мучаться?
Использую такой.


Разработчик Битрикс24 php, Google Apps Script, VBA Excel Windows/Mac
 
Ответить
Сообщение
напишите код обхода каталога с рекурсивным вложением с учетом полного пути более 260 символов и с различным уровнем доступа
.
У VBA Excel примитивные инструменты для исследования файловой системы. Зачем мучаться?
Использую такой.

Автор - InExSu
Дата добавления - 09.05.2019 в 18:34
bmv98rus Дата: Четверг, 09.05.2019, 18:57 | Сообщение № 16
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4107
Репутация: 768 ±
Замечаний: 0% ±

Excel 2013/2016
InExSu, Я еще раз намекаю, что путь длиннее 260 символов и доступ может быть закрыт на уровне файловой системы. Рекурсивно обойти не проблема, обойти все возможное - сложнее.


Замечательный Временно просто медведь , процентов на 20.
 
Ответить
СообщениеInExSu, Я еще раз намекаю, что путь длиннее 260 символов и доступ может быть закрыт на уровне файловой системы. Рекурсивно обойти не проблема, обойти все возможное - сложнее.

Автор - bmv98rus
Дата добавления - 09.05.2019 в 18:57
InExSu Дата: Четверг, 09.05.2019, 19:07 | Сообщение № 17
Группа: Друзья
Ранг: Ветеран
Сообщений: 648
Репутация: 96 ±
Замечаний: 0% ±

Excel 2010, 365
еще раз намекаю

У VBA Excel примитивные инструменты для исследования файловой системы. Зачем мучаться?


Разработчик Битрикс24 php, Google Apps Script, VBA Excel Windows/Mac
 
Ответить
Сообщение
еще раз намекаю

У VBA Excel примитивные инструменты для исследования файловой системы. Зачем мучаться?

Автор - InExSu
Дата добавления - 09.05.2019 в 19:07
bmv98rus Дата: Четверг, 09.05.2019, 19:35 | Сообщение № 18
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4107
Репутация: 768 ±
Замечаний: 0% ±

Excel 2013/2016
то есть этот метод позволит добраться до самой последней паки
C:\temp\123456789_123456789_123456789_123456789__123456789__123456789__123456789__123456789__123456789__123456789_.zip\123456789_123456789_123456789_123456789__123456789__123456789__123456789__123456789__123456789__123456789_\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\

Структура в архиве. Пример конечно синтезированный, но реальные аналоги встречаю очень часто.
К сообщению приложен файл: 123456789_12345.zip (29.5 Kb)


Замечательный Временно просто медведь , процентов на 20.

Сообщение отредактировал bmv98rus - Четверг, 09.05.2019, 19:38
 
Ответить
Сообщението есть этот метод позволит добраться до самой последней паки
C:\temp\123456789_123456789_123456789_123456789__123456789__123456789__123456789__123456789__123456789__123456789_.zip\123456789_123456789_123456789_123456789__123456789__123456789__123456789__123456789__123456789__123456789_\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\

Структура в архиве. Пример конечно синтезированный, но реальные аналоги встречаю очень часто.

Автор - bmv98rus
Дата добавления - 09.05.2019 в 19:35
InExSu Дата: Четверг, 09.05.2019, 20:21 | Сообщение № 19
Группа: Друзья
Ранг: Ветеран
Сообщений: 648
Репутация: 96 ±
Замечаний: 0% ±

Excel 2010, 365
Не плавный переход от Resume Next VBA к FileSystemObject.
Написать Вам обход всех вложенных каталогов ...?


Разработчик Битрикс24 php, Google Apps Script, VBA Excel Windows/Mac
 
Ответить
СообщениеНе плавный переход от Resume Next VBA к FileSystemObject.
Написать Вам обход всех вложенных каталогов ...?

Автор - InExSu
Дата добавления - 09.05.2019 в 20:21
bmv98rus Дата: Четверг, 09.05.2019, 20:27 | Сообщение № 20
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4107
Репутация: 768 ±
Замечаний: 0% ±

Excel 2013/2016
Михаил, ну упретесь в 260 символов и далее не пойдет. https://docs.microsoft.com/en-us....tation. Тоже будет при отказе доступа.


Замечательный Временно просто медведь , процентов на 20.
 
Ответить
СообщениеМихаил, ну упретесь в 260 символов и далее не пойдет. https://docs.microsoft.com/en-us....tation. Тоже будет при отказе доступа.

Автор - bmv98rus
Дата добавления - 09.05.2019 в 20:27
Мир MS Excel » Вопросы и решения » Вопросы по VBA » функция работы с файлами и папками (Макросы/Sub)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!