2015-04-09 3 views
4

В качестве дополнительного ответа на вопрос, который я отправил here Хотелось бы знать, почему следующее сообщение об ошибке не является ошибкой, возможно ли это в VBA?Свойство Диапазон по умолчанию дает неожиданные результаты

Возьмите следующие данные:

example data set
Если мы используем следующий VBA код, мы получим сообщение об ошибке, потому что мы должны использовать числовое значение даты, чтобы соответствовать:

'//Produces error 
Debug.Print WorksheetFunction.Match(Range("C3").Value, Range("A1:A14"), 0) 

и поэтому любой из этих утверждений будет работа:

'// Cast to Long 
Debug.Print WorksheetFunction.Match(CLng(Range("C3").Value), Range("A1:A14"), 0) 
'// Access .Value2 property directly 
Debug.Print WorksheetFunction.Match(Range("C3").Value2, Range("A1:A14"), 0) 

Однако, как указывал Jean-François Corbett, если мы не указываем свойство также работает:

Debug.Print WorksheetFunction.Match(Range("C3"), Range("A1:A14"), 0) 

Так что если .Value не работает, и это свойство по умолчанию Range объекта - почему это работает в приведенном выше примере?

Это может быть ошибка? Или существует какой-то уровень оценки, который противодействует этому?

+0

https://msdn.microsoft.com/en-gb/library/office/ff835873.aspx - Lookup_value может быть значением (числом, текстом или логическим значением) или ссылкой на номер, текст или логическое значение. Поэтому в этом случае 'WorksheetFunction.Match (Range (« C3 »), Range (« A1: A14 »), 0)' не будет использовать метод по умолчанию для объекта «Range», кроме самого объекта Range. –

+0

Даже в этом сценарии «Диапазон (« C3 »). Значение« и »Диапазон (« C3 »)' будет оцениваться и возвращать то же значение «dd/mm/yyyy», которое будет использоваться в функции вместо числовое значение - значит, все равно ошибка? –

+1

Конечно ;-)? Вы точно знаете, как работает WorksheetFunction.Match? Я не знаю, потому что это не с открытым исходным кодом. –

ответ

1

Я не думаю, что это ошибка. Если вы запустите макрос:

Debug.Print Range("C3"), Range("C3").Value, Range("C3").Value2 

Первые два будут возвращать идентичные результаты.

3/2/2015 3/2/2015 42065

Что подтверждает свойство по умолчанию как Value для Range Object.
Стоит отметить, что если вы явно используете Value всюду, он также будет работать.

Debug.Print WorksheetFunction.Match(Range("C3").Value, Range("A1:A14").Value, 0) 

Так что я думаю, что это еще одно проявление этого вопроса однажды описал here.

Если вы явно не определяете свойство Value для обоих, Excel достаточно умен, чтобы предположить, что вы соответствуете Values. Однако, если вы явно подразумеваете одно свойство, но оставляете предположение Excel другому, это не сработает.

+0

Я пробовал '.Value' с обоими аргументами - он все еще не работал. На самом деле, если я использую '.Value' вообще во втором аргументе, код не работает - ожидает ли он объект диапазона вместо массива? –

+0

MSDN подразумевает, что массив может использоваться в качестве второго аргумента - я могу только думать, что он может не работать здесь, потому что '.Value' будет производить 2-мерный массив, хотя снова я не понимаю, почему это не сработает. Это вызывает больше вопросов * d'oh * –

+0

@SO Действительно? Это работает в моем конце. Это странно. – L42

 Смежные вопросы

  • Нет связанных вопросов^_^