excel 用于根据指定列中的单元格是否包含值来显示列中数据的列表框

9gm1akwq  于 2023-01-18  发布在  其他
关注(0)|答案(1)|浏览(139)

我希望创建一个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
xwbd5t1u

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也被更新。

Private Sub UserForm_Initialize()
Call PopLB
End Sub

Sub PopLB()

With Sheets("helper")
    .Cells.Clear
    Sheets("DATA").UsedRange.Copy Destination:=.Range("B1")
    addr = .UsedRange.Columns(1).Offset(0, -1).Address
    .Range("A1").Value = Split(addr, ":")(0)
    .Range("A1").AutoFill Destination:=.Range(addr), Type:=xlFillSeries
    .Range(addr).Offset(0, 1).SpecialCells(xlBlanks).EntireRow.Delete
End With

With LB
    .ColumnCount = 27
    .ColumnWidths = "00,28,00,00,28,28,28,28,28,28," & _
                    "28,28,28,28,28,28,28,28,28,28," & _
                    "28,28,28,28,28,28,28"
    .RowSource = "helper!" & Sheets("helper").UsedRange.Address
End With

End Sub

Private Sub LB_Click()
tb1.Value = LB.List(LB.ListIndex, 4)
tb2.Value = LB.List(LB.ListIndex, 5)
tb3.Value = LB.List(LB.ListIndex, 6)
tb4.Value = LB.List(LB.ListIndex, 11)
tb5.Value = LB.List(LB.ListIndex, 12)
End Sub

Private Sub bt_Click()
If LB.ListIndex = -1 Then Exit Sub
With Sheets("DATA")
r = Range(LB.List(LB.ListIndex, 0)).Row
.Cells(r, 4).Value = tb1.Value
.Cells(r, 5).Value = tb2.Value
.Cells(r, 6).Value = tb3.Value
.Cells(r, 11).Value = tb4.Value
.Cells(r, 12).Value = tb5.Value
End With
Call PopLB
End Sub

在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中的数据,虽然它使用了一个帮助工作表。

相关问题