如何找出使用VBA写入Excel单元时为什么会出错?

时间:2018-09-28 19:15:54

标签: excel vba excel-vba

我对VBA还是很陌生,并且正在努力克服它的局限性(也是我的!)。这是我的代码:

Sub updateCache(CacheKey As String, CacheValue As Variant)

    Dim DataCacheWorksheet As Worksheet, CacheRange As Range, Found As Variant, RowNum As Integer

    Set DataCacheWorksheet = ThisWorkbook.Worksheets("DataCache")
    Set CacheRange = DataCacheWorksheet.Range("A1:B999")
    Set Found = CacheRange.Find(What:=CacheKey)
    If Found Is Nothing Then
        RowNum = CacheRange.Cells(Rows.Count, 2).End(xlUp).Row
        DataCache.Add CacheKey, CacheValue
        On Error Resume Next
        DataCacheWorksheet.Cells(1, 1).Value = CacheKey
        DataCacheWorksheet.Cells(1, 2).Value = CacheValue
    Else
        'Do other things
    End If
End Sub

当我单步执行代码时,Excel会简单地在行DataCacheWorksheet.Cells(1, 1).Value = CacheKey处退出子程序,而不会出现错误。因此,有两个问题:

  1. 阻止值更新的错误是什么?
  2. 为什么Excel会忽略我的On Error命令?

编辑:如果我在IDE的“立即”框中运行该行,则会收到错误“运行时错误'1004'应用程序定义或对象定义的错误。错误,无论CacheKey的值如何(我尝试了Empty,1234和“ Hello”)。

编辑2:如果我修改了子记录,以便对CacheKeyCacheValue进行硬编码并删除了对DataCache的引用,请我独立运行该子程序。那么为什么从另一个函数中调用时它不起作用? Excel在执行计算时是否可能锁定单元格?

2 个答案:

答案 0 :(得分:1)

不确定是否适用,但是您提到您是从另一个函数调用此宏的。如果从函数调用它,这取决于您的调用方式,这将说明您的问题。例如,输入到单元格中的工作表函数不能修改工作表上的另一个单元格。这样做的尝试将导致宏仅在该点退出,而不会引发VBA错误。

如何解决此问题取决于您尚未分享的细节。有时,工作表事件代码可能很有用。

答案 1 :(得分:0)

好吧,本来不想写答案,但是您应该在代码中修改三件事:

  • group by game 而非Found As Range
  • As Variant,以防在〜32K之后排行
  • 要捕获错误通常RowNum As Long不会帮助您,它只会跳转一行代码。您需要处理错误情况。

修改后的代码

On Error Resume Next