Но в WinAPI это повсеместно используется и в константах и в аргументах функций, например,
Код
result = URLDownloadToFile(0&, UrlFileName, DestinationFileName, 0&, 0&)
Call PlaySound(WAVFile, 0&, SND_ASYNC Or SND_FILENAME)
TimerID = SetTimer(0&, 0&, TimerSeconds * 1000&, AddressOf TimerProc)
SHCreateDirectoryEx ByVal 0&, StrPtr(sPath), ByVal 0&
Ret = SendMessage(hWndOK, BM_CLICK, 0, ByVal 0&)
Private Const WM_CLOSE As Long = 0&
просто 0 VBA присваивает тип Integer, а 0& VBA присваивает тип Long
Код
? Typename(0)
Integer
? Typename(0&)
Long
sokol92, да, ты прав, для VBA 0& эквивалентно CLng(0)
вот код из того файла ZVI. Я же говорю, что у ZVI научился ))
Код
Option Explicit
' Структура для QSortNonRecursive()
Private Type QStack
Low As Long
High As Long
End Type
' ZVI:2011-01-07 http://www.planetaexcel.ru/forum.php?thread_id=23032
' Функция выдает отсортированный массив уникальных значений диапазона Rng
' Аргументы фeкнкции:
' Rng - диапазон обрабатываемых значений
' RowOffset - количество строк отступа сверху диапазона для пропуска заголовков и т.п.
' MinLength - минимально допустимая длина значения, если меньше, то пропускается
Function FastNoDups(Rng As Range, Optional RowOffset&, Optional ByVal MinLength& = 1)
Dim a(), k$, x
If MinLength = 0 Then MinLength = 1
With CreateObject("Scripting.Dictionary")
For Each x In Intersect(Rng.Resize(Rng.Rows.Count - RowOffset).Offset(RowOffset), Rng.Parent.UsedRange).Value
k = Trim(x)
If Len(k) >= MinLength Then .Item(k) = 0&
Next
a() = .Keys
QSortNonRecursive a()
End With
FastNoDups = a
End Function
' Быстрая сортировка массива, см.: http://www.planetaexcel.ru/forum.php?thread_id=7702
Private Sub QSortNonRecursive(Arr())
Dim i&, j&, LB&, UB&, StPtr&, Ptr&, Pvt, Swp
Dim St() As QStack
ReDim St(1 To 64)
StPtr = 1
St(1).Low = LBound(Arr)
St(1).High = UBound(Arr)
Do
LB = St(StPtr).Low
UB = St(StPtr).High
StPtr = StPtr - 1
Do
Ptr = (LB + UB) \ 2
i = LB: j = UB: Pvt = Arr(Ptr)
Do
While Arr(i) < Pvt: i = i + 1: Wend
While Pvt < Arr(j): j = j - 1: Wend
If i <= j Then
Swp = Arr(i): Arr(i) = Arr(j): Arr(j) = Swp
i = i + 1
j = j - 1
End If
Loop While i <= j
If i < Ptr Then
If i < UB Then
StPtr = StPtr + 1
If StPtr > UBound(St) Then ReDim Preserve St(1 To UBound(St) * 2)
St(StPtr).Low = i
St(StPtr).High = UB
End If
UB = j
Else
If j > LB Then
StPtr = StPtr + 1
If StPtr > UBound(St) Then ReDim Preserve St(1 To UBound(St) * 2)
St(StPtr).Low = LB
St(StPtr).High = j
End If
LB = i
End If
Loop While LB < UB
Loop While StPtr
End Sub
Так можно использовать вместо простого 0, который VBA автоматически конвертирует в Integer писать CByte(0). Тогда компьютер будет выделять по 1 байту вместо 2 байт у Integer и 4 байт у Long Просто уже никто не следит за этим, так как сейчас на компах гигабайты оперативной памяти. Замени 0 на cbyte(0) в тестах и посмотри. Мне кажется, что разницы не будет большой
New Доброе утро по крайней мере у меня, а вы совсем не спите Согласен, что теперь это уже не очень актуально тк памяти в компах достаточно. Писать cbyte(0) наверно нет смысла, но и Long наверно не надо. Раз по умолчанию в VBA integer пусть он и остается
Доброе утро, Мне кажется 0 будет быстрее обрабатываться, чем 2 кавычки "". Это я про ваш 3й вариант P.S. извините, если с кем-то не здороваюсь, для меня мы не прощаемся и постоянно видим друг друга))
New Открыл книгу Уокенбаха строки бывают фиксированной и переменной длины. В 3 варианте скорее всего переменная длина. В книге написано она занимает 10байт+ 1байт на каждый символ. В таком случае и по объему и скорости будет хуже. А вот если там использовать строку фиксированной длины(1символ 1байт) с любым символом ANSI(однобайтным), то наверно разницы не будет.
New Согласен. Только я не знаю сколько в памяти строка 0 длины занимает.и сколько в памяти занимает значение Empty. Знаю что после инициализации переменной типа Variant она заполняется Empty.
Игнорируя полемику о сбережении памяти: Писать 0& или CByte(0) и т.д. - не имеет никакого смысла (в первую очередь по скорости), если речь не про WinAPI, у которой свои заморочки и она просто не заработает по-другому Верно? Надо отдельную тему сделать, наверное, и затестить... Я думаю, что будет незначительно медленнее, потому что это обёртка или также, как простой 0
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
если так сильно интересно, то лучше взять и самому протестировать - это заняло бы 15-30 минут а простой ответ на поставленный вопрос мог бы звучать так: 1. вот такой способ быстрее 2. вот такой способ занимает меньше памяти
лично у меня нет ответов (потому что мне это не интересно, облом потратить эти 15-30 минут на выяснение) и извините (особенно те, кто дочитал до этого сообщения, но так и не увидел ответов на два простых вопроса)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!