繁体   English   中英

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

[英]Listbox to display data from columns based on if cells in specified column contain values

我希望创建一个用户窗体,根据指定列中是否有任何数据,从主工作表母版 (Sheet1)中的某些列中提取数据。

截屏

理想情况下,ListBox listboxRequestsETR将检查是否有可用的请求 ID列 A ,并在黄色和蓝色列中显示数据。 在这种情况下,第 1 行将显示为 ListBox 的列标题,唯一不会转移到 ListBox 的行将是第 4 行。

另外,我希望应用相同的逻辑来分隔 B 列和 C 列的列表框,这样填充列表框的条件将基于指定单元格中是否有任何数据(无论数据是否是一般或数字)。

任何帮助,将不胜感激!

我能够用数据填充 ListBox,但是当我尝试过滤数据时出现错误。 下面是我到目前为止的代码,它会显示包含所有数据的列表框。

新代码

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 中显示列(如果请求 ID 在第 i 行中可用)就是我要找的

用户表单

旧代码

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

我仍然不确定我是否理解正确。 不管怎样,下面只是我对你想要什么的猜测.....

在此处输入图像描述

用户窗体中的 LB(ListBox)将仅显示 A 列中具有值的行,隐藏 B 列和 C,然后显示 D 到 Z 列。因此,在 LB 中,有 H01,然后是 H04 到 H26,而该行是来自第 2、3、5 和 6 行。LB 不显示第 4 行和第 7 行,因为在 A 列中,这些行是空白/无值。

在用户窗体中,有 5 个文本框用于更新/编辑 H04、H05、H06、H11 和 H12 的数据行 (N)。

例子:
用户单击 LB 中的一项。
然后文本框 (tb) 1 到 5 显示被单击的相应列值。
然后用户更新/更改每个 tb 中的值,然后单击更新按钮。 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。

在工作表“助手”中:
它获取usedrange的地址作为addr变量,然后将addr的第一个拆分值放入A1单元格,填充addr的范围,最后删除H01的空白行

在 LB 内:
它制作 27 列并设置每列宽度。 请注意,列宽有三个零值。 一个是隐藏A列的id/row,另外两个是隐藏H02和H03。 最后,它使用 sheet helper used range 作为 LB 的行源。

子LB_Click 会在用户点击LB 中的任意item 时触发。 它将填充文本框 (tb) 1 到 5。

bt_Click sub 将在用户单击 UPDATE 按钮时触发。 它将表数据中的相应值从用户窗体中的 tb1 值更新为 tb5 值,然后它回调 PopLB sub。

所以,正如你所说:

此 UF 旨在与可以编辑/删除选定行中的数据的附加 UF 连接。

虽然这可能不完全是你的意思,但这个 UF 仍然可以更新/编辑工作表 DATA 中的数据,尽管它使用了一个帮助表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM