Reputation: 502
I'm trying to get an Excel function to return more arguments than are passed to it initially. It's been a while since I used Excel VBA, but I was wondering if it is possible to do this? Here is the code I've been developing.
The function ("SelectColumn") needs to return 6 values, and I've got them as arguments in the code below. Many thanks for any help.
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
Upvotes: 0
Views: 3965
Reputation: 2718
To further elucidate Tim Williams' comment, passing values ByRef means a reference to the (memory) location of the variables will be given to the SelectColumn function. Inside the SelectColumn function, when one of those variables is changed, the function will change the value of the variable at that reference, i.e. the original variable.
When you pass a variable ByVal, a duplicate of that variable is generated. This exists only within the SelectColumn function. If you change it inside SelectColumn it changes this duplicate, rather than the original.
Edit:
You'll need to change your declarations. When you declare the following:
Dim strRow, strCol As Integer
You expect strRow and strCol to both be integers, however, strRow is a variant, strCol is an integer (This goads me greatly). You need to declare these as follows:
Dim strRow as Integer, _
strCol as integer
Similarly with a number of your other declarations.
Upvotes: 2