VBA基于列表框插入多行数据。

问题描述 投票:0回答:1

对于选中列表框的每一行,我想在下一行空白处插入数据,每选中列表框中的数据,就新复制一行,但从文本框中出来的文字必须在所有行中复制相等,下面的代码只复制了单行的文字。

Private sub button1_click()
Dim rw  as integer
Dim ws as worksheets
Set worksheets(“Sheet1”)
Rw = ws.cells.find(what:=“*”, searchorder:=xlrows, searchdirection:=xlprevious, lookin:xlvalues).row + 1
Ws.cells(rw, 3).value = me.textbox1.value
Ws.cells(rw, 5).value = me.listbox1.value
End sub

请帮我😊

excel vba listbox copy
1个回答
0
投票

我已经创建了一个新的 Workbook 和一个新的 UserForm 带着 ListBox, TextBoxCommandButton 在这个例子中,所有的名字都是默认的。

Option Explicit
____________________________________________________________________________________

Private Sub CommandButton1_Click()

Dim NextBlankRow As Long
Dim TargetRange As Range
Dim ListBoxItem As Long
Dim SelectedItemsArray As Variant
Dim ArrayElementCounter As Long

ArrayElementCounter = 0

With Me.ListBox1
ReDim SelectedItemsArray(0 To .ListCount - 1)
    For ListBoxItem = 0 To .ListCount - 1
        If .Selected(ListBoxItem) Then
            SelectedItemsArray(ArrayElementCounter) = .List(ListBoxItem)
            ArrayElementCounter = ArrayElementCounter + 1
        End If
    Next ListBoxItem
End With

ReDim Preserve SelectedItemsArray(0 To ArrayElementCounter - 1)

With ThisWorkbook.Sheets("Sheet1")
    NextBlankRow = .Cells(Rows.Count, 3).End(xlUp).Row + 1
    Set TargetRange = .Range("C" & NextBlankRow & ":C" & NextBlankRow + UBound(SelectedItemsArray))
End With

Dim TargetCell As Range

ArrayElementCounter = 0
For Each TargetCell In TargetRange
    TargetCell.Value = Me.TextBox1.Value
    TargetCell.Offset(0, 2).Value = SelectedItemsArray(ArrayElementCounter)
    ArrayElementCounter = ArrayElementCounter + 1
Next TargetCell

End Sub

____________________________________________________________________________________

Private Sub UserForm_Initialize()

Dim ListBoxItemArray As Variant

ListBoxItemArray = Array("Listbox Item 1", "Listbox Item 2", "Listbox Item 3")

Dim ItemToAdd As Long

For ItemToAdd = LBound(ListBoxItemArray) To UBound(ListBoxItemArray)
    Me.ListBox1.AddItem (ListBoxItemArray(ItemToAdd))
Next ItemToAdd

End Sub

下面是输入和输出的截图。

选定的数据输入到... UserForm

[Screenshot of UserForm with selected listbox items and textbox text[1]

输出到工作表

Screenshot of output to the worksheet


解释:

解释: Private Sub UserForm_Initialize() 事件填充了 ListBox 在我的例子中,你可以在你的代码中忽略这一点,但我觉得有必要包括我是如何填入 ListBox Items 和什么价值观与。

Private Sub CommandButton1_Click() 事件代码分为4个主要部分(从变量声明后开始)。

  1. With Me.LisBox1...End With

我们在这里做的第一件事就是用 "A "来设置数组的大小 ReDim 声明: 该 UpperBound 或数组的限制设置为 ListCount 属性减去1,返回1减去项目数。ListBox. 这确保了我们的数组足够大,可以容纳所有的列表框项目的值,例如,如果他们都被选中,但这样做是动态的,所以你不会浪费内存,使用一个模棱两可的数字来证明你的代码,就像。100 当您可能只有30个项目时。如果项目被添加或删除,数组将被添加或删除。始终 正确的大小。

我们减1的原因是我声明了 Option Base0 阵列,这意味着它的起点是(或者是 Lower Bound 是)0不在1,见 期权基础声明 以获取更多信息。

接下来,我们循环浏览每个 ListBox 项目,并评估其是否 Selected 或不。如果是,我们使用 List() 属性来将该项的值分配给阵列。参见 对于...下一个循环 更多关于它们如何工作的信息,请看 使用数组 的工作方式。

现在我们有 SelectedItemsArray() 充满了列表框中每个选择项的值。

  1. ReDim Preserve SelectedItemsArray(0 To ArrayElementCounter - 1)

就像之前一样,我们设置数组的大小,但这次包含了 Preserve 语句的一部分。这意味着我们可以调整数组的大小,但保留所有当前值--如果我们不使用 Preserve 阵列将被调整大小,但失去所有的值。我们再次设置 Upper Bound 动态地调整数组的大小,使其与所选项目的数量一致。参见 使用数组 关于数组大小等信息)

  1. With ThisWorkbook.Sheets("Sheet1")...End With

在这个 With 块中找到最后使用过的一行 Column C 并将该行+1(所以它引用下一条空白行)赋值给 LastUsedRow. 我们还定义了我们要动态写入数据的范围,使用的是 LastUsedRow 变量和 Upper Bound 的数组。这样做是为了在下一节代码中写入适当数量的单元格。

  1. For Each TargetCell In TargetRange...Next TargetCell

另一个循环,但这次 For Each...Next 是用。非常类似于 For...Next 循环,但这个循环是在数组或集合的元素中循环--在本例中,我们将在我们的 TargetRange.

对于范围内的每个单元格,记住我们的范围设置为 Column C 从下一行的空白处开始计算。TextBox 值写入C列,每个 ListBox 项的值写到列E中。ArrayItemCounter 增量,确保每次循环都将下一个数组元素写入列E。

© www.soinside.com 2019 - 2024. All rights reserved.