Здравствуйте уважаемые форумчане. В макросе идёт проверка на существование двух файлов. Подскажите как можно сократить этот код, он работает, но выглядит не очень. почему-то бесит
Код
******************
If Dir(N_S) <> "" Then
GoTo met
Else
MsgBox "Файл по пути " & N_S & " не найден"
Exit Sub
End If
met:
If Dir(N_Bes) <> "" Then
GoTo met_
Else
MsgBox "Файл по пути " & N_Bes & " не найден"
Exit Sub
End If
met_:
******************
If Dir(N_S) = "" Then
MsgBox "Файл по пути " & N_S & " не найден"
Exit Sub
End If
If Dir(N_Bes) = "" Then
MsgBox "Файл по пути " & N_Bes & " не найден"
Exit Sub
End If
'дальше код
If Dir(N_S) = "" Then MsgBox "Файл по пути " & N_S & " не найден": Exit Sub
If Dir(N_Bes) = "" Then MsgBox "Файл по пути " & N_Bes & " не найден": Exit Sub
' сама метка не нужна, а тут код, который должен был следовать за меткой met_:
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
If Dir(N_S) = "" Then MsgBox "Файл по пути " & N_S & " не найден": Exit Sub
If Dir(N_Bes) = "" Then MsgBox "Файл по пути " & N_Bes & " не найден": Exit Sub
' сама метка не нужна, а тут код, который должен был следовать за меткой met_:
Потому что это пример, как не стоит использовать метки.
Код из #5 (для большего числа проверок) или из #6 (для примера) являются самыми оптимальными с точки зрения логики и краткости. #3 же — это тот же #6, но в классической полной записи.
#5 более кратко
Код
For Each vFile In Array(N_S, N_Bes)
If Dir(vFile) = "" Then MsgBox "Файл по пути " & vFile & " не найден": Exit Sub
Next vFile
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
посчитайте) меньше, но вообще из-за строк — меньше строк проще читать. Главное следить, чтобы строки не были уж слишком большие (это вкусовщина).
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
написал: если дело в одной строке, тогда для чего? )
я не пишу макросов длиннее 40 строк и практически не пишу строк длиннее 80 символов (это обычно помещается на один экран, и когда читаешь такой макрос не нужно помнить что было написано в 3-х предыдущих экранах т.е. делаю так потому, что мне так удобно)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Microsoft советует обратное: Используйте только одну инструкцию для каждой строки. Не используйте символ разделителя строк Visual Basic Соглашения о написании кода в Visual Basic
А я вот, например, почти всегда пишу именно в полной классической записи. Никаких записей в одну строку. На работе бывают коды по несколько тысяч строк и я привык читать их именно по классической записи, лесенкой - написан у меня, например, If, значит, где-то ниже первая запись на этом же уровне отступов относится именно к этому If. Но это, конечно, дело привычки
а это разве не касается только кода, который они сами приводят в качестве примеров? Посмотрел - не только — смысл в том, что "мы так делаем и вам советуем"
Ага, шас))
Цитата
_Boroda_: А я вот, например, почти всегда пишу именно в полной классической записи
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Jack Famous написал: гораздо проще и не менее понятно записать
скорее всего это и относится тем исключениям
Цитата
_Boroda_ написал: почти всегда пишу именно в полной классической записи
Еще один классический вариант
Код
If Dir(N_S) = "" Then
MsgBox "Файл по пути " & N_S & " не найден"
Exit Sub
ElseIf Dir(N_Bes) = "" Then
MsgBox "Файл по пути " & N_Bes & " не найден"
Exit Sub
End If
как минимум, Exit Sub напрашивается в продолжение через двоеточие, а не одной строкой (для меня). Некоторые и Next [Variable] в цикле For не пишут, хотя уж тут сокращение не имеет смысла, а потеря восприятия (особенно, во вложенных циклах) есть
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
тут имеет смысл (наверное) перестроиться, поскольку код можно писать намного (в 2 раза) короче без сокращений, потери смысла и скорости:
Пример
Код
' эту ветку
If a = 1 Then
If b = 1 Then
If c = 1 Then
' тело
End If
End If
End If
' можно заменить на эту
If a = 1 And b = 1 And c = 1 Then
' … тело
End If
' однако, эта запись будет, хоть и длиннее второй, но короче первой, с сохранением её [первой] скорости (вторая медленнее) и НЕ МЕНЕЕ понятная
If a <> 1 Then Exit Sub
If b <> 1 Then Exit Sub
If c <> 1 Then Exit Sub
' тело
Разумеется, при простых проверках, разница в скорости не будет заметна, но так бывает далеко не всегда.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
с этим согласен, с остальным — зависит от случая Ну и про Select Case не забываем, который незаметно дольше If, но для проверки одного условия/значения на множество вариантов — удобнее всего
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
SelectCase true
case Dir(N_S) = ""
MsgBox "Файл по пути " & N_S & " не найден"
Exit Sub
case Dir(N_Bes) = ""
MsgBox "Файл по пути " & N_Bes & " не найден"
Exit Sub
end select