Страницы: Пред. 1 2
RSS
Оператор "Is" в VBA возвращает "False" для одинаковых диапазонов
 
Придерживаюсь таких правил:
With  - часто, .Value -  всегда, Set x =Nothing -обязательно
Их игнорирование приводит к головной боли )
 
Off
Цитата
vikttur написал:
With  - часто, .Value  -  всегда, Set x =Nothing -обязательно
После ночного маникюра загадками начал писать  :D
переводится иначе
With - C , Value - значение , Nothing - ничего   :D

UPD -  агааа, поправил втихую  
Изменено: БМВ - 13.12.2019 12:17:55
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
а после от нее отошли пояснениями с Value
Я так не думаю ... из словаря VBA:


Is Operator => Used to compare two "object reference" variables

object
variable => A variable that contains a "reference" to an object

Set Statement => Assigns an "object reference" to a "variable" or "property"
Remarks:
The Dim, Private, Public, ReDim, and Static statements only declare a variable that refers to an object
No actual object is referred to until you use the 'Set' statement to assign a specific object

Property => A named attribute of an object.
Remarks:Properties define object characteristics such as size, color, and screen location, or the state of an object, such as enabled or disabled

Range.Value Property => Returns or sets a Variant value that represents the value of the specified range
Syntax => expression.Value (RangeValueDataType)
expression => A variable that represents a "Range object"


Синтаксис типа Range ("A1") не является синонимом синтаксиса Set a = Range ("A1") - это не то же самое.

Range ("A1") является объектом, но не "ссылкой" ("object reference") на него, как в определении для оператора "Is".
Оператор "Is" предназначен только для сравнения объектов, назначенных с помощью "Set"
Само 'Range ("A1")' - без других признаков принадлежности к объекту - это (в большинстве случаев) свойство по умолчанию ".Value"

Код
    a1 = Range("A1")
    Set a11 = Range("A1")
    On Error Resume Next
    isObj = a1 Is a11 ' => Run-Time error '424': => "Object required"
    If Err.Number <> 0 Then MsgBox Str(Err.Number) & " = " & Err.Description
    On Error GoTo 0
Изменено: ocet p - 13.12.2019 15:20:02
 
ocet p, да уже обсосали несколько раз. Каждый раз вызывая Range("A1") создается новый объект и не смотря на полное совпадение свойств и значений они будут разными объектами, хотя все будут ссылаться на одну ячейку.
По вопросам из тем форума, личку не читаю.
 
а кто подскажет практическую пользу применения этого оператора? В том смысле, что я его не видел в кодах особо — только If … Is Nothing вспомнил…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
ocet p написал:
   a1 = Range("A1")
   Set a11 = Range("A1")
   On Error Resume Next
   isObj = a1 Is a11 ' => Run-Time error '424': => "Object required"
Если честно не понял что за сравнение здесь при помощи Is и зачем вообще приведен столь некорректный пример? Возможно недопонял сути сообщения, но... Is предназначен для сравнения ДВУХ объектов, а не двух переменных любого содержания и приводить пример такого неверного сравнения не вижу смысла.
Код
a1 = Range("A1")
это присвоение переменной значения по умолчанию для объекта Range. Т.к. нет ключевого Set. Т.е. по сути там либо текст, либо число(в зависимости от того, что в .Value). Но никак не объект.
Код
Set a11 = Range("A1")
это ссылка на сам объект. Т.е. Вы сравниваете объект и число. Конечно, будет ошибка.
А правильное сравнение я уже приводил и чуть его расширю(уравняем шансы сравнения переменных, так сказать):
Код
Sub IsNotIs()
    Dim rc As Range, rc2 As Range
    Set rc = Range("A1") 'везде один и тот же диапазон
    Set rc2 = Range("A1")
    Debug.Print ObjPtr(rc)
    Debug.Print ObjPtr(Range("A1"))
    Debug.Print ObjPtr(rc2)
    Debug.Print rc Is Range("A1") 'не равны
    Debug.Print rc Is rc2 'не равны
End Sub
Как видно, переменные rc и rc2 созданы через Set к одному объекту. Но сравнение Is считает их разными, потому что каждый раз создается НОВАЯ ссылка на объект Range, т.к. он по сути каждый раз создается "на лету". Нет в Excel статичной ссылки на каждый возможный вариант диапазонов, поэтому и создается такая ссылка в памяти постоянно разная при создании переменных для Range. При этом для всех ячеек листа(Cells) тоже самое правило.
Изменено: Дмитрий(The_Prist) Щербаков - 13.12.2019 17:44:20
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
При поверхностном чтении: данный механизм похож на указатели в С++, значкния указателя могут быть разные, а вот куда он указывает (кусок памяти) может быть один и тот же. Т.е. при разименовании таких указателей их содержание будет равно, сами указатели нет. Только я не пойму зачем два объекта на один и тот же диапазон. Мы можем выстрелить себе в ногу, изменив в одном данные, и не вспомнить, что они поменяются и в другом.
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал:
Только я не пойму зачем два объекта на один и тот же диапазон.
Виталий, наверно по тому что пришлось бы перебрать все объекты Range, сравнивая диапазоны и если не нашлось идентичного, то создавать новый объект, а это дольше чем просто создать новый в любом случае. Да и, как правильно замечено
Цитата
Jack Famous написал:
а кто подскажет практическую пользу применения
, именно для диапазонов.
По вопросам из тем форума, личку не читаю.
 
Собственно и Ptr в названии функции говорит о том, что возвращается указатель, а не данные на которые он указывает. Не знаю, можно ли в в VBA , его разыменовать и сравнить содержимое.
PTR - сокращение от англ. pointer, может означать: название указателя в ассемблере и языках низкого уровня. Вики.
Изменено: bedvit - 13.12.2019 20:05:33
«Бритва Оккама» или «Принцип Калашникова»?
 
Здравствуйте, коллеги! Виталий, см. упоминания Objptr здесь.
Владимир
 
БМВ, Михаил, подход транслятора понятен. Я имел ввиду зачем программисту два объекта с одним и тем же диапазоном?
sokol92, Владимир, спасибо за инфо. Как я и предполагал - возвращается указатель.
Цитата
Когда следует использовать strptr, varpt и objptr?
Вы должны использовать эти функции для извлечения указателей на строки, переменные и объекты, соответственно. В 64-разрядной версии Microsoft Office эти функции будут возвращать 64-разрядный LongPtr, который можно передать в операторы Declare. Использование этих функций не изменилось по сравнению с предыдущими версиями VBA. Разница лишь в том, что теперь они возвращают LongPtr.
Мало пользуюсь оператором "Is", поэтому в такие подробности не погружался.
Коллеги, всем спасибо за информацию.
Изменено: bedvit - 13.12.2019 22:12:15
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
Как видно, переменные rc и rc2 созданы через Set к одному объекту. Но сравнение Is считает их разными
Это уже раньше было замечено в этой теме, и, видимо, для этого служит оператор "Is", чтобы различать происхождение объектов.
Код
Sub abc_xyz()
    Dim a1 As Object, a2 As Object
    
    Set a1 = Range("A1")
    Set a2 = a1
    
    MsgBox a1 Is a2
    
    'If object1 and object2 both refer to the same object, result is True
End Sub
Страницы: Пред. 1 2
Наверх