Excel VBA 使用范围设置命名单元格公式 属性
Excel VBA setting named cell formula using range property
希望你能帮上忙。此时我的头撞在墙上。对写作相当陌生 VBA。下面列出了一些 VBA 代码。本质上,我想做的是 lock/unlock,更改填充颜色,并使用 worksheet 更改事件和 ActiveSheet 根据下拉菜单的输入设置一系列单元格的公式。代码存在于 sheet 本身。除了公式设置部分外,一切正常。
Private Sub Worksheet_Change(ByVal Target As Range)
With ActiveSheet
.Unprotect Password:="somepw"
If Range("d17").Value = "Yes" Then
.Range("D22:D78").Locked = False
.Range("D22:D78").Interior.Color = RGB(115, 246, 42)
.Range("Inc_06PCTotRev").Formula = "=SUM($D:$D)"
ElseIf WorksheetFunction.CountA(Range("d22:D78")) <> 0 Then
If .Range("D22").Locked = True Then
With Range("D22:D78")
.Locked = False
.ClearContents
.Interior.Color = RGB(217, 217, 217)
End With
Else: .Range("D22:D78").ClearContents
End If
Else: .Range("D22:D78").Interior.Color = RGB(217, 217, 217)
.Range("D22:D78").Locked = True
End If
.Protect Password:="somepw"
End With
End Sub
当包含它时,我收到一条错误消息,指出 "method range of object _worksheet failed" 和 excel 崩溃。如果我将其注释掉,它就会毫无问题地触发。任何帮助将不胜感激。如果这不够具体或没有意义,请告诉我,我会尽力扩展。
正如我在评论中发布的那样,您处于一个永无止境的循环中,因为您在工作表更改事件中更改了工作表。您需要跟踪更改调用。可以通过创建一个变量来跟踪调用更改的时间来缓解这种情况,这也是假设名称范围是 1 个单元格。
Public bRunning As Boolean 'keeps track of when we are making the change
Private Sub Worksheet_Activate()
bRunning = False 'set to false when the sheet is activated
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If bRunning = False Then 'check to see if this is the first change
bRunning = True 'set the variable letting us know we are making the change.
With ActiveSheet
.Unprotect Password:="somepw"
If Range("d17").Value = "Yes" Then
.Range("D22:D78").Locked = False
.Range("D22:D78").Interior.Color = RGB(115, 246, 42)
.Range("Inc_06PCTotRev").Formula = "=SUM($D:$D)"
ElseIf WorksheetFunction.CountA(Range("d22:D78")) <> 0 Then
If .Range("D22").Locked = True Then
With Range("D22:D78")
.Locked = False
.ClearContents
.Interior.Color = RGB(217, 217, 217)
End With
Else: .Range("D22:D78").ClearContents
End If
Else: .Range("D22:D78").Interior.Color = RGB(217, 217, 217)
.Range("D22:D78").Locked = True
End If
.Protect Password:="somepw"
End With
Else
bRunning = False 'reset the variable as we are done making changes
End If
End Sub
如果您只需要在调用例程时执行 SUM,则可以使用 Worksheet.Sum function
:
Application.WorksheetFunction.Sum(Range("$D:$D"))
如果您确实需要该单元格中的公式,请考虑使用 FormulaR1C1 function
:
.Range("Inc_06PCTotRev").FormulaR1C1 = "=SUM(...)"
Excel 下的 Lookup FormulaR1C1 有助于更好地理解 R1C1 引用语法。如果要在其中插入公式的单元格是 $D
,则可以将上面的“...”替换为 "R[-4]C:R[-1]C"。如果公式应该在单元格 $E$20 中,您可以将上面的“...”替换为 "R[2]C[-1]:R[5]C[-1]"。
R[#] 引用目标 range/cell 中的 # 行,C[#] 引用目标 range/cell 中的 # 列。
希望你能帮上忙。此时我的头撞在墙上。对写作相当陌生 VBA。下面列出了一些 VBA 代码。本质上,我想做的是 lock/unlock,更改填充颜色,并使用 worksheet 更改事件和 ActiveSheet 根据下拉菜单的输入设置一系列单元格的公式。代码存在于 sheet 本身。除了公式设置部分外,一切正常。
Private Sub Worksheet_Change(ByVal Target As Range)
With ActiveSheet
.Unprotect Password:="somepw"
If Range("d17").Value = "Yes" Then
.Range("D22:D78").Locked = False
.Range("D22:D78").Interior.Color = RGB(115, 246, 42)
.Range("Inc_06PCTotRev").Formula = "=SUM($D:$D)"
ElseIf WorksheetFunction.CountA(Range("d22:D78")) <> 0 Then
If .Range("D22").Locked = True Then
With Range("D22:D78")
.Locked = False
.ClearContents
.Interior.Color = RGB(217, 217, 217)
End With
Else: .Range("D22:D78").ClearContents
End If
Else: .Range("D22:D78").Interior.Color = RGB(217, 217, 217)
.Range("D22:D78").Locked = True
End If
.Protect Password:="somepw"
End With
End Sub
当包含它时,我收到一条错误消息,指出 "method range of object _worksheet failed" 和 excel 崩溃。如果我将其注释掉,它就会毫无问题地触发。任何帮助将不胜感激。如果这不够具体或没有意义,请告诉我,我会尽力扩展。
正如我在评论中发布的那样,您处于一个永无止境的循环中,因为您在工作表更改事件中更改了工作表。您需要跟踪更改调用。可以通过创建一个变量来跟踪调用更改的时间来缓解这种情况,这也是假设名称范围是 1 个单元格。
Public bRunning As Boolean 'keeps track of when we are making the change
Private Sub Worksheet_Activate()
bRunning = False 'set to false when the sheet is activated
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If bRunning = False Then 'check to see if this is the first change
bRunning = True 'set the variable letting us know we are making the change.
With ActiveSheet
.Unprotect Password:="somepw"
If Range("d17").Value = "Yes" Then
.Range("D22:D78").Locked = False
.Range("D22:D78").Interior.Color = RGB(115, 246, 42)
.Range("Inc_06PCTotRev").Formula = "=SUM($D:$D)"
ElseIf WorksheetFunction.CountA(Range("d22:D78")) <> 0 Then
If .Range("D22").Locked = True Then
With Range("D22:D78")
.Locked = False
.ClearContents
.Interior.Color = RGB(217, 217, 217)
End With
Else: .Range("D22:D78").ClearContents
End If
Else: .Range("D22:D78").Interior.Color = RGB(217, 217, 217)
.Range("D22:D78").Locked = True
End If
.Protect Password:="somepw"
End With
Else
bRunning = False 'reset the variable as we are done making changes
End If
End Sub
如果您只需要在调用例程时执行 SUM,则可以使用 Worksheet.Sum function
:
Application.WorksheetFunction.Sum(Range("$D:$D"))
如果您确实需要该单元格中的公式,请考虑使用 FormulaR1C1 function
:
.Range("Inc_06PCTotRev").FormulaR1C1 = "=SUM(...)"
Excel 下的 Lookup FormulaR1C1 有助于更好地理解 R1C1 引用语法。如果要在其中插入公式的单元格是 $D
,则可以将上面的“...”替换为 "R[-4]C:R[-1]C"。如果公式应该在单元格 $E$20 中,您可以将上面的“...”替换为 "R[2]C[-1]:R[5]C[-1]"。
R[#] 引用目标 range/cell 中的 # 行,C[#] 引用目标 range/cell 中的 # 列。