Обновление
, поэтому я добавил счетчик, поэтому, если совпадение, добавьте 1 к n. Если нет, то n = 0. Если n = 1, то строка = найденное число. Но почему мне нужно использовать счетчик, почему я не могу использовать свой оригинальный код?
lastrow = (subtaskws.Range("A" & Rows.Count).End(xlUp).row) + 1
lastcol = subtaskws.Cells(2, 1).End(xlToRight).Column
lastcollet = lastcol
lastcollet = Split(Cells(1, lastcol).Address, "$")(1)
lastrowST = subtaskws.Range("A" & Rows.Count).End(xlUp).row
activitynum = AddTask.TextBoxid.Value + 1
Dim Ctrl, ArrayID, userformorder As Variant, j As Long, range1 As Range, os As Integer, col, listitems As String, templatesubtaskrow As Range, tmeplatemilestonerow As Range, newrowadded As Range
userformorder = Array("SubTaskID", "TextBoxsubtask", "ComboBoxDeliverableFormat", "TextBoxcheckedcomplete", "TextBoxformat", "TextBoxacceptancecriteria", "BudgetWorkloadTextBox", "ComboBoxOwner", "TextBoxTDSNumber", "TextBoxMilestone", "TextBoxTargetDeliveryDate", "ComboBoxW", "ComboBoxI", "ComboBoxe", "TextBoxP", "TextBoxLevel", "TextBoxInputQuality", "TextBoxNewInput", "TextBoxDelay", "TextBoxInternalVV", "TextBoxReviewer", "TextBoxDelivered", "ComboBoxNumIterations", "ComboBoxAcceptance", "ComboBoxProgress", "ComboBoxStatus", "ComboBoxFlowChart", "TextBoxActivitySheet", "TextBoxEvidenceofDelivery", "TextBoxComments") 'etc
Set range1 = subtaskws.Range("A3:A" & lastrowST)
Set templatesubtaskrow = subtaskws.Range("A4:" & lastcollet & "4")
ArrayID = range1.Value
With subtaskws
n = 0
For j = LBound(ArrayID) To UBound(ArrayID)
If ArrayID(j, 1) = activitynum Then
n = n + 1
Else
n = n
End If
Next j
If n = 1 Then
newrow = j
Else
newrow = lastrow
End If
Set newrowadded = subtaskws.Range(IDCol & newrow)
Исходный вопрос
У меня есть пользовательская форма, которая заполняет лист с надписью подзадачи. Однако иногда вставляемая информация может быть в середине листа, например. 64-я строка из 140.
Я хочу найти в массиве заданное значение (activtiynum) и, если оно найдено, равно новой строке для этого недавно найденного номера строки. Если activtiynum не найден, newrow должен равняться lastrow + 1.
Однако приведенный ниже код не будет работать и отображает правильный номер строки в msgbox, но затем всегда добавляет новую строку в конце
'find lastrows, columns and cells
lastrow = (subtaskws.Range("A" & Rows.Count).End(xlUp).row) + 1
lastcol = subtaskws.Cells(2, 1).End(xlToRight).Column
lastcollet = lastcol
lastcollet = Split(Cells(1, lastcol).Address, "$")(1)
lastrowST = subtaskws.Range("A" & Rows.Count).End(xlUp).row
activitynum = AddTask.TextBoxid.Value + 1
Dim Ctrl, ArrayID, userformorder As Variant, j As Long, range1 As Range, os As Integer, col, listitems As String, templatesubtaskrow As Range, tmeplatemilestonerow As Range, newrowadded As Range
userformorder = Array("SubTaskID", "TextBoxsubtask", "ComboBoxDeliverableFormat", "TextBoxcheckedcomplete", "TextBoxformat", "TextBoxacceptancecriteria", "BudgetWorkloadTextBox", "ComboBoxOwner", "TextBoxTDSNumber", "TextBoxMilestone", "TextBoxTargetDeliveryDate", "ComboBoxW", "ComboBoxI", "ComboBoxe", "TextBoxP", "TextBoxLevel", "TextBoxInputQuality", "TextBoxNewInput", "TextBoxDelay", "TextBoxInternalVV", "TextBoxReviewer", "TextBoxDelivered", "ComboBoxNumIterations", "ComboBoxAcceptance", "ComboBoxProgress", "ComboBoxStatus", "ComboBoxFlowChart", "TextBoxActivitySheet", "TextBoxEvidenceofDelivery", "TextBoxComments") 'etc
Set range1 = subtaskws.Range("A3:A" & lastrowST)
Set templatesubtaskrow = subtaskws.Range("A4:" & lastcollet & "4")
ArrayID = range1.Value
With subtaskws
For j = LBound(ArrayID) To UBound(ArrayID)
If ArrayID(j, 1) = activitynum Then
MsgBox range1(j).row
newrow = range1(j).row
Else
newrow = lastrow
End If
Next j
.Range("A" & newrow).EntireRow.Insert
Set newrowadded = subtaskws.Range(IDCol & newrow)
templatesubtaskrow.EntireRow.Copy Destination:=newrowadded