2014-10-31 62 views
0

我的目标是尝试遍历Excel 2010工作表中的一组单元格,并在同一工作表中更改另一个单元格的值。这是我试图用VBA做到这一点的尝试。当我尝试更改moCost定义的单元格时,出现“Type MisMatch”错误。尝试使用VBA更改工作表中特定单元格的值失败

另外,我假设当我更改(使用工作表更改事件)我的工作表的单元格中的任何一个变量的值我使用设置它将更改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 

ExcelSpreadsheet

+0

先握住东西,在模块的顶部键入Option Explicit。这会警告你任何你没有声明或拼错的变量(提示:至少有一个)。之后,检查变量类型和您用于moCostAffordValue的属性。我从来没有使用ValueChange类型,但它显示值不是该类型的有效属性或期望的参数。 – Dave 2014-10-31 13:28:48

+0

'moCost'是一个范围,但你没有在行中设置一个范围'Set moCost = Application.Cells.Value(“A13”)'看起来像'Set moCost = Range(“A13”)'或者' A13'有一个单元格地址,然后'Set moCost = Range(Range(“A13”)。Value)'类似于其他 – 2014-10-31 13:36:36

+0

谢谢,伙计们!我会做出这些更正,并希望消除错误。 – Melinda 2014-10-31 13:40:48

回答

0

范围对象的分配是畸形的,但除此之外,他们也被分配每次什么东西在工作表中的变化,你做任何决定,甚至在然后使用。在退出分组之前将它们设置为无效也是很好的做法。这是一个你可能想要扩展的简化版本。

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。

+0

非常感谢您的信息。我非常感谢你的时间和帮助。我会试一试。 – Melinda 2014-10-31 14:46:43

+0

嗨Jeeped,不幸的是,没有工作我。我在我原来的帖子中修改了代码,以匹配上面的帖子。只是一个参考,我不得不在IF声明中输入另一个论点,因为我忘记了一个。我还发布了一个JPG文件,以便您可以看到我在做什么。总而言之,我想要做的是,我必须在B14中输入一个美元数字的值,然后如果A13,B13和B14中的值与承受能力值中的行匹配,则将C13中的值更改为该值。希望这是有道理的。 – Melinda 2014-10-31 15:50:45

相关问题