Не поправим, а подтвердим, расширим, углУбим и обОзрим!
Declare используется тогда, когда вызываемая функция находится во внешней библиотеке.
ByVal и ByRef - два способа передачи параметров. Дело в том, что VB не поддерживает указатели явно, но всё-таки поддерживает. Передача параметра ByRef (она используется по умолчанию, если не указать способ передачи) - это передача указателя на значение. Принимающая процедура должна будет при каждом обращении к параметру получать его значение по указателю. Передача ByVal - передача не указателя, а самого значения. Принимающая функция не должна зырить в указатель, она сразу имеет значение. В языке C, к примеру, передача указателя на целое - int* a, а передача самого целого - int a. В VB передача указателя на целое - byref a (или просто а), передача самого целого - byval a.
Передача ByVal имеет смысл при числовых значениях, поскольку указатель обычно имеет размер 4 байта, передаваемое число (к примеру, Long) - тоже, поэтому можно сразу толкать его, так быстрее. А передача ByRef актуальна при передаче указателей на объекты, структуры и массивы (всё это нельзя передать ByVal), и, кроме того, в тех случаях, когда вызываемая процедура должна иметь возможность изменить переданный параметр так, чтобы это изменение возымело эффект в вызывающей процедуре.
vbskb_byval vbskb_byref
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас