2017-02-07 7 views
2

Что я здесь делаю неправильно?Аргумент аргумента должен быть ByRef

Sub Main() 

Dim patients() As String 

' Some code to populate the patients array, works fine 

CalculateScores (patients) ' Array argument must be ByRef compile error 

End Sub 



Sub CalculateScores(patients As String) 

End Sub 

Если я изменяю пациент варианта массива в Main и параметры CalculateScores он работает нормально, но я не могу видеть логику не в состоянии передать строку. По умолчанию это ByRef, поэтому я знаю, что чего-то не хватает.

Я могу использовать вариант уверенно, но он чувствует себя взломанным.

+2

Параметр 'patient' не является массивом для начинающих. – Comintern

+1

Если это опечатка в вопросе, вам просто нужно [удалить parens] (http://stackoverflow.com/documentation/vba/1179/procedure-calls/3818/this-is-confusing-why-not-just - скользящие-скобки-скобки) из вызова 'CalculateScores':' CalculateScores patient' – Comintern

+1

Чтобы уточнить, что сказал @Comintern, 'CalculateScores' ожидает реальную строку, а не массив строк. – R3uK

ответ

2

Когда вы сделаете это:

DoSomething (expression) 

Вы принуждая expression быть оценены как значение и передается ByVal, независимо от того, явно говорит параметр это передается ByRef. В то время как это более или менее не влияет на большую часть времени, оно укусит вас в тылу, когда вы пытаетесь передать массив или ссылку на объект.

Опустите круглые скобки.

DoSomething expression 

Теперь, есть и другие проблемы, связанные с вашим кодом: можно передать массив строк в качестве параметра String; что не может работать. Сделайте параметр массивом или Variant, и я бы предложил указать параметр явно как ByRef, для ясности.

+0

Спасибо. Просто чтобы уточнить для других - мой параметр должен был быть строкой(), а не строкой, как предлагает Мат-Кружка. – Absinthe