Vba 使用用户表单从当前打开的工作簿中检索外部工作簿中的信息

Vba 使用用户表单从当前打开的工作簿中检索外部工作簿中的信息,vba,excel,userform,Vba,Excel,Userform,我为userform编写了代码,该代码允许我在工作簿的Excel工作表中使用项目ID检索信息 但是,现在我需要根据用户输入搜索在名为活动主文件的外部工作簿中找到的项目 然后,它将检索信息并将其放入userform,然后使用add命令按钮将信息插入当前工作簿中名为projecttrackerfile的新行中 问题是我不确定从外部工作簿检索信息到当前打开工作簿中的用户表单的代码。 我有两本作业本。此用户表单位于名为project tracker的工作簿中,而我希望根据其项目ID检索信息的外部工作簿名

我为userform编写了代码,该代码允许我在工作簿的Excel工作表中使用项目ID检索信息

但是,现在我需要根据用户输入搜索在名为
活动主文件的外部工作簿中找到的项目

然后,它将检索信息并将其放入userform,然后使用add命令按钮将信息插入当前工作簿中名为projecttrackerfile的新行中

问题是我不确定从外部工作簿检索信息到当前打开工作簿中的用户表单的代码。

我有两本作业本。此用户表单位于名为
project tracker
的工作簿中,而我希望根据其项目ID检索信息的外部工作簿名为
active master project

这是命令搜索按钮的代码,用于在名为
项目跟踪器
的工作簿中执行检索和搜索:

Private Sub CommandSearchButton2_Click()

    Dim lastrow
    Dim ProjCode As String
    Dim LabelProjName As String
    Dim LabelObjective As String
    Dim LabelProjSponsor As String
    Dim LabelProjSponsorNew As String
    Dim LabelProjManager As String
    Dim LabelRegulatory As String
    Dim LabelRiskLvl As String
    Dim LabelDatePar As Date
    Dim LabelCostPar As Long
    Dim LabelAffectCust As String
    Dim LabelCustNonRetail As String
    Dim LabelCustRetail As String
    Dim LabOutsourcingImp As String
    Dim LabelKeyUpdate As String
    Dim LabelSector As String



    searchRow = 0
        lastrow = Sheets("Program Status Summary").Range("B" & Rows.Count).End(xlUp).Row
        ProjCode = TextBoxProjCode.Text

     For currentrow = 4 To 100

        If Cells(currentrow, 2).Text = ProjCode Then

            searchRow = currentrow

            TextBoxProjCode.Text = Cells(currentrow, 2).Text
            TextBoxProjName.Text = Cells(currentrow, 3)
            TextBoxSector.Text = Cells(currentrow, 4)
            TextBoxObjective.Text = Cells(currentrow, 5)
            TextBoxProjSponsor.Text = Cells(currentrow, 7)
            TextBoxProjSponsorNew.Text = Cells(currentrow, 8)
            TextBoxProjM.Text = Cells(currentrow, 6)
            TextBoxRegulatory.Text = Cells(currentrow, 20)
            TextBoxRiskLvl.Text = Cells(currentrow, 13)
            TextBoxDatePar.Text = Cells(currentrow, 12)
            TextBoxCostPar.Text = Cells(currentrow, 10)
            TextBoxAffectCust.Text = Cells(currentrow, 15)
            TextBoxCustNonRetail.Text = Cells(currentrow, 16)
            TextBoxCustRetail.Text = Cells(currentrow, 17)
            TextBoxOutsourcingImp.Text = Cells(currentrow, 19)
            TextBoxKeyUpdate.Text = Cells(currentrow, 18)

        End If

    Next currentrow

TextBoxProjCode.SetFocus

End Sub

使用多个工作簿的最佳方法是使用对象变量

Dim WbPT As Workbook, _
    WbAMP As Workbook, _
    WsPSS As Worksheet, _
    Ws As Worksheet

'----The SET keyword is only to attribute value to an object variable
Set WbPT = Workbooks("project tracker")
Set WbAMP = Workbooks("active master project")

Set WsPSS = WbPT.Sheets("Program Status Summary")

'----Use with to have the reference availaible starting with a simple dot "."
With WsPSS
    MsgBox .Cells(1, "B")
End With
如果我理解得很好,您的代码应该是这样的:

Private Sub CommandSearchButton2_Click()

    Dim lastrow
    Dim ProjCode As String
    Dim LabelProjName As String
    Dim LabelObjective As String
    Dim LabelProjSponsor As String
    Dim LabelProjSponsorNew As String
    Dim LabelProjManager As String
    Dim LabelRegulatory As String
    Dim LabelRiskLvl As String
    Dim LabelDatePar As Date
    Dim LabelCostPar As Long
    Dim LabelAffectCust As String
    Dim LabelCustNonRetail As String
    Dim LabelCustRetail As String
    Dim LabOutsourcingImp As String
    Dim LabelKeyUpdate As String
    Dim LabelSector As String

    Dim WbPT As Workbook, _
        WbAMP As Workbook, _
        WsPSS As Worksheet, _
        Ws As Worksheet

    Set WbPT = Workbooks("project tracker")
    Set WbAMP = Workbooks("active master project")

    Set WsPSS = WbPT.Sheets("Program Status Summary")

    With WsPSS
        searchRow = 0
        lastrow = .Range("B" & .Rows.Count).End(xlUp).Row
        ProjCode = TextBoxProjCode.Text

         For currentrow = 4 To lastrow
            If .Cells(currentrow, 2).Text = ProjCode Then
                searchRow = currentrow

                TextBoxProjCode.Text = .Cells(currentrow, 2).Text
                TextBoxProjName.Text = .Cells(currentrow, 3)
                TextBoxSector.Text = .Cells(currentrow, 4)
                TextBoxObjective.Text = .Cells(currentrow, 5)
                TextBoxProjSponsor.Text = .Cells(currentrow, 7)
                TextBoxProjSponsorNew.Text = .Cells(currentrow, 8)
                TextBoxProjM.Text = .Cells(currentrow, 6)
                TextBoxRegulatory.Text = .Cells(currentrow, 20)
                TextBoxRiskLvl.Text = .Cells(currentrow, 13)
                TextBoxDatePar.Text = .Cells(currentrow, 12)
                TextBoxCostPar.Text = .Cells(currentrow, 10)
                TextBoxAffectCust.Text = .Cells(currentrow, 15)
                TextBoxCustNonRetail.Text = .Cells(currentrow, 16)
                TextBoxCustRetail.Text = .Cells(currentrow, 17)
                TextBoxOutsourcingImp.Text = .Cells(currentrow, 19)
                TextBoxKeyUpdate.Text = .Cells(currentrow, 18)
            End If
        Next currentrow
    End With

    TextBoxProjCode.SetFocus

End Sub

我正要发布我的回复。我只会在OP有
lastrow=Sheets(“程序状态摘要”).Range(“B”)的地方添加它。
我会在Sheets语句之前添加
thiswook.
以引用代码所在的工作簿。您好,我尝试了您给出的代码,但在“Set WbPT=Workbooks”(“项目跟踪器”)行中显示“下标超出范围”'因此有两种可能:要么工作簿没有打开(使用那种语句它需要打开),要么名称不完全是
项目跟踪器
,您需要更正(大写、空格、扩展名(
.xls
.xlsx
.xlsm
,…)。你可能需要更正括号中的所有名称,以完全符合你的要求!;)很高兴我能帮你!;)