VBA: Как получить последнюю использованную ячейку по коду VBA, когда произошла последняя ошибка в рабочей книге / рабочей таблице? - PullRequest
4 голосов
/ 05 октября 2010

В конце концов, я хочу переместить ячейку в место, где произошла последняя ошибка. Редактировать: Забыл сказать, что я использую Excel 2003.

Ответы [ 3 ]

18 голосов
/ 06 октября 2010

В соответствии с просьбой в комментариях ...

Найдите свойство Caller объекта Application в справке VBA Excel.Когда вы используете его из подпрограммы VBA, он сообщит вам, откуда поступил вызов подпрограммы - какой диапазон, диаграмма и т. Д.

При использовании 'Application.Caller' важно помнить следующее:что это не всегда объект Range.Посмотрите на справку, но свойство возвращает значение Variant, которое может быть Range, String или Error.(Это интересующий вас объект Range, но вы должны знать об этом.)

Из-за вышеизложенного и капризов синтаксиса VBA, когда дело доходит до объектов противзначения, это может быть сложно использовать «Application.Caller».Если в вашем коде вставить строку типа:

Debug.Print Application.Caller.Address

, произойдет сбой, если вызывающая сторона не является Range.Выполнение чего-то вроде:

Dim v
v = Application.Caller

скомпилирует, но создаст циклические ссылки, когда вызывающий будет Range, потому что вы пытаетесь получить доступ к значению вызывающего Range.

Все это означает, что, вероятно, лучше написать небольшую служебную функцию для себя:

Public Function currentCaller() As String
    If TypeOf Application.Caller Is Range Then
        Dim rng As Range
        Set rng = Application.Caller

        currentCaller = rng.Address(External:=True)
    Else
        currentCaller = CStr(Application.Caller)
    End If
End Function

, а затем вызвать ее из ваших обработчиков ошибок, откуда вы хотите знать, откуда поступил вызов.

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

2 голосов
/ 05 октября 2010

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

Если вы пытаетесь отлаживать ошибки приложения, функция-оболочка может даже сохранить эти значения в текстовом файле с разделителями-запятыми. После сохранения Excel может аварийно завершить работу, и вы все равно будете знать, каково было расположение и значение ячейки, поскольку вы предварительно сохранили их вне Excel.

0 голосов
/ 05 октября 2010

Можно ли это сделать с помощью обработчика ошибок?

Пример того, что я имею в виду ниже:

sub code1()
on error goto cell A1
end sub
...