【问题标题】:Excel Userform VBA VLOOKUP from intranet file来自 Intranet 文件的 Excel Userform VBA VLOOKUP
【发布时间】:2017-01-21 01:42:39
【问题描述】:

我在用户表单上有一个 VBA Vlookup,我希望数据来自保存在 Intranet 上的 excel 文件。

当我尝试使用 VLookup 获取内网数据时,它的工作原理如下:

=VLOOKUP(I6,'https://intranet.private.private.uk/folder1/folder2/folder3/Documents/[Contract database.xlsm]AvailableContracts'!$H$9:$L$108,2,FALSE)

我想将该链接合并到下面的 VBA 中而不会收到错误消息:

Private Sub ContractsList_AfterUpdate()

If WorksheetFunction.CountIf(Sheet2.Range("A:A"), Me.ContractsList.Value) = 0 Then
    MsgBox "This contract is not on the list"
    Me.ContractsList.Value = ""
    Exit Sub
End If
'Lookup values based on first control
With Me
    .TextBox1 = Application.WorksheetFunction.VLookup(Me.ContractsList, Sheet2.Range("A5:E72"), 2, 0)
End With

End Sub

踢出错误的那一行是:

.TextBox1 = Application.WorksheetFunction.VLookup(Me.ContractsList, Sheet2.Range("A5:E72"), 2, 0)

当我在 excel VLookup 公式中使用上面的 Intranet 链接更改 Sheet2.Range("A5:E72") 时。

【问题讨论】:

  • 您遇到什么错误?很难在不知道的情况下提供帮助。另外,哪一行会让你出错?
  • 我在我的问题中添加了更多细节。谢谢
  • @Abigal 你会接受你在这里得到的任何解决方案吗?我看到你有很多问题,但很多没有积极的反馈,这将帮助你在未来获得更多关于 SO 的帮助
  • @ShaiRado 我总是提供反馈并感谢我得到的帮助。我只是还没有时间浏览这些答案。我会在适当的时候。谢谢一百万

标签: vba excel vlookup


【解决方案1】:

使用Application.Match 可以节省大量时间和代码行,请看下面的代码:

Private Sub ContractsList_AfterUpdate()

Dim WB As Workbook
Dim Sht As Worksheet

' set workbook to workbook location at internet (according to your formula)
Set WB = Workbooks.Open("https://intranet.private.private.uk/folder1/folder2/folder3/Documents/Contract database.xlsm")
Set Sht = WB.Worksheets("AvailableContracts")

With Me.ContractsList
    If Not IsError(Application.Match(.Value, Sht.Range("A:A"), 0)) Then '<-- value found in Column A
         'Lookup values based on first control
        Me.TextBox1 = Sht.Range("C" & Application.Match(.Value, Sheet2.Range("A:A"), 0)).Value
    Else '<-- value not found in Column A
        MsgBox "This contract is not on the list"
        .Value = ""
        Exit Sub
    End If
End With

End Sub

【讨论】:

  • 这是一个很好的答案,但在这种情况下,match 不会比 vlookup 快。数据范围不够大,这不是循环。虽然我确信它在技术上仍然更快,但在这里不会引起注意。
  • 也许吧,但总比使用 Countif 只是为了找到某个匹配项,然后还要一个 Vlookup,不是吗?
  • 我同意,它更好(因此我的 +1),我只是不认为更快是一个可行的理由。我个人会做一些完全不同的事情。工作表函数,或者在这种情况下匹配,往往只会让我头疼。不知道为什么。也许我只是没有正确使用它们。
  • @Shai,谢谢。这符合我的要求,但我想将其调整为对“AvailableContracts”选项卡所做的一些更改。
  • @Abigal 所以你应该关闭这篇文章,将其标记为“答案”。然后打开一个新帖子,其中包含更新的信息(和更新的代码)以及您想要实现的目标。否则,帖子永远不会被关闭,只是不断积累新的请求
【解决方案2】:

下面将打开工作簿并允许您像使用任何其他工作簿一样使用它。我更新了您的代码以包含新工作簿和您在上面的VLOOKUP 中提供的范围。我认为 VBA 不会让您像希望的那样进行查找。

Private Sub ContractsList_AfterUpdate()
Dim wb as Workbook

Set wb = Workbooks.Open("https://intranet.private.private.uk/folder1/folder2/folder3/Documents/Contract database.xlsm")
If WorksheetFunction.CountIf(Sheet2.Range("A:A"), Me.ContractsList.Value) = 0 Then
    MsgBox "This contract is not on the list"
    Me.ContractsList.Value = ""
    Exit Sub
End If
'Lookup values based on first control
With Me
    .TextBox1 = Application.WorksheetFunction.VLookup(Me.ContractsList, wb.Sheets("AvailableContractsRange").Range("H9:L108"), 2, 0)
End With

End Sub

【讨论】:

    【解决方案3】:

    这个怎么样?您还应该确定工作簿。

     Private Sub ContractsList_AfterUpdate()
    
            If WorksheetFunction.CountIf(Workbooks("Contract database").sheet2.Range("A:A"), Me.ContractsList.Value) = 0 Then
                MsgBox "This contract is not on the list"
                Me.ContractsList.Value = ""
            Exit Sub
    
            End If
            'Lookup values based on first control
            With Me
    
                .TextBox1 = Application.WorksheetFunction.VLookup(Me.ContractsList, Workbooks("Contract database").sheet2.Range("A5:E72"), 2, 0)
    
            End With
     End Sub
    

    【讨论】:

    • Vlookup 不起作用,因为您想引用不同的工作簿,但它不在函数中。
    【解决方案4】:

    您似乎已经注释掉了您的

    With Me
    

    行,但这可能只是您问题中的格式。

    了解您收到的错误消息会很有帮助。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多