【问题标题】:How to add multiple data rows at once from UserForm to Excel DataBase如何一次将多个数据行从用户窗体添加到 Excel 数据库
【发布时间】:2016-02-11 04:15:02
【问题描述】:

我正在制作某种足球数据库,我将在其中使用用户表单输入数据,并且我想从我的 excel 数据库中检索数据。

我有一个名为“wedstrijden”的工作表此工作表包含以下列:Date、HomeTeam、AwayTeam、HomeScore、AwayScore、HomeOdds 和 AwayOdds

我的另一个工作表名为:“ingevenuitslagen” 此工作表包含我的名为 UitslagenIngeven 的用户表单

使用下面的代码,我可以将用户表单中的数据输入到我的“wedstrijden”工作表中

Private Sub putAway_Click()
Dim ingevenuitslagen As Worksheet
Set ingevenuitslagen = ThisWorkbook.Sheets("wedstrijden")
NextRow = ingevenuitslagen.Cells(Rows.Count, 1).End(xlUp).Row + 1
ingevenuitslagen.Cells(NextRow, 1) = CDate(date_txt.Text)
ingevenuitslagen.Cells(NextRow, 2) = UitslagenIngeven.cboHomeTeam
ingevenuitslagen.Cells(NextRow, 3) = UitslagenIngeven.cboAwayTeam
ingevenuitslagen.Cells(NextRow, 4) = UitslagenIngeven.cboHScore
ingevenuitslagen.Cells(NextRow, 5) = UitslagenIngeven.cboAScore
ingevenuitslagen.Cells(NextRow, 6) = Val(UitslagenIngeven.hodds_txt.Text)
ingevenuitslagen.Cells(NextRow, 7) = Val(UitslagenIngeven.aodds_txt.Text)
End Sub

但这只是为了收起 1 行。我想有可能一次收起 10 或 15 行。所以我会制作一个用户表单,可以存放 20 行,但它应该只能存放那些已填写的行。

这可能吗?我应该如何调整我的用户表单?我可以只复制文本和组合框区域吗?

【问题讨论】:

    标签: arrays vba excel userform


    【解决方案1】:

    如何使用数据数组

    您需要创建一个新按钮,您将拥有:

    1. 用于将数据集添加到数据数组(此处为CommandButton1)和
    2. 将数据数组添加到数据库(此处为CommandButton2)。

    我也更喜欢使用数据库的命名范围,这里称为Db_Val,但您可以重命名它以满足您的需要! ;)

    放置在用户窗体中以填充数据数组的代码:

    Public ingevenuitslagen As Worksheet
    Public DataA() '----These lines should be at the top of the module
    
    '----Code to Set the dimension of the Data array
    Private Sub UserForm_Initialize()
        Dim DataA(7, 0)
        Set ingevenuitslagen = ThisWorkbook.Sheets("wedstrijden")
        '----Rest of your code
    End Sub
    
    '----Code to add a data set to the data array
    Private Sub CommandButton1_Click()
        UnFilter_DB '----See below procedure
    
        DataA(1) = CDate(date_txt.Text)
        DataA(2) = UitslagenIngeven.cboHomeTeam
        DataA(3) = UitslagenIngeven.cboAwayTeam
        DataA(4) = UitslagenIngeven.cboHScore
        DataA(5) = UitslagenIngeven.cboAScore
        DataA(6) = Val(UitslagenIngeven.hodds_txt.Text)
        DataA(7) = Val(UitslagenIngeven.aodds_txt.Text)
    
        ReDim Preserve DataA(LBound(DataA, 1) To UBound(DataA, 1), LBound(DataA, 2) To UBound(DataA, 2) + 1)
    End Sub
    
    '----Code to sent the data array to the DB
    Private Sub CommandButton2_Click()
        ReDim Preserve DataA(LBound(DataA, 1) To UBound(DataA, 1), LBound(DataA, 2) To UBound(DataA, 2) - 1)
    
        SetData DataA
    End Sub
    

    在数据库中打印您从用户表单传递的数据数组的过程:

    这里的数据库是 ingevenuitslagen 表中的命名范围 Db_Val

    Public Sub SetData(ByVal Data_Array As Variant)
    Dim DestRg As Range, _
        A()
    '----Find the last row of your DataBase
    Set DestRg = ingevenuitslagen.Range("Db_Val").Cells(ingevenuitslagen.Range("Db_Val").Rows.Count, 1)
    '----Print your array starting on the next row
    DestRg.Offset(1, 0).Resize(UBound(Data_Array, 1), UBound(Data_Array, 2)).Value = Data_Array
    End Sub
    

    Sub 取消过滤您正在使用的数据库:

    Public Sub UnFilter_DB()
    '----Use before "print" array in sheet to unfilter DB to avoid problems (always writing on the same row if it is still filtered)
    Dim ActiveS As String, CurrScreenUpdate As Boolean
    CurrScreenUpdate = Application.ScreenUpdating
    Application.ScreenUpdating = False
    ActiveS = ActiveSheet.Name
        ingevenuitslagen.Activate
        ingevenuitslagen.Range("A1").Activate
        ingevenuitslagen.ShowAllData
        DoEvents
        Sheets(ActiveS).Activate
    Application.ScreenUpdating = CurrScreenUpdate
    End Sub
    

    【讨论】:

    • 所以我现在可以创建一个用户表单,它可以包含任意多的行?
    • 我可以把我的excel工作簿发给你看看吗??
    • 确实,您可以使用此方法拥有任意数量的行。但是我调整了所有内容以适合您提供的代码,并解释了当我不知道某些东西的名称时要更改的内容,所以一切都已经完成了。您只需创建当前用户窗体的副本并添加我提供的代码并重命名CommandButton1CommandButton2 和命名范围Db_Val 以满足您的需要,因此您应该能够从那里处理它。
    • 一个小问题。有没有可能反其道而行之。那么例如返回我的用户表单中的最后 15 行?
    • 这可能是可能的,但你将如何显示它?您需要一个新按钮或其他东西来在您的 UF 中移动这些行。如果您遇到困难,请尝试并发布问题,但是有了这里的内容,您应该能够为该功能奠定良好的基础! ;)
    【解决方案2】:

    大家好。

    我也有同样的挑战。我的是能够下客户的订单。使用我拥有的代码,我一次只能为客户放置一个产品。我希望能够在用户表单中同时为一个客户的每个订单放置多个产品,它将更新多行。下面的代码只能为一个客户更新一行一个产品:

    Private Sub cmdAdd_Click()
    Dim lRow As Long
    Dim ws As Worksheet
    lRow = ws.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row
    With ws
        .Cells(lRow, 1).Value = Me.Data1.Value
        .Cells(lRow, 2).Value = Me.Data2.Value
        .Cells(lRow, 3).Value = Me.Data3.Value
        .Cells(lRow, 4).Value = Me.Data4.Value
        .Cells(lRow, 5).Value = Me.Data5.Value
        .Cells(lRow, 6).Value = Me.Data6.Value
        .Cells(lRow, 7).Value = Me.Data7.Value
        .Cells(lRow, 8).Value = Me.Data8.Value
        .Cells(lRow, 9).Value = Me.Data9.Value
        .Cells(lRow, 10).Value = Me.Data10.Value  
    End With
    End Sub
    

    以上内容每个客户只能更新一种产品。一个客户可以订购多个产品。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 2018-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-27
      • 1970-01-01
      相关资源
      最近更新 更多