Доброго дня, уважаемые форумчане! Вопрос к спецам по VBA: подскажите, пожалуйста - какая разница в VBA между "vbLf" и "Chr(10)"? Можно ли применять что-то одно всегда или есть нюансы?)))
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Есть нюансы. Не всегда применяются именно эти разделители. Могут быть и vbCrLf(в Excel он чаще применяется) и оба отдельно. Плюс есть еще и вордовский Crh(13). В общем нет универсального - все зависит от данных. Можете свою функцию написать, которая все возможные(известные Вам) переносы будет заменять символом Chr(10). Это будет надежно и после сможете и Split использовать и все остальное.
Изменено: The_Prist - 18.10.2016 08:15:02(только сейчас заметил опечатку в vbCrLf(было vbCcLf))
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
The_Prist, vikttur, большое спасибо за исчерпывающую информацию! Вариант с автозаменой от The_Prist, учёл, но пока такой необходимости не было. А то я думал, что макрос может не сработать или сработает не так, как надо… Успокоили)))
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Jack Famous, разницы нет. Но я, например, если долго не работаю с константами vbLf, vbCr, то забываю, кто из них chr(10), а кто chr(13) ... а может, chr(12)? А название константы говорит само за себя. Кроме того, вызов функции это дополнительные затраты. Вы же не пишете chr(65) вместо "A" или sqr(16) вместо 4? Хотя в данном случае скорость практически одинакова:
Код
Sub test()
Const N = 5000000
Dim i&, s$, t!, j&
For j = 1 To 2
t = Timer
For i = 1 To N
s = vbLf
Next
Debug.Print Timer - t, "vblf"
t = Timer
For i = 1 To N
s = Chr(10)
Next
Debug.Print Timer - t, "chr(10)"
t = Timer
For i = 1 To N
s = Chr$(10)
Next
Debug.Print Timer - t, "Chr$(10)"
Next
End Sub
без всяких нюансов chr(10) это и есть vblf (это одно и тоже, один и тот же символ в множестве символов ASCII (American Standard Code for Information Interchange)) везде где уместно применить chr(10) вместо него можно использовать vblf и наоборот.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Ігор Гончаренко, спасибо за разъяснение)) Казанский, спасибо за проделанный детальный анализ и пояснения))) про константы согласен - удобно использовать именованные. Судя по скорости Chr(10) чуть быстрее, но, незначительно. А чем отличается "чистый" Chr(10) от Chr$(10)?…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
опять с точки зрения конечного результата - ничем не отличаются. я, как ленивый программист, никогда в жизни не стану использовать Chr$(10), если можно написать Chr(10) и получить тот же результат
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Ігор Гончаренко, так а чем они отличаются?))) я практически 0 в VBA))
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
а вот тут реально ни чем, это такие вольности VBA - к функции Chr можно обратиться и Chr и Chr$ (как и к другим функциям обработки строк, результатом работы которых есть строка)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Ігор Гончаренко написал: это такие вольности VBA - к функции Chr можно обратиться и Chr и Chr$
не совсем так, не совсем вольности Некоторые текстовые функции имеют перегрузки(mid,rigth,left, chr, instr и пр.). По умолчанию, без знака доллара, такая функция принимает в качестве аргумента некое значение и возвращает тип Variant, который потом самим VBA преобразовывается в String. А если ставить знак доллара - то VBA не делает лишних преобразований - сразу возвращается тип string. Если кратко принцип такой. И это в некоторых случаях может ускорить выполнение кода. Хотя на практике разница во времени от этого без нарочного тестирования незаметна.
JayBhagavan написал: Jack Famous , одно - константа, а другое - функция.
постараюсь учесть в будущем)
Цитата
JayBhagavan написал: Подводные камни могут быть при формировании текстовых файлов
при преобразовании в PDF перед некоторыми переносами (вроде Chr(13) - не разобрался) ставятся пустые квадратики. Думал, что ошибка в шрифтах, исправил с помощью макроса автозамены
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Отличная дискуссия - спасибо всем участвующим! Много полезного из личного опыта участников и интересные нюансы
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Казанский, спасибо большое!)) Только я что-то делаю не так. В справке Excel не нашёл, а в VBA F1 выбрасывает в браузер, где по этому запросу куча статей на английском
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
по написанию, вполне логично получается - первое "слеплено" из двух других))
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
А какой именно: vbCr или vbLf отвечает за непосредственно перенос строки? Возможно именно из-за того, что был "лишний" символ (каретка там или что-то в этом духе) у меня PDF выдавал абракадабру…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