2016-07-05 2 views
0

ОБНОВЛЕНО ДОБАВИТЬ НОВЫЙ КОД!Excel пользовательская форма для создания сводной строки после добавления переменного количества строк

Я до сих пор создал Userform, который позволяет мне вводить между 1 и 10 строками в электронную таблицу Excel в зависимости от того, сколько различных результатов теста вводится в пользовательскую форму. Это тот код, который у меня есть, который выполняет это.

Set ws = Sheets("Master") 
Dim NextRow As Long 

NextRow = ws.Cells(Rows.Count).End(x1Up).Offset(1, 0).Row 

With Worksheets("Master").Range("A1") 
    .Offset(NextRow, 0).Value = Me.txtTestDate.Value 
    .Offset(NextRow, 1).Value = Me.txtSpraybox.Value 
    .Offset(NextRow, 2).Value = Me.txtRanch.Value 
    .Offset(NextRow, 3).Value = Me.txtFieldBox.Value 
    .Offset(NextRow, 4).Value = Me.txtCommbox.Value 
    .Offset(NextRow, 5).Value = Me.txtVarietybox.Value 
    .Offset(NextRow, 6).Value = "Countries" 
    .Offset(NextRow, 8).Value = "US" 
    .Offset(NextRow, 9).Value = "Europe" 
    .Offset(NextRow, 10).Value = "Japan" 
    .Offset(NextRow, 11).Value = "Canada" 
    .Offset(NextRow, 12).Value = "Taiwan" 
    .Offset(NextRow, 13).Value = "NZ" 
    .Offset(NextRow, 14).Value = "S. Korea" 
    .Offset(NextRow, 15).Value = "CX" 
    .Offset(NextRow, 16).Value = "RU" 
    .Offset(NextRow, 17).Value = "Hong" 
    .Offset(NextRow, 18).Value = "Singapore" 
    .Offset(NextRow, 19).Value = "Indonesia" 
    .Offset(NextRow, 20).Value = "UK" 
    .Offset(NextRow, 21).Value = "Germany" 
    .Offset(NextRow, 22).Value = "Brazil" 
    .Offset(NextRow, 23).Value = "Thailand" 
    .Offset(NextRow, 24).Value = "Mexico" 
    .Offset(NextRow, 25).Value = "Aus" 



    If Me.cboChem <> "" Then 
     .Offset(NextRow + 1, 6).Value = Me.cboChem.Value 
     .Offset(NextRow + 1, 7).Value = Me.txtResultbox.Value 
    End If 

    If Me.cboChem2 <> "" Then 
     .Offset(NextRow + 2, 6).Value = Me.cboChem2.Value 
     .Offset(NextRow + 2, 7).Value = Me.txtResultbox2.Value 
    End If 
    If Me.cboChem3 <> "" Then 
     .Offset(NextRow + 3, 6).Value = Me.cboChem3.Value 
     .Offset(NextRow + 3, 7).Value = Me.txtResultbox3.Value 
    End If 
    If Me.cboChem4 <> "" Then 
     .Offset(NextRow + 4, 6).Value = Me.cboChem4.Value 
     .Offset(NextRow + 4, 7).Value = Me.txtResultbox4.Value 
    End If 
    If Me.cboChem5 <> "" Then 
     .Offset(NextRow + 5, 6).Value = Me.cboChem5.Value 
     .Offset(NextRow + 5, 7).Value = Me.txtResultbox5.Value 
    End If 
    If Me.cboChem6 <> "" Then 
     .Offset(NextRow + 6, 6).Value = Me.cboChem6.Value 
     .Offset(NextRow + 6, 7).Value = Me.txtResultbox6.Value 
    End If 
    If Me.cboChem7 <> "" Then 
     .Offset(NextRow + 7, 6).Value = Me.cboChem7.Value 
     .Offset(NextRow + 7, 7).Value = Me.txtResultbox7.Value 
    End If 
    If Me.cboChem8 <> "" Then 
     .Offset(NextRow + 8, 6).Value = Me.cboChem8.Value 
     .Offset(NextRow + 8, 7).Value = Me.txtResultbox8.Value 
    End If 
    If Me.cboChem9 <> "" Then 
     .Offset(NextRow + 9, 6).Value = Me.cboChem9.Value 
     .Offset(NextRow + 9, 7).Value = Me.txtResultbox9.Value 
    End If 
    If Me.cboChem10 <> "" Then 
     .Offset(NextRow + 10, 6).Value = Me.cboChem10.Value 
     .Offset(NextRow + 10, 7).Value = Me.txtResultbox10.Value 
    End If 
End With 

Теперь я хотел бы добавить строку сводки, вставленную после последней заполненной строки, каждый раз при нажатии «ОК». Я занимаюсь исследованиями последние 3 дня и не смог найти ничего, что достигнет того, что я хочу. Я также видел другие способы выполнить то, что я уже сделал (я знаю, что это не лучший способ сделать то, что я хочу), которые выглядят так, как будто бы это были лучшие способы сделать это, но я всегда получаю сообщения об ошибках, когда я пытаюсь использовать другие способы ,

Я надеялся использовать что-то вроде:

NextRow = ws.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row + 1 
ws.Cells(NextRow, 4).Value = "Overall" 

Но это не ставит его постоянно в конце списка. У меня также возникла проблема с тем, что эта форма кода работает для всех записей, но я собираюсь вернуться и попробовать сейчас, так как я просто получил этот код для запуска без предоставления сообщения об ошибке типа «Необходимый объект». Я также получаю Error 1004.

У меня не очень много знаний по кодированию фона, но я стараюсь как можно больше учиться, насколько могу. Любое объяснение того, что делает каждая строка/почему это лучше, чем то, что у меня есть, будет очень признателен.

Не имеет отношения к этому вопросу, но можно ли написать код, который позволит userform читать условное форматирование ячеек после ввода результатов и дать ответ «да»/«нет» на него? Например, я отформатировал мою таблицу, чтобы изменить ее на красный или зеленый на основе ограничений каждого столбца на результат в отдельном столбце, но иногда 4-5 строк являются частью каждого теста, поэтому я хочу, чтобы общая строка прохода/сбоя была конец каждого «теста», который вводится в форме пользователя.

ответ

0

Выражаясь последнего изменения строки:

NextRow = ws.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row + 1 

к:

NextRow = ws.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row 

.Offset(1,0) заботится о убедившись, что он находится на линии ниже последней строки данных, так +1 не требуется.

+0

Когда я использую этот код, я получаю сообщение об ошибке «1004», заданное или определенное объектом. –

+0

Где вы объявляете 'NextRow' и что объявили? – Kyle

+0

В каждом случае, когда он говорит RowCount выше, я заменил его NextRow и кодом, который вы предложили. –