Excel VBA: при сохранении частичных данных каждый раз создается новая строка. Как обновить, если строка имеет значения - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть простая форма, которая позволяет вводить счет в разное время дня.

Моя форма загружает значения последней строки таблицы в пользовательскую форму, так что тот, кто открывает форму для ввода следующего счетчика, получает предыдущие значения, помещенные в форму:

Private Sub UserForm_Initialize()
Dim lr As Long
lr = ActiveSheet.Range("A1").End(xlDown).Row
eightWkd.Value = Cells(lr, 3)
nineWkd.Value = Cells(lr, 4)
ten30Wkd.Value = Cells(lr, 6)
noonWkd.Value = Cells(lr, 8)
one30Wkd.Value = Cells(lr, 10)
threeWkd.Value = Cells(lr, 12)
four30Wkd.Value = Cells(lr, 14)
sixWkd.Value = Cells(lr, 15)

Но каждая отправка создает новую строку. screenshot of excel sheet

Вот мой код для моей кнопки отправки, установки значений. Изменение загруженных значений работает. Я нахожу первый пустой ряд

Private Sub SubmitButton_Click()
Dim ws As Worksheet
Set ws = Worksheets("daily_count")
Dim lr As Long, varDay As Long
With ws
    lr = .Cells(.Rows.Count, varDay).End(xlUp).Offset(1, 0).Row
    .Cells(lr, 1).Value = Me.DateWkd.Value
    .Cells(lr, 2).Value = Me.DayWkd.Value
    .Cells(lr, 3).Value = Me.eightWkd.Value
    .Cells(lr, 4).Value = Me.nineWkd.Value
    .Cells(lr, 6).Value = Me.ten30Wkd.Value
    .Cells(lr, 8).Value = Me.noonWkd.Value
    .Cells(lr, 10).Value = Me.one30Wkd.Value
    .Cells(lr, 12).Value = Me.threeWkd.Value
    .Cells(lr, 14).Value = Me.four30Wkd.Value
    .Cells(lr, 15).Value = Me.sixWkd.Value

Я попробовал следующую логику, чтобы выбрать между последней существующей строкой и новой строкой, основываясь на том, установлено ли значение даты (столбец A), но это не сработало.

If ActiveSheet.Range("A1") = Format(Date, "mm/dd/yy") Then
r = ActiveSheet.Range("A1").End(xlDown).Row
Else
r = .Cells(.Rows.Count, varDay).End(xlUp).Offset(1, 0).Row
End If

Итак, как мне обновить ячейки в строке вместо создания новой строки?

1 Ответ

0 голосов
/ 12 ноября 2018

Как насчет использования метода .Find, чтобы найти строку с текущей датой, а затем обновить значения этой строки, если они найдены, и, если они не найдены, добавить значения в следующую свободную строку:

Private Sub SubmitButton_Click()
Dim ws As Worksheet
Set ws = Worksheets("daily_count")
Dim lr As Long, varDay As Long, rng as Range
FindVal = Format(Date, "mm/dd/yy")
Set Rng = ws.Range("A:A").Find(What:=FindVal, lookat:=xlWhole)
If Not Rng Is Nothing Then
    With ws
        .Cells(Rng.Row, 1).Value = Me.DateWkd.Value
        .Cells(Rng.Row, 2).Value = Me.DayWkd.Value
        .Cells(Rng.Row, 3).Value = .Cells(Rng.Row, 3).Value + Me.eightWkd.Value
        .Cells(Rng.Row, 4).Value = .Cells(Rng.Row, 4).Value + Me.nineWkd.Value
        .Cells(Rng.Row, 6).Value = .Cells(Rng.Row, 6).Value + Me.ten30Wkd.Value
        .Cells(Rng.Row, 8).Value = .Cells(Rng.Row, 8).Value + Me.noonWkd.Value
        .Cells(Rng.Row, 10).Value = .Cells(Rng.Row, 10).Value + Me.one30Wkd.Value
        .Cells(Rng.Row, 12).Value = .Cells(Rng.Row, 12).Value + Me.threeWkd.Value
        .Cells(Rng.Row, 14).Value = .Cells(Rng.Row, 14).Value + Me.four30Wkd.Value
        .Cells(Rng.Row, 15).Value = .Cells(Rng.Row, 15).Value + Me.sixWkd.Value
    End With
Else
    With ws
        lr = .Cells(.Rows.Count, varDay).End(xlUp).Offset(1, 0).Row
        .Cells(lr, 1).Value = Me.DateWkd.Value
        .Cells(lr, 2).Value = Me.DayWkd.Value
        .Cells(lr, 3).Value = Me.eightWkd.Value
        .Cells(lr, 4).Value = Me.nineWkd.Value
        .Cells(lr, 6).Value = Me.ten30Wkd.Value
        .Cells(lr, 8).Value = Me.noonWkd.Value
        .Cells(lr, 10).Value = Me.one30Wkd.Value
        .Cells(lr, 12).Value = Me.threeWkd.Value
        .Cells(lr, 14).Value = Me.four30Wkd.Value
        .Cells(lr, 15).Value = Me.sixWkd.Value
    End With
End If
End Sub
...