доступ к листам в другой книге из функции в vba в Excel - PullRequest
0 голосов
/ 24 января 2012

У меня есть две книги в Excel 2007, A и B.

В AI есть функция, которая должна получать определенные значения из книги B. Я не нахожу способа сделать это внутри функции (в пределах обычнойsub не проблема, но мне нужна функция, которая на самом деле более сложная, чем просто получение ячейки (1,1))

в A:

function getDataFromB(sheetName,row,col)
   x = Application.run ("E:\B.xlsm!getData",sheetName,row,col)
   getDataFromB = x
end getDataFromB

в B

function getData(sheetName,row,col)
   x=sheets(sheetName).cells(row,col)
   getData = x
end getData

Всякий раз, когда вызывается getData внутри B, он ищет имя листа в рабочей книге A, а не B. И запись

x = workbooks("E:\B.xlsm").sheets(sheetName).cells(row,col)

не работает

Как мне решить эту проблему?

1 Ответ

1 голос
/ 24 января 2012

УСТАРЕЛО И ПРОВЕРЕНО

Изменить

Функция getDataFromB (sheetName, row, col)
x = Application.run ("E: \B.xlsm! GetData ", sheetName, row, col)
getDataFromB = x end getDataFromB

на

Function getDataFromB(sheetName, row, col)
    Dim FilePath As String, FileName As String
    Dim wbTarget As Workbook
    Dim x As Variant
    Dim CloseIt As Boolean

    '~~> Set file name and path here.
    FileName = "B.xlsm"
    FilePath = "E:\"

    On Error Resume Next
    Set wbTarget = Workbooks(FileName)

    If Err.Number <> 0 Then
        '~~> Open the workbook
        Err.Clear
        Set wbTarget = Workbooks.Open(FilePath & "\" & FileName)
        CloseIt = True
    End If

    '~~> Check and make sure workbook was opened
    If Err.Number = 1004 Then
        MsgBox "File does not exist!"
        Exit Function
    End If

    On Error GoTo 0

    x = Application.Run(wbTarget.Name & "!getData", sheetName, row, col)

    getDataFromB = x

    If CloseIt = True Then
        '~~> If the target workbook was opened by the macro, close it
        wbTarget.Close savechanges:=False
    Else
        '~~> If the target workbook was already open, reactivate this workbook
        ThisWorkbook.Activate
    End If
End Function

Также в файле B Измените код на

Function getData(sheetName,row,col)
   x=sheets(sheetName).cells(row,col)
   getData = x
End Function

Вам нужно добавить «End Function», как я делал выше.

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