【问题标题】:Userform Listbox name click to populate textboxes from different workbook用户表单列表框名称单击以填充来自不同工作簿的文本框
【发布时间】:2015-11-28 04:03:33
【问题描述】:

刚接触 VBA 和 Stackoverflow,但喜欢学习 VBA 及其功能。 我已经完成了一些小的代码工作,并在这方面取得了良好的开端。

我有一个名为 Master Copy Ledger 的用户表单,它有一个用户表单,其中包含一个列表框(从工作表中提取的人员姓名)、文本框(在文本框上方有 12 个月的标签和左侧的标签,其中包含我想要的统计信息根据从列表框或文本框旁边的 getdata 命令按钮中选择的名称从不同的工作簿中检索)

我想要获取的数据在同一个工作簿中(现在),A 列中的人名和 B、C、D 列到 L 列中的每个统计信息。 我现在有一个工作副本,当我选择一个名称时,我会得到 Sheet1(1 月)的数据,但现在需要弄清楚如何将 Sheet2(2 月)、Sheet3(3 月)等放入用户窗体中,是否应该进入单独的文本框或者我可以拉伸原始文本框。如果我必须使用单独的文本框,那么我是否假设我必须为每个“getdata”函数创建新代码,就像我在原始文件中所做的那样,或者是否有一个循环函数可以检查所有工作表并找到名称并获取数据和放入文本框(拉伸)或单独的文本框。最终我将学习从不同的工作簿中获取但需要从某个地方开始,并且相同的工作簿是代码现在工作的地方,所以我说顺其自然,直到我把它打包然后我将查看不同的工作簿 (20xxperformance.xlsx),它是 1 级的,一旦找到该名称,它就会从每一列收集数据并将其放置在正确的文本框中。 现在我有一个 20xxperformance 的用户表单的工作副本

Private Sub cbo_Agent_Change()
Dim Rws As Long, ConRng As Range, AdhRng As Range, AHTRng As Range, ACWRng As Range, TcktsRng As Range, LMIRng As Range, UnderRng As Range, KnowRng As Range, OvrSatRng As Range, OvrScoRng As Range, NPSRng As Range, Agnt As Range

    Rws = Cells(Rows.Count, "A").End(xlUp).Row
    Set Rng = Range(Cells(2, 1), Cells(Rws, 1))
    Set Agnt = Rng.Find(what:=cbo_Agent, lookat:=xlWhole)
    Set ConRng = Agnt.Offset(0, 1)   'set ConRng
    Set AdhRng = Agnt.Offset(0, 2)  'set AdhRng
    Set AHTRng = Agnt.Offset(0, 3)  'set AHTRng
    Set ACWRng = Agnt.Offset(0, 4)  'set AHTRng
    Set TcktsRng = Agnt.Offset(0, 5)  'set TcktsRng
    Set LMIRng = Agnt.Offset(0, 6)  'set LMIRng
    Set UnderRng = Agnt.Offset(0, 7)  'set UnderRng
    Set KnowRng = Agnt.Offset(0, 8)  'set KnowRng
    Set OvrSatRng = Agnt.Offset(0, 9)  'set OvrSatRng
    Set OvrScoRng = Agnt.Offset(0, 10)  'set OvrScoRng
    Set NPSRng = Agnt.Offset(0, 11)  'set NPSRng
    txt_Con = ConRng
    txt_Adh = AdhRng
    txt_AHT = AHTRng
    txt_ACW = ACWRng
    txt_tckts = TcktsRng
    txt_LMI = LMIRng
    txt_Under = UnderRng
    txt_Know = KnowRng
    txt_Osat = OvrSatRng
    txt_OScor = OvrScoRng
    txt_NPS = NPSRng
End Sub



Private Sub UserForm_Initialize()
Dim Rws As Long, Rng As Range
    Rws = Cells(Rows.Count, "A").End(xlUp).Row
    Set Rng = Range(Cells(2, 1), Cells(Rws, 1))
    cbo_Agent.List = Rng.Value

End Sub

正如我提到的,我是 VBA 新手,感觉在大家的帮助下我取得了更多成就,并且发现自己再次寻求专家建议并需要一些帮助。我不是在寻找整个代码(如果有人这样做了,请谦虚地接受),但至少是另一个很棒的代码,这样我就可以理解并实践你的教导。

谢谢

呸呸呸

【问题讨论】:

标签: excel vba


【解决方案1】:

希望此示例对您有所帮助,如果您使用命名范围而不是正常范围 A1:A10 也会减少时间和代码行 :)

Public Sub comboval()
Dim spath As String
spath = "file path"

Workbooks.Open Filename:=spath
    With ActiveWorkbook

        Combobox1.List = .Sheets("Sheet1").Range("namedranmge1").Value
        Combobox2.List = .Sheets("Sheet2").Range("namedranmge2").Value

        .Close 0
    End With

End Sub

详细命名范围Click Here

【讨论】:

  • 你不能循环翻阅这些床单吗?
  • 谢谢 Davesexcel,我一定会试一试,让你知道结果如何,但我应该把代码放在哪里?它会在私有子 cbo_agent change() 下进行吗?还是初始化一个?
  • 它应该进入表单初始化:)
【解决方案2】:

您可以命名月份列中的每个文本框,例如 Jan1、Jan2、Feb1、Feb2 等。

当您循环浏览工作表时,您可以通过那里的名称添加到文本框 Controls(sh.Name & x).Value = .Cells(r, 1 + x) 完整的代码是这样的,我写代码的时候只是用了一个小例子,所以我每个月只用了三个文本框

