powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Утилитки
27 сообщений из 27, показаны все 2 страниц
Утилитки
    #32649411
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как народ смотрит на то, чтобы публиковать прямо здесь маленькие процедурки-утилитки, расширяющие стандартную "функциональность" VBA?

С разъяснением - обсуждением способа их использования, есссно ...
...
Рейтинг: 0 / 0
Утилитки
    #32649413
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что такое "функциональность" ?
...
Рейтинг: 0 / 0
Утилитки
    #32649456
Фотография Shuhard
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для этого есть rusimport
формат форума для этого не удобен

P.S. Иван - опять Ura! (Geo:)
автор
расширяющие стандартную "функциональность" VBA
...
Рейтинг: 0 / 0
Утилитки
    #32649771
Фотография Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shuhard , если формат неудобен, значит это неправильный формат:)
Иван FXS , кидай сюда утилитки или хотя бы опиши их функциональность, обсудим.
...
Рейтинг: 0 / 0
Утилитки
    #32649859
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavel Иван FXS , кидай сюда утилитки ...
- дык вот ... даже и не знаю теперь ... одну вот кинул - в ветке http://www.sql.ru/forum/actualthread.aspx?tid=114321 - как то не очень ... того ... конструктивно вышло :-(
...
Рейтинг: 0 / 0
Утилитки
    #32650019
Hummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Иван FXS
Это не утилитки:) Если я каждую свою процедуру буду утилиткой для вба называть - то э\то просто монст какой-то будет:)

Утилитка, пригодившаяся мне в Аксесе Хп после перехода с 97-го - это TSI Expression - вызоа построителя выражений из редактора ВБА.
...
Рейтинг: 0 / 0
Утилитки
    #32650025
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hummer это TSI Expression - вызоа построителя выражений из редактора ВБА.
- хммм ... в чем, по-вашему, разница между
1. утилитой
2. надстройкой
и
3. визардом
?
...
Рейтинг: 0 / 0
Утилитки
    #32650034
Hummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То что вы дали по ссылке не является ни одним из вышеперечисленного.
...
Рейтинг: 0 / 0
Утилитки
    #32650874
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Утилитки
    #32654301
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для меня утилитки - это, например, функции Split(), Replace() или InStrRev() ... компрехенд?
...
Рейтинг: 0 / 0
Утилитки
    #32654502
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Public Function Array_is_Empty(arr) As Boolean
On Error GoTo EEEEE
Dim xUBound  As Long
    xUBound = UBound(arr)
Array_is_Empty = False
Exit Function

EEEEE: Array_is_Empty = True
End_SFP: End Function
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Private Sub Array_is_Empty___TEST()
Dim a1(), a2(), a3( 1 ), a4, a5
ReDim a2( 11 ), a5( 11 )

Debug.Print Array_is_Empty(a1()), Array_is_Empty(a2()), Array_is_Empty(a3())  'нельзя: Array_is_Empty(a4()), Array_is_Empty(a5()) 
Debug.Print Array_is_Empty(a1), Array_is_Empty(a2), Array_is_Empty(a3), Array_is_Empty(a4), Array_is_Empty(a5)
Debug.Print "при том, что IsEmpty() - не срабатывает (точнее - срабатывает только для Variant и только 'без скобок'):"
Debug.Print IsEmpty(a1()), IsEmpty(a2()), IsEmpty(a3())  'нельзя: IsEmpty(a4()), IsEmpty(a5()) 
Debug.Print IsEmpty(a1), IsEmpty(a2), IsEmpty(a3), IsEmpty(a4), IsEmpty(a5)
End Sub
...
Рейтинг: 0 / 0
Утилитки
    #32654614
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван, не мог бы ты объяснить - в каком отношении "функциональность" твоей улитки (мне так "утилитки" сподручней называть) шире библиотечной функции IsArray ?
(почему IsArray лучше, я, пожалуй, возьмусь разобъяснить...)
...
Рейтинг: 0 / 0
Утилитки
    #32654620
Hummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Victosha
Ваня у нас системный программист - функциональность каксеса переписывает.
...
Рейтинг: 0 / 0
Утилитки
    #32654626
Фотография kedzo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexus12Это - утилитка?
http://www.sql.ru/forum/actualthread.aspx#134935?tid=23899

