#excel #vba
#excel #vba
Вопрос:
Моя функция принимает книгу в качестве входных данных. Но я не могу повторить значения в книге. Я получаю сообщение об ошибке как «Переменная объекта не установлена». P.S: Я не могу использовать диапазон, поскольку диапазон неизвестен.
Sub Test (wb as workbook)
Dim sheet as worksheet
Dim value as Integer
sheet = wb.worksheet(1)
value = sheet.Cells(1,1).Formula
return value
End sub
Комментарии:
1.
Set sheet = wb.Worksheets(1)
….2.
Return
В VBA нет.3. Почему вы читаете в ячейке
.Formula
, а не в ней.Value
?4. Вы также можете создать строку, представляющую диапазон…
Range("A" amp; 1)
— но использованиеCells
не имеет никакого отношения к вашей проблеме.5. На самом деле этот код имеет несколько больше проблем, чем опечатка (@ закрыть избирателей), поэтому я написал ответ.
Ответ №1:
В вашем коде есть несколько проблем:
-
Ошибка, которую вы получаете, связана с тем, что вы объявили
Dim sheet As Worksheet
иWorksheet
является объектом, а объекты должны бытьSet
похожиSet sheet = wb.worksheet(1)
-
Вы определили переменную
value
какInteger
, а затем пытаетесь прочитать.Formula
в нее, которая является aString
.Integer
Не может содержать формулу. Я думаю, вы хотели.Cells(1,1).Value
вместо этого прочитать. -
В VBA нет
return
, вам нужно установить свою функциюTest = value
-
Вы использовали процедуру
Sub
, а не функцию, поэтому она не может возвращать никаких значений. Вам нужно изменить его наFunction
Я думаю, у вас должно получиться что-то вроде этого:
Public Function ReadMyValue(ByVal wb As Workbook) As Double 'or Long
Dim ws As Worksheet
Set ws = wb.Worksheet(1) 'use set for objects!
Dim Value As Double 'or Long !!! but the same as your function is declared !!!
Value = ws.Cells(1, 1).Value
ReadMyValue = Value 'return the value to your function
End Function
И вы можете протестировать это как:
Public Sub TestMyFunction()
Debug.Print ReadMyValue(ThisWorkbook) 'will output the value of A1 of the first worksheet in this workbook.
End Sub