powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / есть в VB6 аналог Nz как в VBA
61 сообщений из 61, показаны все 3 страниц
есть в VB6 аналог Nz как в VBA
    #32536979
irinka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть в VB6 аналог как VBA Nz(траля ля, 0) или Nz(траля ля, "")
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32537022
sYstEmiZer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А чем занимается Nz в VBA?
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32537032
irinka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если значение 0,то преобразует как скажешь к "" или к др
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32537078
Фотография Alviga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понимаю тебе нужно Null преобразовать
проверяй переменную

if xVar is Null Then
.............
End if

а вообще лучше сразу преобразовать все это дело в SQL запросе
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32537132
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nz это не VBA это Access (Member of Access.Application)
можно так:
If IsNull(mVariant) Then mString = "Text"

Код: plaintext
1.
Private Sub Test()    Dim mInp As Variant    Dim mOut As String    mInp = Null        mOut = Nz(mInp, "Not Found") \' mOut равен "Not Found"        If IsNull(mInp) Then mOut = "Пусто" \' mOut равен "Пусто"End Sub
Как отформатирован этот код?
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32537149
sYstEmiZer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То-то я смотрю, что Nz в ВБА не припомню :)
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32537184
irinka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с помощью if реализовала, но хотела перейти к др варианту, так это лишние проверки, кот занимают ресурсы и память
а VBA есть такая штука Nz. Может я неправильно понимаю ее назначение, но она стоит в моем коде и при попадании на нее курсора ошибки не выдается
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32537192
irinka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
почему не VBA?
В Access есть VBA, на кот мы и пишим.
А что значит это не VBA, а Access
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32537241
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iif(isnull(a), 0, a)

?
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32537257
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
irinka почему не VBA?
Внимательно читаем предыдущие посты, если не верим - смотрим Object Browser
Nz это не VBA это Access (Member of Access.Application)
paparomeiif(isnull(a), 0, a)
красиво
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32537362
EDUDK01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VBA не VBA, Nz это тот же paparome-ский вариант конвертнутый во встроенную функцию :)
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32537363
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это не мой вариант, это почти "классика" :)
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32537367
EDUDK01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 paparome:
о том и речь, но подкинул ты его вовремя, что сказать, МОЛОДЕЦ :)
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32539884
arseny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Íèêîãäà íå ãîâîðè êîãäà
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32542349
Yuriy Goodz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну я решил для себя этот вопрос так.

Public Function nzn(mynull As Variant) As Variant

If IsNull(mynull) Then
nzn = 0
Else
nzn = mynull
End If

End Function

Public Function nzt(mynull As Variant) As Variant

If IsNull(mynull) Then
nzt = ""
Else
nzt = mynull
End If

End Function
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32542569
EDUDK01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Yuriy Goodz:

А какое отношение эти функции имеют к функции Nz()?
Логика функции Nz() состоит в возможности подстановки собственных значений если результирующее значение функции равно False. А в приведенных тобой вариантах возможность подстановки значений отсутсвует.

Во вторых, если функция возвращает строго текстовое или числовое значение то зачем хранить эти значения в формате Variant?

В третих, если ты переменную MyNull определяешь как Variant, то зачем писать две разные функции, одну для числовый значений а другую для текстовых? Как вариант, напиши одну функцию которая будет проверять сначала формат данный а затем уже значение этих данных.

А вообще, eсли следовать твоей логике, то правильный вариант функции будет выглядеть так:

Public Function myNz(myValue, myResult As Variant) As Variant
If IsNull(myValue) Then
myNz = myResult
Else
myNz= myValue
End If

End Function
Ну это собственно по примерам, а так, конечно лучший вариант это использование функции IIf.
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32542805
boevik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
если NULL надо преобразовать в пустую строку, то я использую следующую конструкцию
Код: plaintext
1.
sString = rs.fields("samefield") & ""

--------------------------------------------------
Никогда не говори никогда
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32542812
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
то я использую следующую конструкцию
sString = rs.fields("samefield") & ""


Привыкнешь, перейдешь на MSSQL, и это тебе ой как откликнется :)

А так - да, красиво :)
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32542990
boevik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторто я использую следующую конструкцию
sString = rs.fields("samefield") & ""

Привыкнешь, перейдешь на MSSQL, и это тебе ой как откликнется :)


Причем тут привязка к базе данных. Это не зависит от базы.
Работаю с Access и с MS SQL и все работает.

--------------------------------------------------
Никогда не говори никогда
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32543030
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я имел ввиду, что в T-SQL

Код: plaintext
1.
Set @f = Null
Set @f = @f + '123' -- Врнет NULL, а не строку
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32543112
boevik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
paparomeЯ имел ввиду, что в T-SQL


