Как узнать, почему я получаю сообщение об ошибке при записи в ячейку Excel с VBA? - PullRequest
0 голосов
/ 28 сентября 2018

Я все еще довольно новичок в 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»).

Edit 2: Если я изменю подпрограмму так, чтобы CacheKey и CacheValue были жестко закодированы, ассылка на DataCache удалена, , а затем я запускаю автономный , который работает. Так почему же он не работает при вызове из другой функции? Возможно ли, что Excel блокирует ячейки при выполнении вычислений?

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Не уверен, что это применимо, но вы упомянули, что вызывали этот макрос из другой функции.Если вы вызываете его из функции, в зависимости от того, как вы ее вызываете, это объяснит вашу проблему.Например, функция рабочего листа, введенная в ячейку, не может изменить другую ячейку на рабочем листе.И попытка сделать это приведет к тому, что макрос просто выйдет в этот момент, не выдавая ошибку VBA.

Как обойти это, зависит от особенностей, которыми вы еще не поделились.Иногда может быть полезен код события рабочего листа.

0 голосов
/ 28 сентября 2018

Хорошо, не собирался писать ответ, но есть три вещи, которые вы должны изменить в своем коде:

  • Found As Range, а не As Variant
  • RowNum As Long в случае, если после ~ 32K
  • есть строка для перехвата ошибок, обычно On Error Resume Next вам не поможет, она просто перепрыгнет одну строку кода.Вы должны справиться с ошибкой ситуации.

Модифицированный код

Sub updateCache(CacheKey As String, CacheValue As Variant)

    Dim DataCacheWorksheet As Worksheet, CacheRange As Range, Found As Range, RowNum As Long ' < use Long instead of Integer

    Set DataCacheWorksheet = ThisWorkbook.Worksheets("DataCache")
    Set CacheRange = DataCacheWorksheet.Range("A1:B999")
    Set Found = CacheRange.Find(What:=CacheKey)
    If Found Is Nothing Then ' check if not found in cache (*Edit 1)
        RowNum = CacheRange.Cells(Rows.Count, 2).End(xlUp).Row

        DataCache.Add CacheKey, CacheValue ' I assume you have a `Dictionary somewhere
'        On Error Resume Next <-- Remove this, not recommended to use
        DataCacheWorksheet.Cells(1, 1).Value = CacheKey
        DataCacheWorksheet.Cells(1, 2).Value = CacheValue
    Else
        'Do other things
    End If

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...