英文:
On error, show blank and resume to next row VBA MACRO
问题
我有一个非常简单的范围除法。
但是在出现错误时,应该是:如果单元格 D 为空,则 E 也应为空。
我尝试了长度(lens)和 iferror 或 isblank,似乎无法使其工作。
Sub MyMacro()
Range("E9:E20").Formula = "=IF(D9<>"", 1/D9, "")
End Sub
英文:
I have a very simple division for a range.
But on error, it should be: if cell D is empty, then E should also be empty.
I have tried lens and iferror or isblank and can't seem to get it to work.
Sub MyMacro()
Range("E9:E20").Formula = ("=1/D9")
End Sub
答案1
得分: 0
我没有看到上面的评论,但部分理解了。
搜索特定错误以清除,并将该错误设置为""。
然后,我创建了一个私有宏,在每次单元格更改时运行主要宏,以便在初始错误清除后,空白单元格现在可以重新添加公式。
注意:您必须将此放入特定的工作表,或者如果要将其放入模块中,还可以添加工作表目标。
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("P15:P134")) Is Nothing Then
Call MyMacro
End If
End Sub
Sub MyMacro()
Dim Cell As Range
Range("R15:R134").Formula = "=1/P15"
For Each Cell In Range("R15:R134")
If IsError(Cell.Value) Then
If Cell.Value = CVErr(xlErrDiv0) Then
Cell.Value = ""
End If
End If
Next Cell
End Sub
英文:
I didn't see the above comment but figured it out partially.
Search for a specific error to clear, and set that error to "".
Then I created a private macro to run the main macro every time there is a cell change, so blank cells can now have the formula added back in after initial error clear.
Note: you must put this into the specific sheet, or add in worksheet targets if you want this in a module.
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("P15:P134")) Is Nothing Then
Call MyMacro
End If
End Sub
Sub MyMacro()
Dim Cell As Range
Range("R15:R134").Formula = ("=1/P15")
For Each Cell In Range("R15:R134")
If IsError(Cell.Value) Then If Cell.Value = CVErr(xlErrDiv0) Then Cell.Value = ""
Next Cell
End Sub
答案2
得分: 0
我猜你要找的公式是=IFERROR(1/D9,"")
。
这将执行并返回除法结果,但如果结果出现错误(因为D9为空或不包含数字),它将返回一个空字符串。当然,你可以用任何你想要的值替代它。
如果你想通过VBA编写它,通常更容易切换到R1C1表示法:=IFERROR(1/RC[-1],"")
With ActiveSheet ' 在你想要处理特定工作表时替换此部分
Dim formula As String
formula = "=IFERROR(1/RC[-1],"""")"
.Range("E9:E20").FormulaR1C1 = formula
End With
更新(在澄清需要的内容之后)。看一下下面的代码。你肯定需要使用Worksheet_Change
事件来处理用户输入。代码有两个部分:
- 如果在第一列输入了内容,右侧的单元格将获得该公式 - 但仅当它不包含固定值时。
- 如果第二列的值被删除,它将再次获得该公式。只需根据你的需求调整两个
Intersect
命令中的范围。
Private Sub Worksheet_Change(ByVal Target As Range)
Const formula = "=IFERROR(1/RC[-1],"""")"
Application.EnableEvents = False
On Error GoTo Change_Exit
' 处理第一列
Dim r As Range, cell As Range
Set r = Intersect(Target, Range("D:D"))
If Not r Is Nothing Then
For Each cell In r
Dim neighbor As Range
Set neighbor = cell.Offset(0, 1)
If neighbor.HasFormula Or IsEmpty(neighbor) Then
Dim f As String
neighbor.FormulaR1C1 = formula
End If
Next
End If
' 处理第二列
Set r = Intersect(Target, Range("E:E"))
If Not r Is Nothing Then
For Each cell In r
If IsEmpty(cell) Then ' 值已删除,写入公式
cell.FormulaR1C1 = formula
End If
Next
End If
Change_Exit:
Application.EnableEvents = True
End Sub
英文:
I guess the formula you are looking for is =IFERROR(1/D9,"")
This will execute and return the division, but if the result is any error (because D9 is empty or doesn't contain a number), it will return an empty string. Of course you can replace that with any value you want.
If you want to write that via VBA, it is often easier to change to R1C1-Notation: =IFERROR(1/RC[-1],"")
With ActiveSheet ' Replace this when you want to work on a specific sheet
Dim formula As String
formula = "=IFERROR(1/RC[-1],"""")"
.Range("E9:E20").FormulaR1C1 = formula
End With
Update (after clarifying what is needed).
Have a look to the following code. You will for sure need to handle the user input using the Worksheet_Change
-Event. The code has 2 pieces:
If something was entered in the first column, the cell to the right will get the formula - but only if it doesn't contain a fixed value.
If a value on the second column was removed, it will get the formula again. Just adapt the ranges in the two Intersect
-commands to your needs.
Private Sub Worksheet_Change(ByVal Target As Range)
Const formula = "=IFERROR(1/RC[-1],"""")"
Application.EnableEvents = False
On Error GoTo Change_Exit
' Handle first column
Dim r As Range, cell As Range
Set r = Intersect(Target, Range("D:D"))
If Not r Is Nothing Then
For Each cell In r
Dim neighbor As Range
Set neighbor = cell.Offset(0, 1)
If neighbor.HasFormula Or IsEmpty(neighbor) Then
Dim f As String
neighbor.FormulaR1C1 = formula
End If
Next
End If
' Handle second column
Set r = Intersect(Target, Range("E:E"))
If Not r Is Nothing Then
For Each cell In r
If IsEmpty(cell) Then ' Value was deleted, write formula
cell.FormulaR1C1 = formula
End If
Next
End If
Change_Exit:
Application.EnableEvents = True
End Sub
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论