对于所选列表框的每一行,我希望在下一行中为列表框中选定的每个数据插入数据,即一个新复制的行,但文本框中的文本必须在所有行中复制相等,下面的代码只在一行中复制文本。
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请帮帮我
发布于 2020-04-23 11:47:32
我为这个示例创建了一个新的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我们在这里做的第一件事就是用ReDim语句设置数组大小。数组的UpperBound或限制设置为减去1的ListCount属性,该属性返回1减去ListBox中的项数。这确保了我们的数组足够大,可以保存所有列表框项的值,例如,如果它们都是被选中的,但是这样做是动态的,这样您就不会浪费内存来使用模糊的数字来验证您的代码(例如,您可能只有30个项)的代码,比如100。如果添加或删除项,则数组的大小总是正确的。
我们减去1的原因是,我将数组的Option Base声明为0,这意味着它从(或Lower Bound是)0开始,而不是在1。更多信息请参见选项基语句。
接下来,我们循环遍历每个ListBox项,并评估它是否为Selected。如果是,则使用List()属性将该项的值赋值给数组。有关它们如何工作的更多信息,请参见For...Next环,并查看使用数组了解它们的工作方式。
现在,我们已经为列表框中的每个选定项提供了大量的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。当循环迭代时,确保将下一个数组元素写入列E的ArrayItemCounter增量与每个循环一起。
https://stackoverflow.com/questions/61384517
复制相似问题