对于选中列表框的每一行,我想在下一行空白处插入数据,每选中列表框中的数据,就新复制一行,但从文本框中出来的文字必须在所有行中复制相等,下面的代码只复制了单行的文字。
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
请帮我😊
我已经创建了一个新的 Workbook
和一个新的 UserForm
带着 ListBox
, TextBox
和 CommandButton
在这个例子中,所有的名字都是默认的。
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
[
输出到工作表
解释: Private Sub UserForm_Initialize()
事件填充了 ListBox
在我的例子中,你可以在你的代码中忽略这一点,但我觉得有必要包括我是如何填入 ListBox Items
和什么价值观与。
的 Private Sub CommandButton1_Click()
事件代码分为4个主要部分(从变量声明后开始)。
With Me.LisBox1...End With
我们在这里做的第一件事就是用 "A "来设置数组的大小 ReDim
声明: 该 UpperBound
或数组的限制设置为 ListCount
属性减去1,返回1减去项目数。ListBox
. 这确保了我们的数组足够大,可以容纳所有的列表框项目的值,例如,如果他们都被选中,但这样做是动态的,所以你不会浪费内存,使用一个模棱两可的数字来证明你的代码,就像。100
当您可能只有30个项目时。如果项目被添加或删除,数组将被添加或删除。始终 正确的大小。
我们减1的原因是我声明了 Option Base
到 0
阵列,这意味着它的起点是(或者是 Lower Bound
是)0不在1,见 期权基础声明 以获取更多信息。
接下来,我们循环浏览每个 ListBox
项目,并评估其是否 Selected
或不。如果是,我们使用 List()
属性来将该项的值分配给阵列。参见 对于...下一个循环 更多关于它们如何工作的信息,请看 使用数组 的工作方式。
现在我们有 SelectedItemsArray()
充满了列表框中每个选择项的值。
ReDim Preserve SelectedItemsArray(0 To ArrayElementCounter - 1)
就像之前一样,我们设置数组的大小,但这次包含了 Preserve
语句的一部分。这意味着我们可以调整数组的大小,但保留所有当前值--如果我们不使用 Preserve
阵列将被调整大小,但失去所有的值。我们再次设置 Upper Bound
动态地调整数组的大小,使其与所选项目的数量一致。参见 使用数组 关于数组大小等信息)
With ThisWorkbook.Sheets("Sheet1")...End With
在这个 With
块中找到最后使用过的一行 Column C
并将该行+1(所以它引用下一条空白行)赋值给 LastUsedRow
. 我们还定义了我们要动态写入数据的范围,使用的是 LastUsedRow
变量和 Upper Bound
的数组。这样做是为了在下一节代码中写入适当数量的单元格。
For Each TargetCell In TargetRange...Next TargetCell
另一个循环,但这次 For Each...Next
是用。非常类似于 For...Next
循环,但这个循环是在数组或集合的元素中循环--在本例中,我们将在我们的 TargetRange
.
对于范围内的每个单元格,记住我们的范围设置为 Column C
从下一行的空白处开始计算。TextBox
值写入C列,每个 ListBox
项的值写到列E中。ArrayItemCounter
增量,确保每次循环都将下一个数组元素写入列E。