Страницы: 1
RSS
ЧТо оозначает такое объявление переменной dim B() as variant
 
Конеретно хотелось бы узнать зачем там скобки. А так задается переменная B типа variant
 
Можно я? (нетерпеливо махая поднятой рукой) :)  
Это объявление массива!
 
Это так динамический объявляют или почему так? я думал что    
это надо делать так    
dim Myarray (1 to 100, 1 to 50) as variant
 
Вообще-то это имхо лишнее.  
Потому что потом позже в коде будет Redim b(...  
И если в начале стоит Option Explicit, то отсутствие dim B() as variant возмущение этой директивы не вызывают.
 
> Вообще-то это имхо лишнее.  
Потому что потом позже в коде будет Redim b(...  
 
А не факт. Может, там будет  
 
b = [A1:B10].Value
b = Array("vikttur", 2, "Hugo")  
 
и т.п.
 
Согласен, может быть.  
Но при работе с диапазоном надёжнее писать без скобок, чтоб работало и так ( и as variant тоже можно не писать, или есть смысл?):  
 
Dim b  
b = [A1:B10]
 
Да и зачем лишнее писать? Мы ведь макросы пишем, чтоб меньше руками работать? :)
 
{quote}{login=Hugo}{date=15.10.2011 01:14}{thema=}{post}Dim b  
b = [A1:B10]
 
Да и зачем лишнее писать? Мы ведь макросы пишем, чтоб меньше руками работать? :){/post}{/quote}  
Пишем один раз, чтобы много раз использовать, поэтому можно и нагородить :-)  
А вообще-то, кто как.Между прочим,[A1:B10] медленнее, чем Range("A1:B10"), и поэтому гикнутые на наносекундах предпочитают второй вариант, чем не нанотехнологии? ;)
 
Владимир озадачил... Накидал такой пример:  
Sub www()  
Dim t#, i&, n&  
Cells.Value = 1  
For n = 1 To 5  
t = Timer  
i = Application.WorksheetFunction.CountIf(Range("A1:IV65536"), 1)  
Debug.Print "Worksheet Function - " & Timer - t  
 
t = Timer  
i = [countif(A1:IV65536,1)]
Debug.Print "Worksheet Function1 - " & Timer - t  
Next  
End Sub  
Результат двух прогонов:  
Worksheet Function - 0,390625  
Worksheet Function1 - 0,390625  
Worksheet Function - 0,390625  
Worksheet Function1 - 0,390625  
Worksheet Function - 0,390625  
Worksheet Function1 - 0,390625  
Worksheet Function - 0,40625  
Worksheet Function1 - 0,40625  
Worksheet Function - 0,390625  
Worksheet Function1 - 0,390625  
Worksheet Function - 0,390625  
Worksheet Function1 - 0,390625  
Worksheet Function - 0,390625  
Worksheet Function1 - 0,40625  
Worksheet Function - 0,390625  
Worksheet Function1 - 0,40625  
Worksheet Function - 0,40625  
Worksheet Function1 - 0,390625  
Worksheet Function - 0,390625  
Worksheet Function1 - 0,40625
Я сам - дурнее всякого примера! ...
 
Сергей, в вашем тесте Application.WorksheetFunction.CountIf сама по себе настолько медленная, что на её фоне размывается/маскируется результат.  
 
Проверьте без дополнительных тормозных элементов и получите разность примерно вдвое:  
 
Sub TimeTest()  
   
 Const N& = 100000  
 Dim Rng As Range, i&, t!  
   
 t = Timer  
 For i = 1 To N  
   Set Rng = Range("A1:A1000")  
 Next  
 Debug.Print Round(Timer - t, 3)  
   
 t = Timer  
 For i = 1 To N  
   Set Rng = [A1:A1000]
 Next  
 Debug.Print Round(Timer - t, 3)  
     
End Sub  
 
Про особенности [Выражение] было здесь: http://www.planetaexcel.ru/forum.php?thread_id=27585
 
