Мне не удается найти причину

Недействительный вызов процедуры или аргумент (Ошибка 5)

Это происходит в последней строке таблицы, которую я изменяю.

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

Соответствующий код:

    VName.Value = RID.Value & " " & IIf(InStr(1, RID.Offset(columnOffset:=1).Value, vbCrLf) <> 0 And _
    (InStr(1, RID.Offset(columnOffset:=1).Value, vbCrLf) - 1) >= 10, _
    Left(RID.Offset(columnOffset:=1).Value, InStr(1, RID.Offset(columnOffset:=1).Value, vbCrLf) - 1), RID.Offset(columnOffset:=1).Value)

Полный код:

'~~~> For Each Row
'~~~> ID Row (offset by 2 columns) with SectionTitle (Cache A3) + ID starting with 0 on the header
Set RID = Nothing
Set SecT = Range("'Values'!$A$3")
Set RCount = .Range(.Cells(HC, 2), .Cells(.Cells(Rows.count, 2).End(xlUp).Row, 2))
IDCount = 0

For Each RID In RCount
    'ID Req rows
    RID.Offset(columnOffset:=-1).Value = SecT.Value & " " & IDCount
'~~~> Add ID, ReqName, Section to Values sheet where if ID is 0 then Type = Folder
        Set VSection = Worksheets("Values").Cells(Worksheets("Values").Cells(Rows.count, 2).End(xlUp).Row + 1, 2)
        VSection.EntireRow.ClearContents
        Set VName = Worksheets("Values").Cells(Worksheets("Values").Cells(Rows.count, 2).End(xlUp).Row + 1, 3)
        Set VType = Worksheets("Values").Cells(Worksheets("Values").Cells(Rows.count, 2).End(xlUp).Row + 1, 4)
        Set VID = Worksheets("Values").Cells(Worksheets("Values").Cells(Rows.count, 2).End(xlUp).Row + 1, 5)
    'Row = Header where IDCount = 0
        If IDCount = 0 Then
        VSection.Value = SecT.Value
        VName.Value = SecT.Value
        VType.Value = "Folder"
        VID.Value = IDCount
    'Row <> Header where IDCount > 0
        ElseIf IDCount > 0 Then
        VSection.Value = SecT.Value
        VName.Value = RID.Value & " " & IIf(InStr(1, RID.Offset(columnOffset:=1).Value, vbCrLf) <> 0 And _
        (InStr(1, RID.Offset(columnOffset:=1).Value, vbCrLf) - 1) >= 10, _
        Left(RID.Offset(columnOffset:=1).Value, InStr(1, RID.Offset(columnOffset:=1).Value, vbCrLf) - 1), RID.Offset(columnOffset:=1).Value)
        VName.WrapText = False
        VID.Value = IDCount
        End If
    IDCount = IDCount + 1
Next RID

RID.Value = FLO.1170
RID.Offset(columnOffset:=1).Value = WORKITEM MANAGEMENT

Вызывает

Недействительный вызов процедуры или аргумент (Ошибка 5)

Поскольку в «УПРАВЛЕНИИ РАБОЧИМ КОМПЬЮТЕРОМ» нет разрывов строк, следует использовать полное значение ячейки, а не функцию Left. Остальные 113 рядов работали нормально.

0
ssoong 12 Май 2015 в 22:09
Казалось бы, IIF оценивает оба условия, не игнорируя второе, когда первое ложно. Если And всегда оценивает оба. Если , то If оценивает только второе, если первое истинно. Я подозреваю, что второй критерий вызывает сбой, потому что он оценивается независимо от того, истинно первое или нет (в данном случае нет ), а Left не может иметь отрицательную длину. Измените IIF на пару вложенных операторов If.
 – 
user4039065
12 Май 2015 в 22:23
Кажется, работает. Спасибо за быстрый ответ.
 – 
ssoong
12 Май 2015 в 22:38
 – 
Tim Williams
12 Май 2015 в 22:41
- См. Мое расширенное объяснение и альтернативу с использованием .Split ниже.
 – 
user4039065
12 Май 2015 в 22:43

1 ответ

Лучший ответ
  1. Казалось бы, IIF оценивает оба условия, не игнорируя второе, когда первое ложно. Если И всегда оценивает оба. If then If оценивает только второе, если первое истинно. Я подозреваю, что второй критерий вызывает сбой, потому что он оценивается независимо от того, истинно первое или нет (в данном случае нет), а длина Left не может иметь отрицательную длину. Измените IIF на пару вложенных операторов If.
  2. Также похоже, что вы пытаетесь сравнить Left(<string>, <length>) с числом 10 . Это может быть неверно. Если текст, похожий на число, возвращается из Left метод, а затем оберните его в CLng () или CDbl (), чтобы получить фактическое число.
  3. Возможно, .Split будет лучший выбор. Если Split не может найти разделитель для фактического разделения чего-либо, вы все равно будете иметь исходное значение как элемент с нулевым отсчетом.

    VName.Value = RID.Value & " " & Split(RID.Offset(columnOffset:=1).Value, Chr(10))(0)

0
user4039065user4039065 12 Май 2015 в 22:42
Я не думал об использовании функции .split. Молодец, спасибо.
 – 
ssoong
12 Май 2015 в 22:54