powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / есть в VB6 аналог Nz как в VBA
11 сообщений из 61, страница 3 из 3
есть в VB6 аналог Nz как в VBA
    #32546366
EDUDK01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выходит что этот вариант самый оптимальный:
Public Function NZVB(tValue As Variant, Optional substValue) As Variant

If Not IsNull(tValue) Then
NZVB = tValue
Else
If Not IsMissing(substValue) Then
NZVB = substValue
Else
NZVB = ""
End If
End If

End Function
Ветки проверяющие значение substValue поменял местами, так как в большинстве случаев эти значения не будут равны IsMissing.

И еще попутный вопрос, если эту строку Not IsNull(tValue) заменить на Not Len(myValue) = 0 то вроде должно будет работать быстрее.
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32546521
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
     \'результаты забегов     \'для большей наглядности цикл увеличен до 10000     \'NZVB1 - последний опубликованный вариант     \'nzm - См. ниже     Dim myValue As Variant     Call f1(myValue) \'0,038354 (iif)     Call f2(myValue) \'0,035980 (NZVB)     Call f4(myValue) \'0,036774 (myNz)     Call f5(myValue) \'9,179840 (Nz)     Call f6(myValue) \'0,037185 (NZVB1)     Call f7(myValue) \'0,025231 (nzm)     myValue = Null     Call f1(myValue) \'0,023376     Call f2(myValue) \'0,035795     Call f4(myValue) \'0,034384     Call f5(myValue) \'7,038936     Call f6(myValue) \'0,026409     Call f7(myValue) \'0,023907     myValue = "Value"     Call f1(myValue) \'0,040104     Call f2(myValue) \'0,026426     Call f4(myValue) \'0,026146     Call f5(myValue) \'6,842240     Call f6(myValue) \'0,025619     Call f7(myValue) \'0,024050 Public Function nzm(tValue As Variant, Optional substValue As String = "") As Variant    If tValue <> Null Then        nzm = tValue    Else        nzm = substValue    End IfEnd Function
Как отформатирован этот код?
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32546618
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1)
Len(myValue) = 0
так писать нельзя В ПРИНЦИПЕ. при myValue = Null управление будет уходить "не туда".

2)
"" - мне не нравится - проверять щас некогда, но "на глаз" это хуже vbEmpty.
для начала вместо VBNZ=vbEmpty или чего другого я бы просто Exit Function поставил (до опыта ожидал бы, что это то же самое, что vbEmpty присвоить)...
Короче, замечание про vbEmpty принято к сведению, думать буду "потом", потому как прямо щас - в поту.
Извините.
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32546625
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, забыл
tValue <> Null - хороший и, на первый взгляд - "чистый" вариант.
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32546739
EDUDK01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
новый вариант с учетом поправок :)
Public Function myNz(myValue, Optional myResult As Variant) As Variant

If myValue <> Null Then
myNz = myValue
Else
If Not IsMissing(myResult) Then
myNz = myResult
End If
End If

End Function
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32546743
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
замена "" на vbNullString - ухудшает результат, а на vbEmpty - не заметно изменений
Странно всё это.
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32546776
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторзамена "" на vbNullString - ухудшает результат
на днях встретил такой "тип" - vbNewLine работает БЫСТРЕЕ, чем vbCrLf
)))
проверил - правда.

кстати, marvan с <> Null - поздравляю. Отличный пример ЧЕСТНОЙ оптимизации.
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32546804
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Результаты забегов. Скоро начну принимать ставки :-)

Dim myValue As Variant
0,040235 - f1 (IIf)
0,037075 - f2 (NZVB)
0,036335 - f4 (myNz)
9,287639 - f5 (Nz)
0,035006 - f6 (NZVB - new)
0,028769 - f7 (nzm)
0,028142 - f8 (myNz1 - new)
myValue = Null
0,024619 - f1
0,027512 - f2
0,025877 - f4
6,828931 - f5
0,027280 - f6
0,023903 - f7
0,027324 - f8
myValue = "Value"
0,040099 - f1
0,028652 - f2
0,025586 - f4
6,609823 - f5
0,025359 - f6
0,024330 - f7
0,027525 - f8
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32546936
EDUDK01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
обработанные результаты, в порядке убывания:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
	Variant	         Null	         String            Average
