/ / Excel VBA захищає обчислення від ділення на 0 - excel, vba, excel-vba

Excel VBA захищає обчислення від ділення на 0 - excel, vba, excel-vba

Я намагаюся заповнити клітини даними на основі простого поділу, але є (і завжди будуть) випадки, коли у мене є 0 на одному або обох кінцях рівняння.

Чи можливо обернути якийсь захист навколо рівняння, щоб, якщо це ділення на 0, воно просто встановлює значення 0, а не помилка?

Мій код

Set myRange = Range("S3:S20")
rowCounter = 3
For Each myCell In myRange
If Range("H1").Value Like "*Mon*" Then
myCell.Value = Range("Q" & rowCounter).Value
rowCounter = rowCounter + 1

Else
myCell.Value = ((myCell.Value + Range("Q" & rowCounter).Value) / Range("R" & rowCounter).Value)
rowCounter = rowCounter + 1

End If
Next myCell

Нижче наведені дані, на які посилається рівняння

P    Q      R    S
5   1:03    5   1:03
0   0:00    0   0:00
0   0:00    0   0:00
7   0:19    7   0:19
0   0:00    0   0:00
0   0:00    0   0:00
12  0:26    12  0:26
3   0:15    3   0:15
3   1:16    3   1:16
7   0:29    7   0:29
9   0:14    9   0:14
0   0:00    0   0:00
0   0:00    0   0:00
6   0:28    6   0:28
0   0:00    0   0:00
4   0:15    4   0:15
0   0:00    0   0:00
0   0:00    0   0:00

Дякую за дивись!

Відповіді:

3 для відповіді № 1

Спробуйте наведений нижче код (перевірте, чи є значення у стовпці R = 0).

З тих пір, як ви циркулюєте For Each myCell In myRange, не потрібно мати іншу змінну (rowCounter), щоб зберегти номер рядка, просто використовуйте myCell.Row.

Option Explicit

Sub HandleDev_ByZero()

Dim myRange As Range, myCell As Range

Set myRange = Range("S3:S20")
For Each myCell In myRange
If Range("H1").Value Like "*Mon*" Then
myCell.Value = Range("Q" & myCell.Row).Value
Else
If Range("R" & myCell.Row).Value = 0 Then " check if 0
myCell.Value = 0
Else
myCell.Value = ((myCell.Value + Range("Q" & myCell.Row).Value) / Range("R" & myCell.Row).Value)
End If
End If
Next myCell

End Sub

5 для відповіді № 2

Я відповідаю на ваше запитання разом із деякими іншими міркуваннями:

  • можна експлуатувати IfError() WorksheetFunction щоб зафіксувати помилку

  • це логічна помилка для повторення If Range("H1").Value Like "*Mon*" Then при кожній ітерації

    перевірте це один раз на початку, а потім продовжуйте відповідно

  • ви можете уникнути counter змінна шляхом зсуву змінної діапазону циклу

для всього, що вище ви могли кодувати

Sub main()
Dim myRange As Range, myCell As Range

Set myRange = Range("S3:S20")
If Range("H1").Value Like "*Mon*" Then
myRange.Value = myRange.Offset(, -2).Value
Else
For Each myCell In myRange
myCell.FormulaR1C1 = "=iferror((" & myCell.Value & "+ RC[-2])/RC[-1],0)"
Next myCell
myRange.Value = myRange.Value
End If
End Sub

3 для відповіді № 3

Як щодо додаткового Заява ElseIF що перевіряють значення у стовпці R:

Set myRange = Range("S3:S20")
rowCounter = 3
For Each myCell In myRange
If Range("H1").Value Like "*Mon*" Then
myCell.Value = Range("Q" & rowCounter).Value
rowCounter = rowCounter + 1
ElseIf Range("R" & rowCounter).Value <> "0" Then
myCell.Value = ((myCell.Value + Range("Q" & rowCounter).Value) / Range("R" & rowCounter).Value)
rowCounter = rowCounter + 1
Else
myCell.Value = 0
rowCounter = rowCounter + 1
End If
Next myCell