Как получить доступ к данным из другой книги?

#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:

В вашем коде есть несколько проблем:

  1. Ошибка, которую вы получаете, связана с тем, что вы объявили Dim sheet As Worksheet и Worksheet является объектом, а объекты должны быть Set похожи

     Set sheet = wb.worksheet(1)
      
  2. Вы определили переменную value как Integer , а затем пытаетесь прочитать .Formula в нее, которая является a String . Integer Не может содержать формулу. Я думаю, вы хотели .Cells(1,1).Value вместо этого прочитать.

  3. В VBA нет return , вам нужно установить свою функцию Test = value

  4. Вы использовали процедуру 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