такого топика, кстати, нет
...
Рейтинг: 0 / 0
Утилитки
    #32654697
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VictoshaИван, не мог бы ты объяснить - в каком отношении "функциональность" твоей улитки (мне так "утилитки" сподручней называть) шире библиотечной функции IsArray ?
(почему IsArray лучше, я, пожалуй, возьмусь разобъяснить...)
Мне кажется, вы не совсем правы.
Необходимость проверки массива на "пустоту" может возникнуть.
И IsArray здесь не поможет, он скажет True, а Ubound даст ошибку

Public artest() As String
?isarray(artest)
True
?ubound(artest)
Subscript out of range

?Array_is_Empty(artest)
True
...
Рейтинг: 0 / 0
Утилитки
    #32654715
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VictoshaИван, не мог бы ты объяснить - в каком отношении "функциональность" твоей улитки ... шире библиотечной функции IsArray ?- у-упс! Она не шире, она просто ДРУГАЯ ... добавьте
Код: plaintext
1.
2.
Debug.Print IsArray(a1()), IsArray(a2()), IsArray(a3())  ', IsArray(a4()), IsArray(a5()) 
Debug.Print IsArray(a1), IsArray(a2), IsArray(a3), IsArray(a4), IsArray(a5)
и сравните :-(

А "улитки" ... пусть будут ... мне тоже это ндравится! ;-)
...
Рейтинг: 0 / 0
Утилитки
    #32654875
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот этот топик:
http://www.sql.ru/forum/actualthread.aspx?tid=23899
Как транспонировать таблицу, или автонормализация
Удобно, когда приносят данные из Excel
(типа по горизонтали показатели, по вертикали даты)
...
Рейтинг: 0 / 0
Утилитки
    #32654947
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Иван FXS & Serge Gavrilov

я понял, наконец, что вы имеете ввиду.
Годится. хороша улитка. Мно меня же всё-таки запутала

На этом основании посмелю заявить - дважды плохо определена.

1) на вход можно подать вполне инициализированный вариант (не массив) и она скажет False, потому что решит, что это не массив, а я-то думал, что она его на "пустоту" проверит.

2) я могу понимать "пустой" массив как вполне себе инициализированный (Redim), но еще не получивший значений, отличных от значений по умолчанию.

"пустой" - плохо определено. Ubound определен лучше.
Как UboundEx улитка выглядит лучше. Хотя, используя API, она переписывается без непосредственного дерганья за ошибку.

ЗЫ
это я так, языком помолол. а упомянутое либо сыщу со ссылками на первоисточник, либо перепишу ввечеру - если есть интерес.


(с выражением лица)
...
Рейтинг: 0 / 0
Утилитки
    #32655033
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victosha... "пустой" - плохо определено. Ubound определен лучше.
Как UboundEx улитка выглядит лучше ...
- не могу согласиться: "пустой массив" и "массив с пустыми элементами" - это ведь совсем разные смыслы ...

А формулировка "массив инициализированный (Redim), но еще не получивший значений, отличных от значений по умолчанию" - это совсем уже ... аут! (Почему, кстати, Redim? С Dim (и Public) - все точно также!)

Улитки - они ведь должны функционализировать "примитивы мышления" ... по-русски: позволять просто отображать в коде то, что легко помыслить и часто приходится использовать!

Тогда - и программировать легче, и программа получается более читабельной ...
...
Рейтинг: 0 / 0
Утилитки
    #32655417
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Иван FXS
1) мне привычней массив, который Вы называете "пустым" называть неинициализированным.

2) массивы и обрашения к ним чаще всего в рамках какихто циклов встречаются. В этом смысле Ubound универсально охраняет как от обращения к неинициализированному массиву, так и определяет (верхние) границы циклов.
Ваша справедливость - часто неудобно перехватывать ошибку непосредственно от Ubound|LBound. И любая обертка - инкапсулирующая или не вызывающая ошибку - полезна.





(с выражением лица)
...
Рейтинг: 0 / 0
Утилитки
    #32655441
Хам трамвайный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как Иван начинает в рассуждалки говорить
так у меня все опускается
может чево та я не понимай в ентой жисти?
вроде форум по аксессу, а он все пургу гонит про
использование каких та фунциклеров.
ну точна теоретик.
тебя уже отправляли а форум по проектированию
чаво ж ты опять смуту сеишь?
Иван, ты нас не понимаешь наверное? - Мы другие немного.
...
Рейтинг: 0 / 0
Утилитки
    #32655719
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
раз уж заявлен некий Емпти, то вот вариант Емпти с использованием апи (что плохо) и без дерганья за ошибку (что хорошо). Ubound щас недосуг вытворять, но он "парой строк" будет отличаться. Готового не сыскал в завалах.
Иван, сам допишешь UBoundEx?


