Как добавить сразу несколько строк данных из UserForm в базу данных Excel

Я создаю своего рода футбольную базу данных, в которую я буду вводить данные, используя пользовательскую форму, и где я хочу получать данные из моей базы данных 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 строк, НО она должна иметь возможность убирать только те строки, которые заполнены.

Это возможно? И как мне настроить свою пользовательскую форму? Могу я просто скопировать области текста и поля со списком?


person Gerben69    schedule 10.11.2015    source источник


Ответы (2)


Как работать с массивом данных

Вам нужно будет создать новую кнопку, у вас будет:

  1. один для добавления набора данных в массив данных (здесь CommandButton1) и
  2. один, чтобы добавить массив данных в базу данных (здесь CommandButton2).

Я также предпочитаю работать с Именованным диапазоном для базы данных, здесь он называется Db_Val, но вы можете переименовать его в соответствии со своими потребностями! ;)

Код, который нужно разместить в UserForm для заполнения массива данных:

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

Процедура печати в базе данных массива данных, который вы передаете из пользовательской формы:

Здесь база данных - Именованный диапазон Db_Val в ingevenuitslagen листе

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
person R3uK    schedule 10.11.2015
comment
Итак, теперь я могу создать пользовательскую форму с возможностью ввода столько строк, сколько захочу? - person Gerben69; 10.11.2015
comment
Могу я отправить вам мою рабочую тетрадь по Excel, чтобы вы могли взглянуть на нее? - person Gerben69; 10.11.2015
comment
Действительно, с помощью этого метода вы можете иметь столько строк, сколько хотите. Но я настроил все в соответствии с кодом, который вы дали, и объяснил, что нужно изменить, если я не знал названия чего-то, так что все уже сделано. Вам просто нужно создать дубликат вашей нынешней UserForm и добавить код, который я дал, и переименовать CommandButton1, CommandButton2 и Named Range Db_Val в соответствии с вашими потребностями, чтобы вы могли обрабатывать его оттуда. - person R3uK; 10.11.2015
comment
хотя один маленький вопрос. Можно ли сделать наоборот. Так, например, возвращаются последние 15 строк в моей пользовательской форме? - person Gerben69; 10.11.2015
comment
Возможно, это возможно, но как бы вы это отобразили? Вам понадобится новая кнопка или что-то еще, чтобы перемещаться по этим строкам в UF. Попробуйте и задайте вопрос, если вы застряли, но с тем, что у вас есть, у вас должна быть хорошая основа для этой функциональности! ;) - person R3uK; 10.11.2015
comment
Я бы сделал новую пользовательскую форму с нужными мне столбцами, а затем хотел бы заполнить их последними 15 строками из базы данных. - person Gerben69; 10.11.2015
comment
Следует ли мне добавить весь этот код в поле кода пользовательской формы? Или мне нужно создавать новые модули? - person Gerben69; 10.11.2015
comment
Вы можете начать с размещения всего в модуле пользовательской формы, но для лучшей читаемости я советую вам изменить это, когда он будет работать правильно. Как? Сохраните события в модуле пользовательской формы, но вызывайте подпрограммы, которые вы переместили и назвали классическим модулем, чтобы вы могли лучше обрабатывать свой проект для будущих улучшений! ;) - person R3uK; 10.11.2015
comment
Остальная часть кода: это когда я хочу добавить что-то дополнительное или что-то, что у меня уже было в фрагментах, которые я привел в моем примере? - person Gerben69; 10.11.2015
comment
Позвольте нам продолжить это обсуждение в чате. - person Gerben69; 10.11.2015
comment
Остальная часть кода предназначена для того, чтобы вы знали, куда добавить то, что у вас, возможно, уже есть в вашей процедуре UserForm_Initialize. Извините, но я не загружаю файлы (по множеству причин), если вы сообщите мне (в чате), какая ошибка в какой строке, я постараюсь помочь вам с этим. - person R3uK; 10.11.2015

Доброго времени суток всем.

У меня такая же проблема. Моя - иметь возможность размещать заказы клиентов. С помощью кода, который у меня есть, я могу размещать только один продукт в заказе за раз для клиента. Я хочу иметь возможность размещать несколько продуктов на заказ для одного клиента одновременно в пользовательской форме, и это будет обновлять несколько строк. Приведенный ниже код может обновлять только одну строку с одним продуктом подряд для одного клиента:

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

Вышеуказанное может обновлять только один продукт для каждого клиента. Клиент мог разместить заказ более чем на один продукт.

person UBeny    schedule 14.11.2017