nzm	0.028769000	0.023903000	0.024330000	0.025667333
myNz1	0.028142000	0.027324000	0.027525000	0.027663667
NZVB1	0.035006000	0.027280000	0.025359000	0.029215000
myNz	0.036335000	0.025877000	0.025586000	0.029266000
NZVB	0.037075000	0.027512000	0.028652000	0.031079667
IIf	0.040235000	0.024619000	0.040099000	0.034984333
Nz	9.287639000	6.828931000	6.609823000	7.575464333
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32547696
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Позволю себе несколько заключительных замечаний.
1) vbEmpty. Пока ехал домой, до меня дошло, в чем дело. Это ж надо ТАК проколоться… Уши, наверно, еще долго гореть будут. Ну, уж – топором не вырубишь. Эхь – и почему мне привиделось, что это константа для неинициализированного варианта, когда это простой Integer из набора vbVarType, СООТВЕТСТВУЮЩИЙ VarType-у неинициализированного Variant. Голову пеплом посыпаю, а оправдываться/объясняться - бесполезно. В общем, - выпендрился.
2) Не нравится “”. Общее между “” присваиваемого в качестве возвращаемого значения функции и неинициализированным Variant-ом то, что в поле значения у обоих ноль. Разница в заключается в следующем. В первом случае - функция возвращает Variant подтипа «Строка», что может приводить к неверному опознаванию «подлежащего» типа в циклических операция и, потенциально, – ошибке времени исполнения - «несоответствие типов». Второй вариант универсально приводится к типам, пригодным для приема значений, возвращаемых NZ. То есть, при получении на вход Null функция NZ обязана возвращать неинициализированный вариант. Что я по уродски пытался изобрАзить возвратом vbEmpty. Спасибо EDUCK обратил внимание, а то бы я, наверно, еще долго не догадывался, ЧТО нашкрябал.
3) <> Null. В этом месте обнаружилась особенность. <> Null приводит к поведению, не соответствующему NZ при передаче на вход функции МАССИВА. NZ безропотно возвращает этот массив «назад», а <> Null вызывает ошибку времени исполнения. Если бороться за ТОЧНОСТЬ воспроизведения поведения NZ, придется остановиться на IsNull. Эквивалентно Not IsNull должно вести себя выражение VBA.VarType(testVal) <> vbNull. По скорости оно не выигрывает, а по лаконичности – проигрывает.


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

Код: plaintext
1.
2.
3.
4.
5.
6.
Function NZVB(ByRef testVal As Variant, Optional ByRef substVal As Variant) As Variant
  If Not IsNull(testVal) Then
    NZVB = testVal
  ElseIf Not IsMissing(substVal) Then
    NZVB = substVal
  End If
End Function

ЗЫ
Напоследок. Почему я назвал tVar<> Null “Правильной оптимизацией”.
Основным напрвлением «ускорения» VB – кода в режиме native – компиляции я считаю инлайн замену «библиотечных» функций. Например, мною проверено, что инлайн замена InStr на перебор массива интов ускоряет native – код в среднем почти вдвое. На всякий случай – абсолютно вредное действие при работе во всех вариантах p-кодного исполнения, включая MS Office. В этом смысле - tVar<> Null – «ПРАВИЛЬНОЕ РЕШЕНИЕ» для native-компилированного проекта. Больше в этой функции содержательно «оптимизировать» нечего.
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32547704
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 EDUDK01
приношу извинения за неправильное "применение имени". в предыдущем посте читать EDUCK как EDUDK01

ЗЫ
это все ОНО. Умные пальцы не понимают глупую голову. ПРиходится поправлять.
...
Рейтинг: 0 / 0
11 сообщений из 61, страница 3 из 3
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / есть в VB6 аналог Nz как в VBA
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]