从封闭的,受保护的工作簿中获取价值(Excel VBA,Excel4Macro)

时间:2017-03-31 14:52:00

标签: excel vba excel-vba

我想从已关闭的受保护的工作簿中检索我选择的任何范围内的值(无需打开工作簿)。

我向任何认为这是一个重复的问题的人道歉,但我已经尽力搜索其他答案,而且从我所看到的,似乎没有人能找到适合这个问题的解决方案。 / p>

到目前为止,我使用ExecuteExcel4Macro()从封闭(但未受保护)的工作簿中获取值没有任何问题,但是,我查询的工作簿都受到保护(使用相同的密码)。< / p>

我可以使用Workbooks.Open("wb.xls", Password:="youllneverguessit") 但这只需要半秒钟即可完成,并且屏幕在执行时会闪烁。如果必须的话,这肯定是我可以使用的,但使用ExecuteExcel4Macro是 instant

当我使用ExecuteExcel4Macro()从已关闭的受保护的工作簿中获取值时,Excel会提示我输入密码,如下所示:

enter image description here

我徒劳地搜索了如何取消保护已关闭的工作簿,而我正在使用的Excel4Macro函数DEREF()没有可以提供密码的参数。

理想情况下,我希望有一个只需要几个参数的函数:工作簿路径,工作簿名称(如果需要),范围(可以是A1 / R1C1或命名范围)和密码验证。老实说,这些参数并不重要,我只需要能够以编程方式提供密码验证。

这就是我目前的情况:

1)使用ExecuteExcel4Macro()获取值:

使用此功能从已关闭且受保护的工作簿中获取值时,用户必须手动提供密码。

Function GetValue(FileName As String, _
                  FilePath As String, _
                  shtName As String, _
                  Rng As String) As Variant

    Dim rConvert As Range
    Dim pSht As Worksheet

'   Convert our Rng string variable to R1C1
    Set pSht = Workbooks("PERSONAL.XLSB").Sheets(1)
    Set rConvert = pSht.Range(Rng)
    Rng = rConvert.Address(ReferenceStyle:=xlR1C1)

'   Add a backslash to the file path if the user did not
    If Right(FilePath, 1) <> "\" Then FilePath = FilePath & "\"

    GetValue = ExecuteExcel4Macro( _
        "DEREF('" & FilePath & "[" & FileName & "]" & Code & "'!" & rng & ")")

End Function

2)打开工作簿,获取信息,关闭工作簿:

使用此功能从已关闭且受保护的工作簿中获取值时,用户无需手动执行任何操作,但需要一些时间才能执行。

    Function get_value(wb_path As String, _
                       sht as string, _
                       rng_name As String, _
                       pass As String) As Variant

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    Dim Rng as Range

    Set Rng = Workbooks.Open(wb_path, Password:=pass).Sheets(sht).Range(rng_name)

    get_value = Rng.Value
    wb.Close False

    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
End Function

提前谢谢!我很感激任何人的帮助,即使我们最终没有找到答案。

0 个答案:

没有答案