Тогда ясно, я говорил про VB6

--------------------------------------------------
Никогда не говори никогда
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32543116
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я понял о чем речь :)
Суть в том, что привычка - страшная штука и иногда пытаешься проделывать "несовместимые" финты :( (т.е. переносишь "не сознательно" логику программирования с одного языка на другой, не задумываясь о последствиях)
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32543449
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребят не совсем правильно поняли суть вопроса и значение функции Nz

Ваш IsNull() кроме самого значение Null ничего больше не отловит

В то время как сила(удобство) функции Nz() (из VBE; VBE-среда visual basic в Access) отлавливает все возможные варианты нулевости (что очень бывает нужно в запросах):
1. s="" (Dim s as String)
2. i=0 (Dim i as Long/Integer/Double)
3. v=Null (Dim v as Variant)
4. o=Nothing (Dim o as Object)

Соответственно чтобы сотворить свой аналог Nz(), надо в выше приведенных примерaх функций заменить IsNull() на например такой IsNullMy()

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
Public Function IsNullMy(Value As Variant) As Boolean
  
On Error GoTo Er_
    
  Select Case VarType(Value)
    Case vbEmpty
      IsNullMy = True
    Case vbNull
      IsNullMy = True
    Case  2  To  5 ,  7  ' vbInteger, vbLong, vbSingle, vbDouble, vbDate
      If Value = 0 Then _
        IsNullMy = True
    Case 9 ' vbObject
      If TypeName(Value) = "Nothing" Then _
         IsNullMy = True
    Case vbString
      If Len(Value) =  0  Then _
        IsNullMy = True
    Case  8192  To  8203 , Is >  8205 
      If UBound(Value) =  0  Then IsNullMy = True
        
  End Select

Ex_:
  Exit Function

Er_:
  MsgBox Err.Description
  Resume Ex_
   
End Function
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32543541
Фотография Шайтан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2SergeySV
где это ты нашёл, что Nz может работать с объектами и отлавливать Nothing?
Шайтан
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32544082
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Увлекся привык уже к своей MyNz(), которая со всеми работает
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32544528
goodzvb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 EDUDK01

Да, так будет точнее. Запамятовал.Зациклился на IsNull. Твой вариант лучше.
А использовать iif не лучше, так как конструкция получается длиннее :)
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32544530
Yuriy Goodz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 SergeySV

Фэнкс за функшн. Пигодится :)
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32544582
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно, кто-нибудь сможет меня убедить, что эта функция работает не так, как NZ?


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Function NZVB(tValue As Variant, Optional substValue) As Variant
 'имитирует работу Access.NZ для VB
 
  If Not IsNull(tValue) Then
    NZVB = tValue
  Else
    If IsMissing(substValue) Then
      NZVB = vbEmpty
    Else
      NZVB = substValue
    End If
  End If
End Function
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32544696
EDUDK01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Goodzvb:
IIf(myValue <> IsNothing, myValue, "Nothing")И все, где же длиннее?
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32544868
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хоть они и не все точно иммитируют Access\'овской Nz
Код: plaintext
1.
\'время работы ваших функцийSub Test()    Dim myValue As Variant    Call f1(myValue) \'0,004339    Call f2(myValue) \'0,003841    Call f3(myValue) \'0,000329    Call f4(myValue) \'0,003695    myValue = Null \'0,000000    Call f1(myValue) \'0,002560    Call f2(myValue) \'0,003254    Call f3(myValue) \'0,000925    Call f4(myValue) \'0,002686    myValue = "Value" \'0,000001    Call f1(myValue) \'0,005132    Call f2(myValue) \'0,002670    Call f3(myValue) \'0,000328    Call f4(myValue) \'0,002676End SubSub f1(myValue As Variant)    Dim mStr As String    For i = 1 To 1000        mStr = IIf(myValue <> IsNothing, myValue, "Nothing")    NextEnd SubSub f2(myValue As Variant)    Dim mStr As String    For i = 1 To 1000        mStr = NZVB(myValue, "Nothing")    NextEnd SubSub f3(myValue As Variant)    Dim mStr As String    For i = 1 To 1000        If IsNull(myValue) Then mStr = "Nothing"    NextEnd SubSub f4(myValue As Variant)    Dim mStr As String    For i = 1 To 1000        mStr = myNz(myValue, "Nothing")    NextEnd SubFunction NZVB(tValue As Variant, Optional substValue) As Variant\'имитирует работу Access.NZ для VB  If Not IsNull(tValue) Then    NZVB = tValue  Else    If IsMissing(substValue) Then      NZVB = vbEmpty    Else      NZVB = substValue    End If  End IfEnd FunctionPublic Function myNz(myValue, myResult As Variant) As Variant    If IsNull(myValue) Then        myNz = myResult        Else        myNz = myValue    End IfEnd Function
Как отформатирован этот код?
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32544950
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 marvan

