尝试使用 VBA 更改工作表中特定单元格的值失败
Posted
技术标签:
【中文标题】尝试使用 VBA 更改工作表中特定单元格的值失败【英文标题】:Attempting to change the value of a specific cell in my worksheet using VBA is failing 【发布时间】:2014-10-31 13:05:41 【问题描述】:我的目标是尝试遍历 Excel 2010 工作表中的一组单元格,并在同一个工作表中更改另一个单元格的值。这是我尝试用 VBA 做到这一点的尝试。当我尝试更改定义 moCost 的单元格时,出现“类型不匹配”错误。
另外,我假设当我更改(使用工作表更改事件)我的工作表单元格中的任何一个变量的值时,我使用了 Set 它将更改 moCostAfford si 的值,对吗?只是想确认一下。
任何帮助/指导将不胜感激。
这是我的代码:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("I4:K42")) Is Nothing Then
On Error GoTo haveError
Application.EnableEvents = False
Dim moCost As Range, moCostAmount As Range, moCostManual As Range, moCostAfford As ValueChange
Dim cell As Range, affordabilityRowValues As Range
Set moCost = Range("A13")
Set moCostAmt = Range("B13")
Set moCostManual = Range("B14")
Set moCostAfford = Range("C13")
Set affordabilityRowValues = Intersect(Target, Me.Range("I4:K42"))
For Each cell In affordabilityRowValues.Cells
If cell.Offset(0, 1) = moCost And cell.Offset(0, 2) = moCostAmount And moCostManual = "0" Then
moCostAfford = cell.Offset(0, 3).Value
Else
moCostAfford = moCostAmount
End If
Next
Set affordabilityRowValues = Nothing
Set moCostAfford = Nothing
Set moCostManual = Nothing
Set moCostAmount = Nothing
Set moCost = Nothing
Application.EnableEvents = True
End If
Exit Sub
haveError:
MsgBox Err.Description
Application.EnableEvents = True
End Sub
【问题讨论】:
首先,在模块顶部键入 Option Explicit。这将警告您任何尚未声明或拼写错误的变量(提示:至少有一个)。之后,检查变量类型和您为 moCostAffordValue 使用的属性。我从未使用过 ValueChange 类型,但似乎 Value 不是该类型的有效属性,或者需要一个参数。moCost
是一个范围,但您没有在Set moCost = Application.Cells.Value("A13")
行中设置范围,它看起来像Set moCost = Range("A13")
,或者如果A13
有一个单元格地址,那么Set moCost = Range(Range("A13").Value)
其他人类似
谢谢,伙计们!我会进行这些更正,并希望消除错误。
@Melinda:你所做的是正确的。但是有一个小变化,使用 Set moCost = Application.Cells(13, 1)。而不是指定范围 A13 使用行、列格式。
有什么原因不能在B13中简单地使用=VLOOKUP(A13, J4:K42, 2, FALSE)
?
【参考方案1】:
范围对象分配格式不正确,但除此之外,每次工作表中的任何内容发生更改时,在您做出任何使用决定之前,它们也会被分配。在退出潜艇之前将它们设置为空也是一个好习惯。这是您可能希望扩展的精简版本。
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("I4:K42")) Is Nothing Then
On Error GoTo haveError
Application.EnableEvents = False
Dim moCost As Range, moCostManual As Range, moCostAfford As ValueChange
Dim cell As Range, affordabilityRowValues As Range
Set moCost = Range("A13")
Set moCostManual = Range("B14")
Set moCostAfford = Range("C13")
Set affordabilityRowValues = Intersect(Target, Me.Range("I4:K42"))
For Each cell In affordabilityRowValues.Cells
If cell.Offset(0, 1) = moCost And cell.Offset(0, 2) = moCostManual Then
moCostAfford = cell.Offset(0, 3).Value
End If
Next
Set affordabilityRowValues = Nothing
Set moCostAfford = Nothing
Set moCostManual = Nothing
Set moCost = Nothing
Application.EnableEvents = True
End If
Exit Sub
haveError:
MsgBox Err.Description
Application.EnableEvents = True
End Sub
由于您正在使用大量单元格,我可能会转而使用存储单元格值的变量而不是单元格本身。更好的是,直接使用单元格而不是长名称的变量。如果您只是简单地使用名称而不是单元格范围引用,请考虑花时间在Formulas ► Name Manager
中创建一系列命名范围。如果您将 moCost 分配给 A13,那么您的代码可以使用 Range("moCost")
而不是声明变量并将其设置为 A13。
【讨论】:
非常感谢您提供的信息。我非常感谢您的时间和帮助。我试试看。 嗨,吉普德,不幸的是,这对我不起作用。我在原始帖子中修改了代码以匹配您上面的帖子。仅供参考,我不得不在我的 IF 语句中输入另一个参数,因为我忘记了一个。我还发布了一个 JPG 文件,以便您可以看到我在做什么。总之,我要做的是我必须将 B14 中的值输入美元数字,然后如果 A13、B13 和 B14 中的值与负担能力行值中的行匹配,则将 C13 中的值更改为该值。希望这是有道理的。以上是关于尝试使用 VBA 更改工作表中特定单元格的值失败的主要内容,如果未能解决你的问题,请参考以下文章
Excel VBA 用户定义函数:在工作表函数中获取单元格被调用