【问题标题】:How does one populate a Userform textbox or textboxes from multiple sheets如何从多个工作表中填充用户窗体文本框或文本框
【发布时间】:2015-11-29 14:53:47
【问题描述】:

首先我想说我是 VBA 的新手,但我学到了很多东西,并且在我的最后一个问题上得到了 Davesexcel 的大力帮助。多亏了他,我已经能够创建一个用户表单,它可以根据组合框中选择的名称将数据拉入用户表单上的文本框中。我现在遇到的问题是每个名称都需要每月从同一个工作簿中提取(多张工作表 - 每张工作表按月份命名;所以 Jan 是 sheet1;Feb 是工作表 2,依此类推)。我可以通过选择的名称将工作表 1 数据拉入用户窗体,并且效果很好。到时候我将如何做接下来的几个月,他们应该进入用户窗体上的单独文本框,还是应该扩展已经存在的文本框的宽度并为每个主题使用一个文本框。我正在提供用户窗体外观的屏幕视图,希望代码也能正确显示Userform with code working but should textboxes be extended or additional textboxes used

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

与原来的问题一样;一旦我学到了足够的知识,我的目标就是让用户表单每月填写结果,但来自不同的工作簿,但现在我想学习并能够每月在同一个工作簿中提取数据,然后解决如何从封闭的工作簿。最初希望将数据从 20xxperformance.xlsx 提取到主分类帐中,但为了学习,我在 20xxperformance 中构建了用户表单以了解功能方面。我希望我的询问是可以理解的,如果不是我的道歉,我会在需要时尝试更明确。感谢您在我不断学习和成长的过程中提供的帮助和指导。

问题我可以不使用沿着这条线的东西吗? Dim Ws As Worksheet, rCell As Range

For Each Ws In ActiveWorkbook.Worksheets 
    Select Case UCase(Ws.Name) 
    Case "SHEET1", "SHEET3", "SHEET4" 
        With Ws 
            For Each rCell In .Range("A1", .Cells(Rows.Count, 1).End(xlUp)) 
                ComboBox1.AddItem rCell 
            Next rCell 
        End With 
    Case "SHEET2" 
        With Ws 
            For Each rCell In .Range("A1", .Cells(Rows.Count, 4).End(xlUp)) 
                ComboBox1.AddItem rCell 
            Next rCell 
        End With 
    End Select 
Next Ws 

或者我应该使用列表框吗?我宁愿不做每月的代码和那么多的文本框,虽然它有利于学习,我仍然会做,但需要早日得到这个,我喜欢马修的循环想法,但除了什么之外仍然需要帮助我收到了,因为它仍然让我感到困惑。 谢谢

【问题讨论】:

  • 这是一个初学者教程,可以帮助您了解基础知识。 excelvbatutor.com/vba_book/vbabook_ed2.pdf 它演示了工作表中的编码,您已经在玩表单,但它会告诉您一些正确的方法。

标签: vba excel


【解决方案1】:

我会使用附加文本框。有朝一日,您可以(如果您愿意)动态创建它们并将它们用作数组,但它更高级一些。

使用工作表对象从不是活动工作表的工作表中获取数据。

Dim ws as Excel.Worksheet
Set ws = Application.Sheets("February")

然后将工作表对象用于您的范围和单元格对象。

Rws = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Set Rng = ws.Range(ws.Cells(2, 1), ws.Cells(Rws, 1))

【讨论】:

  • 我的意思是额外的文本框。用户已经进行了更改,并且正在通过编辑审批流程。
  • 如果您询问放置工作表对象声明的位置,这取决于您需要对象的范围。如果它只是在 sub 中,则在 sub 中声明它。几个月的逗号是什么意思?
  • @ptpapa 不,您不能以这种方式使用它。那只能包含现有工作表的确切名称。每张纸都需要一个对象。 Dim wsFeb as ... Dim wsMarch as ... 您可以循环遍历所有工作表,重用同一个对象,但这有点高级。
  • 如果您以后想深入研究类似的事情,这里有一个例子。在这里查看我的答案stackoverflow.com/questions/33089572/…
  • 代码可以在同一个位置。为每个人编写代码将是您在学习时做到这一点的最直接的方式。然后,您可以学习如何使用循环重用相同的对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
相关资源
最近更新 更多