-))

для полноты картины не хватает варианта запуска с отсутствующим вторым параметром
сравнения в режме компиляции native и pCode в данном случае, картинку, скорее всего, не изменят.

ЗЫ
ИМХО, для начала, корректней было бы росто "проверить функционал" - соответствие поведения имитируемому объекту - Access.NZ
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32544970
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 marvan

кстати, поделитесь секретом - как Вам удалось заставить работать вот это

Код: plaintext
1.
2.
3.
4.
5.
Sub f1(myValue As Variant)
    Dim mStr As String
    For i =  1  To  1000 
        mStr = IIf(myValue <> IsNothing, myValue, "Nothing")
    Next
End Sub

да еще и время намерить...
)))

(это шутка - без обид)
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32544979
EDUDK01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Marvan:
функция F3 здесь как оказалась? Она же работать не будет. Ну присвоит она всем "нулевым" значениям Nothing и что? А с остальными то значениями она что делать будет?
2 All:
Кстати если IsNull заменить на Len(myValue), то должно работать еще быстрее, потому как в начале каждой строки идет инфо о ее длине, соответственно не надо анализировать содержание самой строки.
И потом кто нибудь замерял как быстро Nz работает в аксесе?
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32544985
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 marvan
я понял "секрет" - option explicit "не стояло".
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32545010
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Знаете, за что я недолюбливаю Access?
Если в проекте добавить Reference на C:\Program Files\Microsoft Office 2003\OFFICE11\msacc.olb - Microsoft Access 11.0 Object (возможны другие варианты)
то в своём коде можно пользовать родную Nz
Ex: mStr = Nz(myValue, "Nothing")

Так вот время которое она показала в вышеуказанном тесте:
1,419136 ' после Dim myValue As Variant
0,889835 ' после myValue = Null
0,633024 ' после myValue = "Value"

2 Victosha
Код: plaintext
1.
Sub Test()    Dim myValue As Variant    Debug.Print IIf(myValue <> IsNothing, myValue, "Nothing")    myValue = Null    Debug.Print IIf(myValue <> IsNothing, myValue, "Nothing")    myValue = "Value"    Debug.Print IIf(myValue <> IsNothing, myValue, "Nothing")End Sub

Immediate:
Nothing
Nothing
Value

Всё работает.

время по QueryPerformanceFrequency и QueryPerformanceCounter
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32545047
EDUDK01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Marvan
круто, в самом аксесе лучше свои аналоги NZ создавать, причем выходит любой вариант кроме F3 будет лучше :)
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32545064
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 EDUDK01:
А ещё лучше если им (Access'ом) не пользоваться
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32545065
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 marvan
поставь в заголовке модуля Option Explicit

PS
в VB это завсегда так - "все работает". А что там работает?
Да разве это важно...
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32545220
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Результаты забега:
c Option Explicit и Dim IsNothing As Variant для iif варианта

Код: plaintext
    Dim myValue As Variant    Call f1(myValue) '0,004390 (IIf)    Call f2(myValue) '0,003512 (NZVB)    Call f4(myValue) '0,003648 (myNz)    Call f5(myValue) '3,380715 (Nz)    myValue = Null '0,000005    Call f1(myValue) '0,002317    Call f2(myValue) '0,002615    Call f4(myValue) '0,002499    Call f5(myValue) '0,898748    myValue = "Value" '0,000006    Call f1(myValue) '0,004345    Call f2(myValue) '0,002528    Call f4(myValue) '0,002505    Call f5(myValue) '0,705861
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32545258
EDUDK01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
надо создать "Test Poll" где будут храниться варианты решений с анализом производительности :)
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32545311
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 marvan
версия windows - какая - прям раззадорил своими замерами.
если нт-айк, может ввечеру попробую "пооптимизировать".
Полной оптимизации не обещаю.

ЗЫ
сравнивать с вызовом из Access - ИМХО - некорректно.
c Access нужно сравнивать "функционал"
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32545341
EDUDK01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Victosha:
A в чем функционал первых 3 функций уступает аксесовскому Nz? Если же всетаки уступает, то хотелось бы знать в чем и насколько это важно, потому что все таки производительность у них конкретно разная. Мне например это интересно потому что я не ожидал именно такой разницы в производительности.

А еще мне вот что интересно, несмотря на идентичность конструкции в двух случаях быстрее работает F2 а в одном F4. Причем конструкция F4 позволяет быстрее анализировать данные формата Variant, а F2 быстрее анализирует "явные" форматы типа String и Numeric. Почему?
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32545396
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
f2 и f4 сравнивать бестолку. На глаз, разница во времени в пределах погрешности. Тестирование велось под WinXP VB6 SP5 в откомпиллированном exe. Результаты с вызовом Nz из Access не удивительны, если учесть, что идёт вызов метода объекта. Вероятнее всего, в самом Access работать будет быстрее.
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32545414
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 EDUDK01
авторA в чем функционал первых 3 функций уступает аксесовскому Nz?

