Excel VBA – 值不从函数返回

我试图让Excel函数返回更多的参数,而不是最初传递给它。 我用Excel VBA已经有一段时间了,但我想知道是否有可能做到这一点? 这是我一直在开发的代码。

函数(“SelectColumn”)需要返回6个值,我已经把它们作为参数在下面的代码中。 非常感谢您的帮助。

Sub match_names3() Dim i As Integer Dim strRow, strCol As Integer Dim UpBound, LowBound As Range Dim strUpBoundRow, strUpBoundColumn, strLowBoundRow, strLowBoundColumn As Integer Dim CompareRange_alum_names As Range Dim CompareRange_bio_names As Range Dim alum As Variant, bio As Variant Dim AlumCount, BioCount As Long strRow = 2 strCol = 8 strUpBoundRow = 0 strUpBoundColumn = 0 strLowBoundRow = 0 strLowBoundColumn = 0 SelectColumn strRow, strCol, strUpBoundRow, strUpBoundColumn, strLowBoundRow, strLowBoundColumn Set CompareRange_alum_names = Worksheets("Sheet1").Range(Cells(strUpBoundRow, strUpBoundColumn) & ":" & Cells(strLowBoundRow, strLowBoundColumn)) strRow = 2 strCol = 17 strUpBoundRow = 0 strUpBoundColumn = 0 strLowBoundRow = 0 strLowBoundColumn = 0 SelectColumn strRow, strCol, strUpBoundRow, strUpBoundColumn, strLowBoundRow, strLowBoundColumn Set CompareRange_alum_names = Worksheets("Sheet1").Range(Cells(strUpBoundRow, strUpBoundColumn) & ":" & Cells(strLowBoundRow, strLowBoundColumn)) AlumCount = 2 For Each alum In CompareRange_alum_names BioCount = 2 For Each bio In CompareRange_bio_names If bio.Value = alum.Value Then Cells(AlumCount, 19).Value = Cells(BioCount, 16) End If BioCount = BioCount + 1 Next bio AlumCount = AlumCount + 1 Next alum End Sub Function SelectColumn(ByVal strRow As Integer, ByVal strCol As Integer, ByVal strUpBoundRow As Integer, ByVal strUpBoundColumn As Integer, ByVal strLowBoundRow As Integer, ByVal strLowBoundColumn As Integer) Dim UpBound As Range Dim LowBound As Range Worksheets("Sheet1").Cells(strRow, strCol).Select If ActiveCell.Row > 1 Then If IsEmpty(ActiveCell.Offset(-1, 0)) Then Set UpBound = ActiveCell Else Set UpBound = ActiveCell.End(xlUp) End If Else Set UpBound = ActiveCell End If strUpBoundRow = UpBound.Row strUpBoundColumn = UpBound.Column MsgBox ("strUpBoundRow " & strUpBoundRow) MsgBox ("strUpBoundColumn " & strUpBoundColumn) If ActiveCell.Row < Rows.Count Then If IsEmpty(ActiveCell.Offset(1, 0)) Then Set LowBound = ActiveCell Else Set LowBound = ActiveCell.End(xlDown) End If Else Set LowBound = ActiveCell End If strLowBoundRow = LowBound.Row strLowBoundColumn = LowBound.Column MsgBox ("strLowBoundRow " & strLowBoundRow) MsgBox ("strLowBoundColumn " & strLowBoundColumn) Range(UpBound, LowBound).Select Set UpBound = Nothing Set LowBound = Nothing End Function 

为了进一步阐明Tim Williams的评论,传递值ByRef意味着对variables的(内存)位置的引用将被赋予SelectColumn函数。 在SelectColumn函数内部,当其中一个variables被改变时,该函数将改变该引用的variables的值,即原始variables。

当您传递一个variablesByVal时,会生成该variables的副本。 这只存在于SelectColumn函数中。 如果您在SelectColumn中更改它,则会更改此重复内容,而不是原始内容。

编辑:

你需要改变你的声明。 当你声明如下:

 Dim strRow, strCol As Integer 

你期望strRow和strCol都是整数,但是,strRow是一个变体,strCol是一个整数(这使我非常喜欢)。 你需要声明如下:

 Dim strRow as Integer, _ strCol as integer 

与其他一些声明类似。