首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >VBA基于列表框插入多行数据

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

Stack Overflow用户
提问于 2020-04-23 10:06:55
回答 1查看 1.3K关注 0票数 0

对于所选列表框的每一行,我希望在下一行中为列表框中选定的每个数据插入数据,即一个新复制的行,但文本框中的文本必须在所有行中复制相等,下面的代码只在一行中复制文本。

代码语言:javascript
运行
复制
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

请帮帮我

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-23 11:47:32

我为这个示例创建了一个新的Workbook和一个新的UserForm,其中的ListBoxTextBoxCommandButton都有默认名称。

代码语言:javascript
运行
复制
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个主要部分(从声明变量开始):

  1. 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()

  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。当循环迭代时,确保将下一个数组元素写入列E的ArrayItemCounter增量与每个循环一起。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61384517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档