Страницы: 1 2 След.
RSS
Применение операторов vbLf и Chr(10) в VBA
 
Доброго дня, уважаемые форумчане! Вопрос к спецам по VBA: подскажите, пожалуйста - какая разница в VBA между "vbLf" и "Chr(10)"? Можно ли применять что-то одно всегда или есть нюансы?)))
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Есть нюансы. Не всегда применяются именно эти разделители. Могут быть и vbCrLf(в Excel он чаще применяется) и оба отдельно. Плюс есть еще и вордовский Crh(13). В общем нет универсального - все зависит от данных. Можете свою функцию написать, которая все возможные(известные Вам) переносы будет заменять символом Chr(10). Это будет надежно и после сможете и Split использовать и все остальное.
Изменено: The_Prist - 18.10.2016 08:15:02 (только сейчас заметил опечатку в vbCrLf(было vbCcLf))
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Я всегда применяю Chr(10). Проблем пока что не замечал. Пробовал и vbLf, но как-то не прижился он.
 
The_Prist, vikttur, большое спасибо за исчерпывающую информацию!
Вариант с автозаменой от The_Prist, учёл, но пока такой необходимости не было. А то я думал, что макрос может не сработать или сработает не так, как надо… Успокоили)))
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, разницы нет. Но я, например, если долго не работаю с константами vbLf, vbCr, то забываю, кто из них chr(10), а кто chr(13) ... а может, chr(12)? :oops:
А название константы говорит само за себя.
Кроме того, вызов функции это дополнительные затраты. Вы же не пишете 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
Код
 0.921875     vblf
 1.0625       chr(10)
 0.875        Chr$(10)
 0.859375     vblf
 1            chr(10)
 0.890625     Chr$(10)
 
без всяких нюансов chr(10) это и есть vblf (это одно и тоже, один и тот же символ в множестве символов ASCII (American Standard Code for Information Interchange))
везде где уместно применить chr(10) вместо него можно использовать vblf и наоборот.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, спасибо за разъяснение))
Казанский, спасибо за проделанный детальный анализ и пояснения))) про константы согласен - удобно использовать именованные. Судя по скорости Chr(10) чуть быстрее, но, незначительно. А чем отличается "чистый" Chr(10) от Chr$(10)?…
Изменено: Jack Famous - 11.10.2016 15:18:57
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
опять с точки зрения конечного результата - ничем не отличаются.
я, как ленивый программист, никогда в жизни не стану использовать Chr$(10), если можно написать Chr(10) и получить тот же результат
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, так а чем они отличаются?))) я практически 0 в VBA))
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, одно - константа, а другое - функция.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Если я хочу начать с новой строки, без разницы что использовать:
vbCr
vbLf
vbCrLf
vbNewLine

?
 
Цитата
Бахтиёр написал: Если я хочу начать с новой строки
Смотря где.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Цитата
JayBhagavan написал:  Смотря где.
Например хочу увидеть реквизиты выделенного диапазона:
Код
Sub ssss()
MsgBox "Адрес: " & Selection.Address & vbLf & vbLf & _
"Количество ячеек: " & Selection.Count & vbLf & vbLf & _
"Количество областей: " & Selection.Areas.Count
End Sub
Без разницы что использовать в этом коде: vbCr, vbLf, vbCrLf или vbNewLine ?
 
Цитата
так а чем они отличаются?
а вот тут реально ни чем, это такие вольности VBA - к функции Chr можно обратиться и Chr и Chr$ (как и к другим функциям обработки строк, результатом работы которых есть строка)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Бахтиёр, у Вас есть пример, почему бы на нём не поэкспериментировать?

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Цитата
JayBhagavan написал: почему бы на нём не поэкспериментировать?
На этом примере все варианты возвращают одно и то же.
Просто хотелось узнать, может имеются подводные камни?
 
Цитата
Бахтиёр написал: может имеются подводные камни?
Подводные камни могут быть при формировании текстовых файлов с участием виновников торжества и восприятия их другими программами, например.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Цитата
я, как ленивый программист, никогда в жизни не стану использовать Chr$(10), если можно написать Chr(10)
Лениться нужно в меру )
Мне бабушка нашептала, что при текстовых делах оператор$ бьістрее оператор
 
Цитата
Ігор Гончаренко написал:
это такие вольности VBA - к функции Chr можно обратиться и Chr и Chr$
не совсем так, не совсем вольности :) Некоторые текстовые функции имеют перегрузки(mid,rigth,left, chr, instr и пр.). По умолчанию, без знака доллара, такая функция принимает в качестве аргумента некое значение и возвращает тип Variant, который потом самим VBA преобразовывается в String. А если ставить знак доллара - то VBA не делает лишних преобразований - сразу возвращается тип string. Если кратко принцип такой. И это в некоторых случаях может ускорить выполнение кода.
Хотя на практике разница во времени от этого без нарочного тестирования незаметна.
Изменено: The_Prist - 11.10.2016 18:00:57
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
JayBhagavan написал:  Jack Famous , одно - константа, а другое - функция.
постараюсь учесть в будущем)
Цитата
JayBhagavan написал: Подводные камни могут быть при формировании текстовых файлов
при преобразовании в PDF перед некоторыми переносами (вроде Chr(13) - не разобрался) ставятся пустые квадратики. Думал, что ошибка в шрифтах, исправил с помощью макроса автозамены
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Отличная дискуссия - спасибо всем участвующим! Много полезного из личного опыта участников и интересные нюансы  :idea:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Про различия функций со знаком $ и без него в хелпе есть статья: F1 - Returning Strings from Functions
 
Казанский, спасибо большое!)) Только я что-то делаю не так. В справке Excel не нашёл, а в VBA F1 выбрасывает в браузер, где по этому запросу куча статей на английском  :(
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
The_Prist, Казанский, спасибо!

сделал себе засечку на память в виде доллара ($). Теперь должно отложиться))
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Таким кодом:
Код
Sub ddd()
Cells(1) = "q" & vbLf & vbLf & "q"
Cells(2) = "q" & vbCr & vbCr & "q"
Cells(3) = "q" & vbCrLf & vbCrLf & "q"
Cells(4) = "q" & vbNewLine & vbNewLine & "q"
End Sub
записал в ячейки значения.

Проверил формулами:
1) ячейка=ячейка
2) =СОВПАД(ячейка;ячейка)

Получается, vbCrLf =  vbNewLine
А остальные - это разные значения.
У vbCr даже вид получился другой.

Измерил длину строки через ДЛСТР():
Cells(1) - 4
Cells(2) - 4
Cells(3) - 6
Cells(4) - 6

И насколько я понял, vbLf - это тоже самое, что и нажать внутри ячейки Alt+Enter
Изменено: Бахтиёр - 18.10.2016 09:36:15
 
Бахтиёр, благодарю за эксперимент))
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
vbNewLine - это два символа!
 
Цитата
Hugo:  vbNewLine - это два символа!
Да, насколько понял, vbNewLine = vbCrLf = vbCr & vbLf

Попробовал, в окне Immediate:
? vbNewLine = vbCr & vbLf
? vbNewLine = vbCrLf

оба дают True
 
Цитата
Бахтиёр написал:
vbCrLf = vbCr & vbLf
по написанию, вполне логично получается - первое "слеплено" из двух других))
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
А какой именно: vbCr или vbLf отвечает за непосредственно перенос строки? Возможно именно из-за того, что был "лишний" символ (каретка там или что-то в этом духе) у меня PDF выдавал абракадабру…
Изменено: Jack Famous - 18.10.2016 09:49:59
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1 2 След.
Читают тему
Наверх