Почему у меня появляется эта ошибка: «тип аргумента ByRef не совместим»? - PullRequest
0 голосов
/ 18 апреля 2020

Я знал этот язык. Итак, я создаю приложение VBA, которое предназначено для управления распределением различных курсов в школе.

У меня есть эта ошибка, которая действительно "странная", поскольку я действительно не понимаю, почему я иметь это даже после нескольких исследований в Интернете. Там написано "Аргумент типа ByRef несовместим". Что действительно странно с этой ошибкой, так это то, что tt добавляется только когда я определяю тип моей переменной. Но если я не определю тип, он будет пустым, и это сделает функцию устаревшей. Как мне это исправить?

Private Sub Ajouter(LBConcernee As MSForms.ListBox, Colonne As String, _
                    Quadrimestre As String, UEnseignement As String)
    ' This statement is "active" when the user wants to display the courses of the learning unit he chose (Uenseignement)
    If UEnseignement = Range("C" & ActiveCell.Row) Then
        [...]
    End IF
    ' If the variable is empty, it means that all the courses havve to be displayed and no verification on the learning unit is done
    If Uenseignement = ""
        [...]
    End If
End Sub

Этот процесс направлен на фильтрацию курсов, напечатанных на экране, путем проверки квадриместра и единицы обучения курса. Но с «as string» у меня возникает ошибка, и без нее UEnseignement пусто, и это делает мой фильтр полностью устаревшим, поскольку первое условие никогда не выполняется.

Код и vars на французском (бельгийский студент), поэтому не стесняйтесь спрашивать любую дополнительную информацию.

Спасибо.

EDIT:

Вот код, который вызывает этот sub:

Private Sub Remplir_ListBox(Section As String, ColonneDepart As String, _
                  ListBoxConcernee As MSForms.ListBox, Bloc As Integer, _
                   Optional Quadri As String, Optional UESelectionne, _
                   Optional OptionCompta As String)

    Dim CellulePrecedente, ValeurBloc As String
    While Range(ColonneDepart & ActiveCell.Row) <> ""
        ' On ne réécrit pas 2 fois le/la même cours/UE
        If CellulePrecedente <> Range(ColonneDepart & ActiveCell.Row) Then
            ' On ajoute les cours pour le/s bloc/s demandés
            If Bloc = 0 Then
                Call Ajouter(ListBoxConcernee, ColonneDepart, Quadri, UESelectionnee)
            [...]
            End If
        End If
        Wend
End Sub

Ответы [ 2 ]

1 голос
/ 18 апреля 2020

VBA передает аргументы ByRef по умолчанию. Это означает, что если вы не укажете ByVal , все аргументы будут переданы ByRef .

Существует два способа передачи параметра в подпрограмму или функцию. (A) ByVal Можно создать новую переменную для использования в подпрограмме или функции. Изначально это просто копия оригинала, но если он был изменен в процедуре получения, оригинал не изменится. (B) ByRef Вместо того, чтобы делать копию, VBA просто передает адрес существующей переменной. Любые изменения, которые подчиненный код вносит в эту переменную, будут доступны вызывающей процедуре. Значение этой переменной может быть изменено подчиненным.

Не все переменные могут быть переданы ByVal . Как правило, VBA требует, чтобы все объекты были переданы ByRef . Таким образом, если вы попытаетесь передать объект ListBox ByVal VBA будет жаловаться. Возможно, если вы отключите объявление переменной, VBA не будет беспокоить вас такими незначительными подробностями и просто откажется работать без объяснения.

В вашем коде все аргументы передаются ByRef (по умолчанию ) или так кажется. Вы также можете определить аргумент для передачи ByVal , заключив вызов в скобки, например A = 15: MySub (A). Мы не видим ваш вызов функции, поэтому это один из возможных источников ошибок.

Предполагая, что это не тот случай, я предлагаю вам все же сосредоточиться на ListBox. Это может быть не из разновидности MSForm. По какой-то причине VBA не может передать его ByRef .

Другие параметры кажутся незаметными. Но, возможно, в вызывающей процедуре есть путаница, и вы непреднамеренно назначаете ListBox одной из строк. В любом случае, вы должны посмотреть на взаимодействие между сабвуфером и его абонентом. Что-то не так в передаче параметров.

0 голосов
/ 19 апреля 2020

UESelectionne - это вариант в вызывающей подпрограмме, но Ajouter ожидает строку для этого аргумента.

...