powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / есть в VB6 аналог Nz как в VBA
25 сообщений из 61, страница 2 из 3
есть в 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
25 сообщений из 61, страница 2 из 3
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / есть в VB6 аналог Nz как в VBA
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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