Private Sub ComboBox1_Change()
    Dim sh As Worksheet
    Dim x As Integer
    Dim rws As Long, rng As Range, c As Range, r


    For Each sh In Sheets
        With sh
            rws = .Cells(.Rows.Count, "A").End(xlUp).Row
            Set rng = .Range(.Cells(2, 1), .Cells(rws, 1))
            Set c = rng.Find(what:=ComboBox1, lookat:=xlWhole)
            r = c.Row
            For x = 1 To 3
                Controls(sh.Name & x).Value = .Cells(r, 1 + x)
            Next x
        End With
    Next sh

End Sub

您可以在此处下载示例工作簿,查看文本框的命名方式。

UserForm Example

【讨论】:

  • 谢谢 Davesexcel;我也使用了非常相似的东西,并发布了我需要的结果,感谢你。你一直是一个很好的导师,我觉得我可以向你寻求好的建议。再次感谢
【解决方案3】:

以下是我设法结合 Davesexcel 的建议和示例:

Private Sub cbo_Agent_Change(Target_Workbook As Workbook)
Dim Rws As Long, ConRng As Range, AdhRng As Range, AHTRng As Range, ACWRng As Range, TcktsRng As Range, LMIRng As Range, UnderRng As Range, KnowRng As Range, OvrSatRng As Range, OvrScoRng As Range, NPSRng As Range, Agnt As Range
Dim intCounter As Integer
Dim control_item
Dim Rng
Dim total_counter(11) As Single
Dim total_items As Integer

Dim Rng0
For intCounter = 1 To 12 'Goes through each individual month looking for stats

    Rws = Target_Workbook.Worksheets(intCounter).Cells(Rows.Count, "A").End(xlUp).Row

    If Rws > 1 Then 'This confirms there are stats for this month
        With Target_Workbook.Worksheets(intCounter)

            Set Rng = .Range(.Cells(2, 1), .Cells(Rws, 1))
            Set Agnt = Rng.Find(what:=lstNames, lookat:=xlWhole) 'Search for the employee in pull down menu

        End With

        Set ConRng = Agnt.Offset(0, 1)   'set ConRng
        Set AdhRng = Agnt.Offset(0, 2)  'set AdhRng
        Set AHTRng = Agnt.Offset(0, 3)  'set AHTRng
        Set ACWRng = Agnt.Offset(0, 4)  'set AHTRng
        Set TcktsRng = Agnt.Offset(0, 5)  'set TcktsRng
        Set LMIRng = Agnt.Offset(0, 6)  'set LMIRng
        Set UnderRng = Agnt.Offset(0, 7)  'set UnderRng
        Set KnowRng = Agnt.Offset(0, 8)  'set KnowRng
        Set OvrSatRng = Agnt.Offset(0, 9)  'set OvrSatRng
        Set OvrScoRng = Agnt.Offset(0, 10)  'set OvrScoRng
        Set NPSRng = Agnt.Offset(0, 11)  'set NPSRng

        'This fills the table with data
        With MonthlyStats 'These save all the information to the necessary text fields
            .Controls("txt_Con" & intCounter) = VBA.Format(ConRng, "0.0%")
            .Controls("txt_Adh" & intCounter) = VBA.Format(AdhRng, "0.0%")
            .Controls("txt_AHT" & intCounter) = AHTRng
            .Controls("txt_ACW" & intCounter) = ACWRng
            .Controls("txt_tckts" & intCounter) = VBA.Format(TcktsRng, "0.0%")
            .Controls("txt_LMI" & intCounter) = LMIRng
            .Controls("txt_Under" & intCounter) = VBA.Format(UnderRng, "0.0%")
            .Controls("txt_Know" & intCounter) = VBA.Format(KnowRng, "0.0%")
            .Controls("txt_Osat" & intCounter) = VBA.Format(OvrSatRng, "0.0%")
            .Controls("txt_OScor" & intCounter) = VBA.Format(OvrScoRng, "0.0%")
            .Controls("txt_NPS" & intCounter) = VBA.Format(NPSRng, "0.0%")
        End With

        'This keeps track of all the values for each row to later be used to figure out the average
        total_counter(0) = total_counter(0) + ConRng
        total_counter(1) = total_counter(1) + AdhRng
        total_counter(2) = total_counter(2) + AHTRng
        total_counter(3) = total_counter(3) + ACWRng
        total_counter(4) = total_counter(4) + TcktsRng
        total_counter(5) = total_counter(5) + LMIRng
        total_counter(6) = total_counter(6) + UnderRng
        total_counter(7) = total_counter(7) + KnowRng
        total_counter(8) = total_counter(8) + OvrSatRng
        total_counter(9) = total_counter(9) + OvrScoRng
        total_counter(10) = total_counter(10) + NPSRng

        total_items = total_items + 1
    End If

Next

'This will figure out the average of each line
txt_ConfYTD = VBA.Format(total_counter(0) / total_items, "0.0%")
txt_AdhYTD = VBA.Format(total_counter(1) / total_items, "0.0%")
txt_AHTYTD = VBA.Format(total_counter(2) / total_items, "0.00")
txt_ACWYTD = VBA.Format(total_counter(3) / total_items, "0.00")
txt_tcktsYTD = VBA.Format(total_counter(4) / total_items, "0.0%")
txt_LMIYTD = VBA.Format(total_counter(5) / total_items, "0.00")
txt_UnderYTD = VBA.Format(total_counter(6) / total_items, "0.0%")
txt_KnowYTD = VBA.Format(total_counter(7) / intCounter, "0.0%")
txt_OsatYTD = VBA.Format(total_counter(8) / intCounter, "0.0%")
txt_OScorYTD = VBA.Format(total_counter(9) / intCounter, "0.0%")
txt_NPSYTD = VBA.Format(total_counter(10) / intCounter, "0.0%")


End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    相关资源
    最近更新 更多