Я намагаюся заповнити клітини даними на основі простого поділу, але є (і завжди будуть) випадки, коли у мене є 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