Несоответствие типа VBA, ошибка времени выполнения 13

Я только что написал небольшую функцию VBA, которая выглядит так, как показано ниже. В качестве вывода функции я хотел бы получить диапазон

Public Function selectRows(col As String) As Range

Dim begin, fini As Integer
Set TopCell = Cells(1, col)
Set BottomCell = Cells(Rows.Count, col)
If IsEmpty(TopCell) Then Set TopCell = TopCell.End(xlDown)
If IsEmpty(BottomCell) Then Set BottomCell = BottomCell.End(xlUp)
begin = TopCell.Row
fini = BottomCell.Row
Set selectRows = Activesheet.Range(col & begin & ":" & col & fini)
End Function

Затем я получаю ошибку несоответствия типа, когда он пытается установить output =Range(...)

Не могли бы вы помочь мне решить эту проблему, заранее спасибо


person Eva    schedule 21.12.2011    source источник
comment
Функции возвращают значения. Но вы ничего не устанавливаете selectRows в этой функции.   -  person JimmyPena    schedule 22.12.2011


Ответы (2)


Очень плохая идея использовать зарезервированное слово, такое как столбец, в качестве имени вашей переменной. Если вы хотите, чтобы функция возвращала диапазон, вы хотите:

Set selectRows = Range(scol & TopCell.Row & ":" & scol & BottomCell.Row)

Скорее, чем:

Set output = Range(column & TopCell.Row & ":" & column & BottomCell.Row)

Есть и другие проблемы, например, если столбец пуст.

person Fionnuala    schedule 21.12.2011
comment
Привет Рему, к сожалению, я все еще получаю сообщение об ошибке? Столбец не пуст, у меня есть значения в столбце - person Eva; 22.12.2011
comment
@ Ева Нет, как только я заменю все ссылки на столбец. Добавьте точку останова (F9) и проверьте значения topcell и bottomcell. - person Fionnuala; 22.12.2011
comment
Да, у меня есть значения для верхней и нижней ячеек, но следующая команда вызывает ошибку несоответствия типов: Set selectRows = Range(....) - person Eva; 22.12.2011
comment
@Eva Что произойдет, если вы укажете перед диапазоном рабочий лист? Sheet1.range или Activesheet.Range? - person Fionnuala; 22.12.2011
comment
Я отредактировал код выше в соответствии с вашими предложениями, как вы можете видеть, но все равно назначение диапазона для outp не работает, я не понимаю ;-) - person Eva; 22.12.2011
comment
Откройте новую книгу, введите несколько значений в столбец, вставьте свою функцию и запустите ее. Кстати, функция по-прежнему не будет иметь возвращаемого значения, но пока оставьте это. - person Fionnuala; 22.12.2011
comment
Возможно, вам будет проще в последней строке использовать конструкцию ActiveSheet.Range(cells(col,begin),cells(col,fini)) - person Jesse; 22.12.2011
comment
Небольшое примечание: begin не печатается. Вам нужно использовать Dim begin как Integer, fini As Integer в VBA. - person Jesse; 22.12.2011

Вы вводите ввод, который больше, чем количество столбцов, которые у вас есть. Например, в моем Excel 2003 есть столбцы IV, когда я ввожу IW, он выдает Error 13. Я оставлю свой код ниже, если вы хотите почистить свой код. Некоторая обработка ошибок поможет, чтобы это не повторилось.

Public Function selectRows(ByVal sColumn As String) As Range

    Dim lColumn As Long
    Dim TopCell As Range, BottomCell As Range
    Dim wks As Worksheet

    Set wks = ActiveSheet

    lColumn = wks.Range(sColumn & "1").Column

    Set TopCell = wks.Cells(1, lColumn)
    Set BottomCell = wks.Cells(Rows.Count, lColumn)
    If IsEmpty(TopCell) Then Set TopCell = TopCell.End(xlDown)
    If IsEmpty(BottomCell) Then Set BottomCell = BottomCell.End(xlUp)
    Set selectRows = wks.Range(TopCell, BottomCell)

End Function
person Jon49    schedule 22.12.2011