我希望创建一个UserForm,它可以根据指定列中是否有任何数据从主表 * Master(Sheet1)* 中的某些列提取数据。
理想情况下,ListBox * listboxRequestsETR * 将检查是否有可用的请求ID * Column A *,并在黄色和蓝色列中显示数据。在这种情况下,行1将显示为ListBox的列标题,唯一不会转移到ListBox的行是行4。
另外,我希望将相同的逻辑应用于具有B列和C列的单独ListBox,以便填充ListBox的条件将基于指定单元格中是否有任何数据(无论数据是General还是Number)。
任何帮助将不胜感激!
我可以用数据填充列表框,但是当我试图过滤数据时,我出现了错误。下面是我目前为止使用的代码,它显示了列表框中的所有数据。
- 新代码**
Private Sub UserForm_Initialize()
Call AddDataToListBoxETR
End Sub
Private Sub AddDataToListBoxETR()
' Dim rg As Range
' Set rg = GetRangeETR
' With listboxRequestsETR
' .RowSource = rg.Address(external:=True)
' .ColumnCount = rg.Columns.Count
' .ColumnWidths = "75;90;100;110;75;125;125;100;100;100;100;100"
' .ColumnHeads = True
' .ListIndex = 0
' End With
Dim i As Long
For i = 2 To Master.Range("A100000").End(xlUp).Offset(1, 0).row
If Master.Cells(i, "A").Value <> 0 Then
Me.listboxRequestsETR.AddItem Master.Cells(i, 1).Value
Me.listboxRequestsETR.List(listboxRequestsETR.ListCount - 1, 2) = Master.Cells(i, "D").Value
'Me.listboxRequestsETR.List(listboxRequestsETR.ListCount - 1, 3) = Master.Cells(i, "E").Value
'Me.listboxRequestsETR.List(listboxRequestsETR.ListCount - 1, 4) = Master.Cells(i, "F").Value
'Me.listboxRequestsETR.List(listboxRequestsETR.ListCount - 1, 5) = Master.Cells(i, "G").Value
'Me.listboxRequestsETR.List(listboxRequestsETR.ListCount - 1, 6) = Master.Cells(i, "H").Value
'Me.listboxRequestsETR.List(listboxRequestsETR.ListCount - 1, 7) = Master.Cells(i, "I").Value
'Me.listboxRequestsETR.List(listboxRequestsETR.ListCount - 1, 8) = Master.Cells(i, "J").Value
'Me.listboxRequestsETR.List(listboxRequestsETR.ListCount - 1, 9) = Master.Cells(i, "K").Value
'Me.listboxRequestsETR.List(listboxRequestsETR.ListCount - 1, 10) = Master.Cells(i, "L").Value
'Me.listboxRequestsETR.List(listboxRequestsETR.ListCount - 1, 11) = Master.Cells(i, "M").Value
'Me.listboxRequestsETR.List(listboxRequestsETR.ListCount - 1, 12) = Master.Cells(i, "O").Value
End If
Next i
End Sub
- 预期成果**
- 我知道列数限制为10,所以我希望能够在按条件筛选的ListBox中显示列(如果第i行中有Request ID)*
- 旧代码**
Private Sub UserForm_Initialize()
Call AddDataToListBoxETR
End Sub
Private Sub AddDataToListBoxETR()
Dim rg As Range
Set rg = GetRangeETR
With listboxRequestsETR
.RowSource = rg.Address(external:=True)
.ColumnCount = rg.Columns.Count
.ColumnWidths = "75;90;100;110;75;125;125;100;100;100;100;100"
.ColumnHeads = True
.ListIndex = 0
End With
End Sub
- 模块
Option Explicit
Public Function GetRangeETR() As Range
Set GetRangeETR = Master.Range("A1").CurrentRegion
Set GetRangeETR = GetRangeETR.Offset(1).Resize(GetRangeETR.Rows.Count - 1)
End Function
1条答案
按热度按时间xwbd5t1u1#
我还是不确定我是否正确理解了你的意思。不管怎样,下面只是我对你想要什么的猜测。
用户表单中的LB(列表框)将只显示A列中有值的行,隐藏B列和C列,然后显示D列到Z列。因此,在LB中,当行来自第2、3、5和6行时,有H01,然后是H04到H26。LB不显示第4和7行,因为在A列中,这些行为空/无值。
在用户表单中,有5个文本框用于更新/编辑H04、H05、H06、H11和H12的数据行(N)。
示例:
用户单击LB中的一个项目。
然后,文本框(tb)1至5显示点击的相应列值。
然后用户更新/更改每个tb中的值,然后单击UPDATE按钮。DATA被更新,LB也被更新。
在PopLB sub中,首先清除工作表"helper"中的整个单元格。
然后将工作表"DATA"中的数据复制到工作表"helper"单元格B1。
在工作表"助手"中:
将使用范围的地址作为addr变量,然后将addr的第一个拆分值放入A1单元格,并将addr的范围依次填充,最后删除H01的空行
LB内:
它有27列,并设置每列的宽度。请注意,列宽有三个零值。一个是隐藏A列中的id/row,另外两个是隐藏H02和H03。最后,它使用工作表帮助器使用的范围作为LB的行来源。
当用户点击LB中的任何项目时,LB_Click子控件将被触发。它将填充文本框(tb)1到5。
bt_Click子函数将在用户单击UPDATE按钮时被触发。它将把工作表DATA中的相应值从userform中的tb1更新到tb5值,然后回调PopLB子函数。
因此,正如你所说:
该UF旨在与可以编辑/删除所选行中的数据的附加UF连接。
虽然这可能不完全是你的意思,但这个UF仍然可以更新/编辑工作表DATA中的数据,虽然它使用了一个帮助工作表。