Excel VBA - значения не возвращаются из функции - PullRequest
0 голосов
/ 23 марта 2012

Я пытаюсь заставить функцию 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

1 Ответ

2 голосов
/ 23 марта 2012

Для дальнейшего пояснения комментария Тима Уильямса, передача значений ByRef означает, что ссылка на расположение (в памяти) переменных будет передана функции SelectColumn.Внутри функции SelectColumn, когда одна из этих переменных изменяется, функция будет изменять значение переменной по этой ссылке, то есть исходной переменной.

Когда вы передаете переменную ByVal, дубликат этой переменнойгенерироваться.Это существует только внутри функции SelectColumn.Если вы измените его внутри SelectColumn, он изменит этот дубликат, а не оригинал.

Редактировать:

Вам нужно будет изменить свои объявления.Когда вы объявляете следующее:

Dim strRow, strCol As Integer

Вы ожидаете, что strRow и strCol оба будут целыми числами, однако strRow - это вариант, strCol - целое число (это меня очень радует)Вам необходимо объявить их следующим образом:

Dim strRow as Integer, _
    strCol as integer

Аналогично ряду других ваших объявлений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...