ByVal в VBA События

Я пытаюсь получить некоторые основания на VBA

Я знаю, что это довольно простой, но в событии рабочего листа, таких как изменение

Private Sub Worksheet_Change(ByVal Target as Range) 
    Target.Font.ColorIndex = 5 
End Sub

Я искал, что ByVal означает в этой ссылке

И я не могу понять смысл этого объяснения в помощь

Указывает, что аргумент передается таким образом, что вызываемая процедура или свойство не могут изменить значение переменной, лежащей в основе аргумента в вызывающем коде.

Ведьма действительно смутила меня...

Я также искал это в различных источниках и нашел это другое объяснение, которое погрузило меня глубже в темноту... это звучит так:

Если вы не хотите, чтобы вызываемая процедура изменяла какие-либо переменные, переданные в качестве аргументов, вы можете изменить список аргументов вызываемой процедуры, чтобы аргументы передавались ей по значению, а не по ссылке. Для этого перед аргументом укажите ключевое слово ByVal. Этот метод заставляет вызываемую подпрограмму работать с копией данных переданной переменной, а не с самими данными.

Что он имеет в виду "что аргументы передаются ему по значению, а не по ссылке"? Можете ли вы объяснить простым способом, что делает ByVal, я постоянно использую его, когда пишу код, и хочу знать каждый фрагмент кода, который пишу.

1 ответ

Решение

Вот очень хороший сайт с примерами, которые объясняют разницу между значением и ссылкой: http://www.physics.nyu.edu/grierlab/idl_html_help/procedures12.html Дайте мне знать, если это поможет! Если нет, я могу объяснить это более подробно, но я думаю, что веб-сайт адекватно освещает эту тему.

РЕДАКТИРОВАТЬ:

По значению означает, что оно установлено. Вы не можете вызвать это значение снова в другой функции. Ссылка означает, что это значение может быть вызвано снова. Таким образом, в примере, PRO ADD, A, BA = A + B RETURN END

A передается по ссылке, так как пользователь снова вызывает A, и он возвращается. Однако B вызывается по значению. В следующем примере ADD, A, 4 работает. A определяется как A = A + B. Таким образом, пользователь снова вызывает A и добавляет к нему B. Однако ADD, 4, A не работает, так как 4 является значением. поэтому 4 = A + B приведет к ошибке. Конечно, это может быть применено и к VBA.

Просто добавлю, причина, почему это различие имеет значение, с двух основных точек зрения:

Защита: при выборе между двумя механизмами передачи наиболее важным критерием является защита переменной от непреднамеренных изменений. При вызове ByRef процедура может возвращать значение вызывающему коду через этот аргумент. Другими словами, он может снова ссылаться на ту же переменную. ByVal защищает переменную от изменения процедурой. Так, например, если вы хотите, чтобы переменная = 4, несмотря ни на что, вы бы использовали ByVal.

Производительность. Механизм передачи может влиять на производительность, но обычно он незначителен. Единственным исключением является тип значения, передаваемый ByVal. В этом случае Visual Basic копирует все содержимое данных аргумента. Следовательно, для типа с большим значением, такого как структура, может быть более эффективно передать его ByRef.

Извините за длинный ответ, надеюсь, это поможет.

Другие вопросы по тегам