Код: 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.
Private Declare Sub CopyMemory Lib "kernel32" _
Alias "RtlMoveMemory" _
(hpvDest As Any, _
hpvSource As Any, _
ByVal cbCopy As Long)



Function IsVariantEmpty(varVar As Variant) As Boolean

 'проверяет полученную переменную на "пустоту" 
 'возвратит истину для неинициализированного массива, 
 'объектной переменной значение которой Is Nothing 
 'или неинициализированного варианта 

  If IsArray(varVar) Then
    Dim lngArrAddress As Long, saPtr As Long
     'получаем указатель на элемент данных 
    CopyMemory lngArrAddress, ByVal VarPtr(varVar) +  8 ,  4 
    
    'получаем адрес описателя массива 
    ' для неинициализированного массива он всегда будет 0 
   CopyMemory saPtr, ByVal lngArrAddress,  4 
   
   IsVariantEmpty = saPtr =  0 
  ElseIf IsObject(varVar) Then
    IsVariantEmpty = (varVar Is Nothing)
  Else
    IsVariantEmpty = IsEmpty(varVar)
  End If
End Function
...
Рейтинг: 0 / 0
Утилитки
    #32655751
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victosha2 Иван FXS
1) мне привычней массив, который Вы называете "пустым" называть неинициализированным.


как назвать массив, у которого Lbound > Ubound
?Ubound(array())
-1
?Lbound(array())
0
...
Рейтинг: 0 / 0
Утилитки
    #32655765
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serge Gavrilov Victosha2 Иван FXS
1) мне привычней массив, который Вы называете "пустым" называть неинициализированным.


как назвать массив, у которого Lbound > Ubound
?Ubound(array())
-1
?Lbound(array())
0

Природу и происхождение вопроса я не понял. Но как-нибудь отвечу.

Скажу честно – я не знаю, как его назвать.
Возможно – «нечистым» - более умного я вряд ли придумаю. Ну, разве что – «массив с искаженным описателем».

Мне неизвестен способ объявления массива с такими описателями в рамках синтаксиса языка – Redim ar(False to True) - не прокатит, прокатит только Redim ar(True to False).

Раз Вам приходится иметь дело с такими массивами, значит, ЛИБО Вам их кто-то поставляет как есть, ЛИБО массив такого сорта является результатом прямой манипуляции с описателем массива Вашей собственной процедуры, ЛИБО Вы неправильно достукиваетесь до описателя массива (например, попутан адрес описателя), ЛИБО его (описатель) кто-то сломал и сие есть признак искажения памяти программы.

В отсутствии информации о происхождении массива с таким образом сформированным описателем, нет доверия элементам, которые будут возвращены этим массивом.
По части работоспособности такого описателя – не возьмусь ничего сказать. Что называется «не пробовал». Однако некие сомнения есть в том, что механизм проверки границ диапазонов «везде пропустит» фактическую работу с таким описателем массива.

Заканчивая сие послание, определенно могу сказать только то, что ни "пустым", ни "неинициализированным" массив с такм поведением определенно назвать нельзя.


(с выражением лица)
...
Рейтинг: 0 / 0
Утилитки
    #32655775
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VictoshaПрироду и происхождение вопроса я не понял. Но как-нибудь отвечу.
Скажу честно – я не знаю, как его назвать.
Возможно – «нечистым» - более умного я вряд ли придумаю. Ну, разве что – «массив с искаженным описателем».

Мне неизвестен способ объявления массива с такими описателями в рамках синтаксиса языка – Redim ar(False to True) - не прокатит, прокатит только Redim ar(True to False).

Как понять неизвестен? Такой массив возвращает функция Array с пустым списком аргументов, как я написал.
...
Рейтинг: 0 / 0
Утилитки
    #32655792
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serge Gavrilov VictoshaПрироду и происхождение вопроса я не понял. Но как-нибудь отвечу.
Скажу честно – я не знаю, как его назвать.
Возможно – «нечистым» - более умного я вряд ли придумаю. Ну, разве что – «массив с искаженным описателем».

