2013-11-24 3 views
0

Я создал пользовательскую функцию в Excel с помощью VBA. Я пытаюсь получить данные из другой книги, используя команду Workbooks.Open(path). Вот мой код:Excel VBA Не удается получить доступ к листу на внешней рабочей книге

Option Explicit 

Function TestFunction() As String 
    mySub 
    TestFunction = "Success." 
End Function 


Sub mySub() 

    Dim path As String 
    Dim wk As Workbook 

    path = "C:\Users\jg\Desktop\machine_data.xlsm" 
    Set wk = Workbooks.Open(path) 

    Dim ws As Worksheet 
    Set ws = wk.Sheets(1) 
    Debug.Print ws.Range("A2") 
End Sub 


Sub Test() 
    Debug.Print (TestFunction()) 
End Sub 

Теперь моя проблема заключается в следующем:

Когда я бегу Sub Test() в среде VBA из Excel все работает, как и планировалось. machine_data.xlsm открывается, и поле A2 появляется в отладке.

Как только я перехожу к книге, где я определил этот модуль и введите =TestFunction() в ячейку, я получаю #VALUE!. Файл также не открывается.

Если я комментирую эти две строки:

Set ws = wk.Sheets(1) 
    Debug.Print ws.Range("A2") 

клетка покажет Success!, но файл еще не открыт.

Что я делаю неправильно? Обе книги - .xlsm файлов. Я использую Microsoft Office Excel 2007.

+1

UDF может только вернуть значение - посмотрите [This] (http://stackoverflow.com/questions/6045826/excel-vba-function-to-turn-activecell-to-bold). – DaveU

+0

@DaveU Я прочитал об этом «да», но не открывает внешнюю книгу и только читает ее и в зависимости от значений чтения, возвращающих другое значение? Потому что кажется, что это даже не возможно. Я не изменяю никаких значений в файле 'machine_data.xlsm'. – Octoshape

+0

@DaveU Nevermind Я выбрал другое обходное решение (см. Мой собственный ответ ниже) – Octoshape

ответ

0

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

0

Просто выбросьте все из mySub в тестовую функцию, и если все будет успешно, функция тестирования вернет значение ячейки. Итак testFunc = ws.Range ("A2").

+0

По-прежнему получайте '#VALUE!' При копировании 'mySub' в' TestFunction() '. – Octoshape

Смежные вопросы