Чем непосредственное окно VBA отличается от времени выполнения приложения? - PullRequest
0 голосов
/ 08 декабря 2008

Я столкнулся с очень странной ошибкой в ​​VBA и подумал, может ли кто-нибудь пролить свет?

Я вызываю функцию листа таким образом:

Dim lMyRow As Long
lMyRow = WorksheetFunction.Match(vItemID, rngMyRange.Columns(1), 0)

Это предназначено для получения строки элемента, который я передаю. При определенных обстоятельствах (хотя я не могу точно определить, когда именно), с вызовом функции Match происходят странные вещи.

Если я выполню эту строку в ближайшем окне, я получу следующее:

lMyRow = WorksheetFunction.Match(vItemID, rngMyRange.Columns(1), 0)
?lMyRow
10

т.е.. поиск работает, и lMyRow получает присвоенное ему значение. Если я позволю этому выражению исполниться в реальном коде, я получу значение 0.M1Row.

Это кажется очень странным! Я не понимаю, как выполнение чего-либо в непосредственном окне может привести к присвоению значения, когда один и тот же вызов в тот же момент выполнения программы может дать значение 0, когда это нормально выполняется в коде!

Единственное, о чем я могу думать, это что-то странное, но я получаю то же поведение, если переменная, которую я назначаю, - это int, double или даже строка.

Я даже не знаю, с чего начать - помогите !!

Ответы [ 6 ]

2 голосов
/ 19 декабря 2008

Вы не назначаете имя функции, чтобы функция всегда возвращала ноль (если вы ожидаете длинную). Кажется, вы должны иметь

makeTheLookup = lMyRow

в конце вашей функции.

2 голосов
/ 08 декабря 2008

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

Так что я предполагаю, что одна из ваших переменных находится вне области видимости.

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

И если у вас нет Option Explicit в верхней части вашего модуля кода VBA, вы должны добавить его.

1 голос
/ 23 декабря 2008

Я не знаю, смотрите ли вы на это или нет, но я бы написал так:

Function makeTheLookup(vItemID As Variant, rngMyRange as Range)as Long
    makeTheLookUp = WorksheetFunction.Match(vItemID, rngMyRange.Columns(1), 0)
End Function
0 голосов
/ 11 декабря 2008

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

Я бы попробовал использовать Debug.print , а также Watch, посмотреть, совпадают ли они, и взять его оттуда.

0 голосов
/ 09 декабря 2008

Спасибо за ответы, ребята - я должен был быть немного более конкретным в том, как я делаю вызов ниже:

Function makeTheLookup(vItemID As Variant, rngMyRange as Range)

Dim lMyRow As Long
lMyRow = WorksheetFunction.Match(vItemID, rngMyRange.Columns(1), 0)

End Function

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

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

Кстати, я использую Excel 2007, хотя я не уверен, что это имеет какое-то значение.

0 голосов
/ 08 декабря 2008

Я не могу воспроизвести проблему с Excel 2007.

Это был код, который я использовал:

Sub test()

Dim vItemID As Variant
Dim lMyRow As Long
Dim rngMyRange As Range

    Set rngMyRange = ActiveWorkbook.Sheets(1).Range("A1:Z256")

    vItemID = 8
    lMyRow = WorksheetFunction.Match(vItemID, rngMyRange.Columns(1), 0)

    Debug.Print lMyRow

End Sub

Это может звучать глупо, но вы уверены, что все параметры функции Match одинаковы в вашем макросе и в ближайшем окне? Может быть, объект диапазона изменился?

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