尝试使用 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 用户定义函数:在工作表函数中获取单元格被调用

在EXCEL中 如何用VBA查找某特定单元格并返回该单元格的行和列值?

VBA - 如何将单元格的值从文本转换为数字

vba怎样把一个单元格中的值赋给另一个单元格

如何使用 VBA 检测不适合 Excel 单元格的值?

Excel VBA 函数失败,但公式在工作表中有效