我知道这种语言。 好的,我正在创建一个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
此过程旨在通过验证课程的四个学期和学习单位来过滤屏幕上显示的课程。但是,使用“作为字符串”,我有一个错误,并且没有, UEnseignement 为空,并且由于第一个条件从不成立,这使我的过滤器完全过时了。
代码和vars是法语(比利时学生),因此随时可以询问任何补充信息。
谢谢。
编辑:
这是调用此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
答案 0 :(得分:1)
VBA默认情况下传递参数 ByRef 。意思是,除非您指定 ByVal ,否则所有参数都将传递 ByRef 。
有两种方法可以将参数传递给子或函数。 (A) ByVal 可以创建一个新变量以用于子或函数中。最初只是原始文件的副本,但是如果在接收过程中对其进行了修改,则原始文件不会更改。 (B) ByRef VBA不会传递副本,而只是传递现有变量的地址。下级代码对该变量所做的任何更改将可用于调用过程。该变量的值可以由下属更改。
并非所有类型的变量都可以传递 ByVal 。通常,VBA要求必须向所有对象传递 ByRef 。因此,如果您尝试传递ListBox对象 ByVal ,VBA将会抱怨。也许,如果您关闭了变量声明,那么VBA不会让您这么细微的细节困扰您,只是在没有解释的情况下拒绝工作。
在您的代码中,所有参数都传递了 ByRef (默认情况下),似乎如此。您也可以通过将调用括在括号中来定义要传递的参数,例如A = 15: MySub (A)
。我们看不到您的函数调用,因此这是一种可能的错误来源。
假设情况并非如此,我建议您仍然关注ListBox。它可能不是MSForm种类。由于某些原因,VBA似乎无法通过 ByRef 。
其他参数似乎没有问题。但是在调用过程中可能会有混淆,您无意中将ListBox分配给了其中一个字符串。无论如何,您应该查看子程序及其调用者之间的交互。传递参数有误。
答案 1 :(得分:0)
UESelectionne
是调用子中的Variant,但是Ajouter
需要该参数的字符串。