我对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
处退出子程序,而不会出现错误。因此,有两个问题:
On Error
命令? 编辑:如果我在IDE的“立即”框中运行该行,则会收到错误“运行时错误'1004'应用程序定义或对象定义的错误。错误,无论CacheKey
的值如何(我尝试了Empty,1234和“ Hello”)。
编辑2:如果我修改了子记录,以便对CacheKey
和CacheValue
进行硬编码并删除了对DataCache
的引用,请我独立运行该子程序。那么为什么从另一个函数中调用时它不起作用? Excel在执行计算时是否可能锁定单元格?
答案 0 :(得分:1)
不确定是否适用,但是您提到您是从另一个函数调用此宏的。如果从函数调用它,这取决于您的调用方式,这将说明您的问题。例如,输入到单元格中的工作表函数不能修改工作表上的另一个单元格。这样做的尝试将导致宏仅在该点退出,而不会引发VBA错误。
如何解决此问题取决于您尚未分享的细节。有时,工作表事件代码可能很有用。
答案 1 :(得分:0)
好吧,本来不想写答案,但是您应该在代码中修改三件事:
group by game
而非Found As Range
As Variant
,以防在〜32K之后排行RowNum As Long
不会帮助您,它只会跳转一行代码。您需要处理错误情况。 修改后的代码
On Error Resume Next