Мне неизвестен способ объявления массива с такими описателями в рамках синтаксиса языка – Redim ar(False to True) - не прокатит, прокатит только Redim ar(True to False).

Как понять неизвестен? Такой массив возвращает функция Array с пустым списком аргументов, как я написал.

что ж - уеден с потрохами. Хорошо хоть выражение лица есть.
Хотя я все рано не знаю как назвать такой массив, невзирая на то, чтов данном конкретном случае придется признать его пустым. Ну, хоть понятно как Ubound работает - в лоб - Ubound(dimNumber) = Bounds(DimNumber-1).Lbound + Bounds(DimNumber-1).cElements - 1

Хотя честнее со стороны Array() было бы не возвращать никакого описателя.
Ну раз уж он/она это пакостное дело делает (в отличие от Dim Ar() ), то желанная пустота (массива) проверяется так

Код: 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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
Private Declare Sub CopyMemory Lib "kernel32" _
Alias "RtlMoveMemory" _
(hpvDest As Any, _
hpvSource As Any, _
ByVal cbCopy As Long)


Type SAFEARRAY
  cDims As Integer      'число рамерностей в массиве 
  fFeatures As Integer  'св-ва типа являются ли данные указателями на строки, объекты, варианты или представляют собой непрерывный массив данных 
  cbElements As Long    'размер одного элемента в байтах 
  cLocks As Long        ' 
  pvData As Long        'указатель на данные 
End Type


Function IsVariantEmpty(varVar As Variant) As Boolean

 'проверяет полученную переменную на "пустоту" 
 'возвратит истину для неинициализированного массива, 
 'объектной переменной значение которой Is Nothing 
 'или неинициализированного варианта 

  If IsArray(varVar) Then
    Dim lngArrAddress As Long, saPtr As Long
     'получаем указатель на элемент данных 
    CopyMemory lngArrAddress, ByVal VarPtr(varVar) +  8 ,  4 
    
    'получаем адрес описателя массива 
    ' для неинициализированного массива он всегда будет 0 
   CopyMemory saPtr, ByVal lngArrAddress,  4 
   If saPtr <>  0  Then
     Dim arDesc As SAFEARRAY  ' 1D 
     CopyMemory ByVal VarPtr(arDesc), ByVal lngArrAddress, Len(arDesc)
     IsVariantEmpty = arDesc.pvData =  0 
   Else
     IsVariantEmpty = True  'saPtr = 0 
   End If
  ElseIf IsObject(varVar) Then
    IsVariantEmpty = (varVar Is Nothing)
  Else
    IsVariantEmpty = IsEmpty(varVar)
  End If
End Function

раньше ответить не мог - у мене интернета на исходе (собственно кончилась уже)

:)
...
Рейтинг: 0 / 0
Утилитки
    #32655993
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VictoshaХотя честнее со стороны Array() было бы не возвращать никакого описателя. - не скажите: по-моему так они поступили весьма находчиво и изящно!
Смотрите, это ведь Вы писали:
Victosha2) массивы и обрашения к ним чаще всего в рамках какихто циклов встречаются. В этом смысле Ubound универсально охраняет как от обращения к неинициализированному массиву, так и определяет (верхние) границы циклов.- соответственно, если бы Array() "не возвращал никакого описателя" ...
(((что, как я понимаю, означает: возвращать НЕИНИЦИАЛИЗИРОВАННЫЙ массив, - типа - как это делает функция:
Код: plaintext
1.
2.
3.
Public Function UnInitialized_Array()
                  Dim arr()
UnInitialized_Array = arr
End Function
)))
... тогда бы все последующие циклы массиву - типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Private Sub UnInitialized_Array________TEST()
Dim arr
    arr = UnInitialized_Array()
    
Debug.Print TypeName(arr), IsArray(arr)

For i = LBound(arr) To UBound(arr)
    Debug.Print arr(i)
Next
End Sub
- генерили бы ошибку!

А для Array() - все тип-топ, циклы "работают", потому как - оказываются "пустыми":
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Private Sub Array_NoElements_______TEST()
Dim arr
    arr = Array()
    
Debug.Print TypeName(arr), IsArray(arr)

For i = LBound(arr) To UBound(arr)
    Debug.Print arr(i)
Next
End Sub
...
Рейтинг: 0 / 0
27 сообщений из 27, показаны все 2 страниц
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Утилитки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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