1)
Код: plaintext
mStr = IIf(myValue <> IsNothing, myValue, "Nothing")

смысл ЭТОГО изобретения- с Вашего позволения -без комментариев.
прим. про скорость: IIF() ВСЕГДА (и в VB и в VBA и во всех 32-разрядных версиях) медленнее, чем IF THEN ELSE ENDIF

2)

Код: plaintext
1.
2.
3.
4.
5.
Sub f3(myValue As Variant)
    Dim mStr As String
    For i =  1  To  1000 
        If IsNull(myValue) Then mStr = "Nothing"
    Next
End Sub
(не функция)
возвращает принудительно строковое значение - годится инлайн только для строкового приемника, требует обхождения с mStr = "Nothing" по месту.

3)
Код: plaintext
1.
2.
3.
4.
5.
6.
Public Function myNz(myValue, myResult As Variant) As Variant
  If IsNull(myValue) Then
       myNz = myResult
  Else
       myNz= myValue
  End If
End Function

много лучше вышеперечисленного - очень близко.
Несоответствует интерфейсу NZ - у него второй параметр не обязательный.

автор в двух случаях быстрее работает F2 а в одном F4

NZVB пыталась писаться (мною) в расчете на то, что в большинстве случаев входящее значение НЕ НУЛЛ. На таких входных данных она должна быть в среднем быстрее.

автор myNZ предполагает обратное. - это "минорные" различия.

Это просто "глубокий тип для мухоловов" - в ветку выполненного условия VB входит чуть-чуть быстрее, чем в ветку ELSE.

PS
правда, я так и не дождался доказательств несоответствия NZVB работе
Access.NZ
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32545430
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 marvan
про WinXP - понял
можно попробовать "ускорить" - пока не знаю - будет ли толк.
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32545681
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопрос про ускорение снимаю.
надежно измеримого результата получить не удается. Похоже, исходный вариант - практически оптимальный.
(разве что явно ByRef прописать... - ...)
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32545897
Yuriy Goodz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ, перестаньте стебаться, в наше время гигагерцев спорить о скорости работы отдельной функции - это издевательство над самим собой
Все, кому нужно скорость и маленький код пишут на Сях и прочих масянях (или хотбасиках с мощнобасиками )

Г.Ы. хотя конечно прикольно. Дружно "порадовались" за САКСЕСС всем отделом :)
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32546080
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНарод, перестаньте стебаться

честно говоря, я отношусь к этому по другому

автор...(тут почикано)...в наше время гигагерцев спорить о скорости работы отдельной функции - это издевательство над самим собой

оптимизация под некую цель - это не издевательство - это программистская ТЕХНИКА. Просто часть ремесла. Где и как она сгодится - вопрос отдельный. И однажды влезши в "модельную" задачку - почему бы и не посмотреть, где границы разумного.


авторВсе, кому нужно скорость и маленький код пишут на Сях и прочих масянях (или хотбасиках с мощнобасиками

само по себе все вышеперечисленное среднестатистически не обгонит native компилированный VB-проект более чем на 15-25%. Лично я к цифре около 20 склоняюсь. Если ты знаешь ПОЧЕМУ мощнобасик (или си++) окажется быстрее, то знаешь КАК ускорять VB, чтобы элиминировать эти 20%.
На задачах связанных с перемещениями/копированиями больших объемов информации в памяти - может не спасти НИКАКОЙ мощнобасик, поскольку в таких задачах организация данных + алгоритм, а не язык реализации определяют результат. Который в лучшем случае будет отличатся на порядки
(межу плохо/хорошо), а в худшем - будет нелинейно зависить от объема данных.

ЗЫ
а то, что за результат порадовались - это хорошо.

ЗЫ2 - это я не со зла - просто утро еще не прошло - никак не проснусь толком...
))
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32546277
EDUDK01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Victosha:
По поводу вчерашнего топика 13:11.
Разница все таки есть. Функция NZVB обнуляет несуществующие значения, а аксесовская NZ их "игнорирует". Для устранения разницы нужно заменить константу vbEmpty (имеет значение 0) на выражение "".
...
Рейтинг: 0 / 0
есть в VB6 аналог Nz как в VBA
    #32546294
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 EDUDK01
спасибо за замечание
...
Рейтинг: 0 / 0
есть в 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
61 сообщений из 61, показаны все 3 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / есть в VB6 аналог Nz как в VBA
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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