Причем, результат  не зависит от размера диапазона, т.е. для A1:A2 результат будет таким же. Потому что затратное здесь количество обращений из VBA к Excel. А для [Выражение] дополнительное время тратится ещё и на вычисление выражения в квадратных скобках, причем Evaluate("Выражение") мсделалдо бы это быстрее, потому что не ищет в переменных VBA, но с Range еще быстрее.
 
Впрочем, в данном случае Evaluate("Адрес") и [Адрес] по тормознутости одинаковы :-)
 
Да, у меня результат даже больше чем вдвое.
Я сам - дурнее всякого примера! ...
 
{quote}{login=ZVI}{date=15.10.2011 06:33}{thema=}{post}  
Про особенности [Выражение] было здесь: http://www.planetaexcel.ru/forum.php?thread_id=27585{/post}{/quote}Эту ссылку я и сам уже не раз предлагал друзьям. Сам объяснять не очень-то умею, мне легче ссылку дать, или в справку послать(послать в хорошем смысле:-)).
Я сам - дурнее всякого примера! ...
 
{quote}{login=KukLP}{date=15.10.2011 07:06}{thema=}{post}Да, у меня результат даже больше чем вдвое.{/post}{/quote}Я бы сказал не "в" а "на") Мои результаты:  
 
0,734 | Set Rng = Range("A1:A1000")  
2,594 | Set Rng = [A1:A1000]
 
Dim v  
 
14,172 | v = Range("A1:A1000").Value  
16,672 | v = [A1:A1000].Value
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
16,672 - 14,172 = 2,5, или ~ 2,594 в случае с объектами
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
С квадратными скобками разобрались.  
А я хотел бы вернуться к этой фразе Игоря (Hugo):  
 
<< Но при работе с диапазоном надёжнее писать без скобок, чтоб работало и так  
 
Dim b  
b = [A1:B10]
 
>>  
Дело в том, что из диапазона в массив мы, как правило, считываем ОДИН раз. Поэтому неважно, что b = [A1:B10] на миллисекунду медленнее, чем b = Range("A1:B10"). Но потом мы много работаем с массивом. Зависит ли время обращения к массиву от того, объявлен ли он как массив или как Variant, в котором содержится массив?
Попробуйте:  
 
Sub test()  
Const N = 10000  
Dim t!, t1!, t2!, i&, j&, k&, a(), b  
ReDim a(1 To N), b(1 To N)  
t = Timer  
For j = 1 To 1000  
   For i = 1 To N  
       a(i) = i  
   Next  
Next  
t1 = Timer  
For j = 1 To 1000  
   For i = 1 To N  
       b(i) = i  
   Next  
Next  
t2 = Timer  
Debug.Print "Одномерный массив"  
Debug.Print "Variant()", , t1 - t; vbLf; "Variant/Variant()", t2 - t1  
Debug.Print "Отношение", (t2 - t1) / (t1 - t)  
 
ReDim a(1 To 100, 1 To 100), b(1 To 100, 1 To 100)  
t = Timer  
For j = 1 To 1000  
   For i = 1 To 100  
       For k = 1 To 100  
           a(i, k) = i  
       Next  
   Next  
Next  
t1 = Timer  
For j = 1 To 1000  
   For i = 1 To 100  
       For k = 1 To 100  
           b(i, k) = i  
       Next  
   Next  
Next  
t2 = Timer  
Debug.Print "Двумерный массив"  
Debug.Print "Variant()", , t1 - t; vbLf; "Variant/Variant()", t2 - t1  
Debug.Print "Отношение", (t2 - t1) / (t1 - t)  
End Sub  
 
Мои результаты:  
Одномерный массив  
Variant()                    0,4453125    
Variant/Variant()            1,148438    
Отношение      2,578947    
Двумерный массив  
Variant()                    0,5859375    
Variant/Variant()            1,375    
Отношение      2,346667    
 
Время обращения отличается более чем в 2 раза! Есть смысл ставить скобки?
 
Господа авторы познавательных постов, не поленитесь, отпишитесь и в этой теме (Интересные вопросы по VBA) http://www.planetaexcel.ru/forum.php?thread_id=31716  
а то мы потом концов не сыщем!
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
Страницы: 1
Читают тему
Наверх