Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/1432: Рейтинг темы: голосов - 1432, средняя оценка - 4.86
здесь больше нет...
3376 / 1674 / 184
Регистрация: 03.02.2010
Сообщений: 1,219

Авторские программы, библиотеки, надстройки и шаблоны

12.02.2010, 17:42. Показов 277899. Ответов 259
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
 Комментарий модератора 
Коллектив модераторов раздела оставляет за собой право использовать данный пост аналитики для размещения и обновления оглавления темы.

Оглавление
- по тематике:

Утилиты


Инструменты программиста

Графические редакторы



Защита программного кода

Офисные операции

Веб-сервис


Игры




- по автору:
A-Z





Конец оглавления

Оригинальное сообщение от аналитики:

Надстройка для VBE "IndenterVBA" - позволяет редактировать стиль оформления программного кода.
Вложения
Тип файла: rar IndenterVBA.rar (253.1 Кб, 1928 просмотров)
27
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.02.2010, 17:42
Ответы с готовыми решениями:

Создать дистрибутив для надстройки Word
У меня Visual Studio 2010. 1. Я создал свой первый проект: WordAddIn. 2. Добавил в решение...

Excel 2000. Самокопирование надстройки при первом запуске
написал я соотв. надстройку на Excel записал на дискету. но не учел тот факт что каждому...

Редактирование надстройки EXCEL
Ситуация: есть файл start.xla (при запуске сам не показывается, а формирует и запускает временный...

259
209 / 184 / 43
Регистрация: 02.08.2019
Сообщений: 586
Записей в блоге: 23
03.04.2021, 09:37
Студворк — интернет-сервис помощи студентам
Привет всем!
Появился новый инструмент в надстройки MacroToolsVBA
Сбор строковых значений из кода VBA, UserForms и Ribbon панелей. Последующее их изменение и загрузка обратно в файл.
Данный инструмент предназначен для правки и перевода строковых значений на различные языки.
Можно создавать множество файлов, с настройками, под разные языки!
скачать можно тут:https://github.com/vbatools/MacroToolsVBA
Демонстрация работы инструмента:
https://youtu.be/S7io7-PC2PY
0
 Аватар для bedvit
1208 / 259 / 22
Регистрация: 20.05.2016
Сообщений: 1,136
Записей в блоге: 21
01.07.2021, 17:54
Хеш-таблица: быстрая замена словарям и коллекциям.
Быстрее от нескольких раз до нескольких порядков! Пользуйтесь. Пишите насколько быстрее VBA-аналогов у вас?
4
 Аватар для KoGG
5636 / 1618 / 418
Регистрация: 23.12.2010
Сообщений: 2,426
Записей в блоге: 1
20.06.2022, 10:11
Класс аналог ScriptingDictionary для систем без библиотеки MicrosoftScripting.
Модуль класса с именем ScriptingDictionaryAnalog
Кликните здесь для просмотра всего текста
Visual Basic
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
Private MyCol As New Collection, KeyArray()
 
Public Sub Add(MyKey, MyItem)
    MyCol.Add MyItem, CStr(MyKey)
    ReDim Preserve KeyArray(1 To MyCol.Count)
    KeyArray(MyCol.Count) = CStr(MyKey)
End Sub
 
Public Property Get Count() As Long
    Count = MyCol.Count
End Property
 
Public Function Exists(MyKey) As Boolean
    On Error GoTo Err1
    MyCol.Add 0, CStr(MyKey)
    MyCol.Remove CStr(MyKey)
    Exists = False
    Exit Function
Err1:
    Err.Clear
    Exists = True
End Function
 
Public Property Get Item(Optional MyKey)
    ''Attribute Item.VB_UserMemId = 0
    Attribute Item.VB_UserMemId = 0
    If IsObject(MyCol(CStr(MyKey))) Then
       Set Item = MyCol(CStr(MyKey))
    Else
       Item = MyCol(CStr(MyKey))
    End If
End Property
 
Public Property Let Item(Optional MyKey, ByVal NewItem)
    ''Attribute Item.VB_UserMemId = 0
    Attribute Item.VB_UserMemId = 0
    On Error GoTo Err2
    MyCol.Add NewItem, CStr(MyKey)
    ReDim Preserve KeyArray(1 To MyCol.Count)
    KeyArray(MyCol.Count) = CStr(MyKey)
    Exit Property
Err2:
    Err.Clear
    MyCol.Remove CStr(MyKey)
    MyCol.Add NewItem, CStr(MyKey)
End Property
 
Public Function Items()
    Dim A(), i&, El
    ReDim A(1 To MyCol.Count)
    For Each El In MyCol
        i = i + 1
        If IsObject(El) Then
            Set A(i) = El
        Else
             A(i) = El
        End If
    Next
End Function
 
Public Property Let Key(MyKey)
    Dim OldItem
    If IsObject(MyCol(MyKey)) Then
        Set OldItem = MyCol(MyKey)
    Else
        OldItem = MyCol(MyKey)
    End If
    MyCol.Remove MyKey
    MyCol.Add OldItem, CStr(MyKey)
End Property
 
Public Function Keys()
    Keys = KeyArray
End Function
 
Public Sub Remove(MyKey)
    Dim i&, El, KeyArrayOld()
    KeyArrayOld() = KeyArray()
    MyCol.Remove CStr(MyKey)
    ReDim KeyArray(1 To MyCol.Count)
    For Each El In KeyArrayOld
        If El <> CStr(MyKey) Then
            i = i + 1
            KeyArray(i) = El
        End If
    Next
End Sub
 
Public Sub RemoveAll()
    Dim El
    For Each El In KeyArray
        MyCol.Remove El
    Next
    ReDim KeyArray(1)
End Sub
Для того, чтобы свойство Item заработало по умолчанию, модуль класса нужно выгрузить на диск, удалить и загрузить заново. При новой загрузке незакоментированные строки "Attribute Item.VB_UserMemId = 0" исчезнут из редактора, но будут срабатывать.

Пример использования:
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Sub Class_ScriptingDictionaryAnalog_Example()
    Dim vX, Dic As New ScriptingDictionaryAnalog
    Dic.Add "AA", 1
    Dic.Add "BB", 2
    Dic.Item("CC") = 3
    Dic("DD") = 4
    Debug.Print Dic.Exists("BB")
    Debug.Print Dic.Count
    For Each vX In Dic.Keys
       Debug.Print vX, Dic.Item(vX)
    Next
    Dic.Item("CC") = 30
    For Each vX In Dic.Keys
       Debug.Print vX, Dic(vX)
    Next
    Dic.Remove "AA"
    For Each vX In Dic.Keys
       Debug.Print vX, Dic(vX)
    Next
    Dic.RemoveAll
    Debug.Print Dic.Count
    Set Dic = Nothing
End Sub
2
1379 / 834 / 89
Регистрация: 08.02.2017
Сообщений: 3,478
Записей в блоге: 1
02.08.2022, 08:16
Цитата Сообщение от KoGG Посмотреть сообщение
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Public Function Items()
 Dim A(), i&, El
 ReDim A(1 To MyCol.Count)
 For Each El In MyCol
 i = i + 1
 If IsObject(El) Then
 Set A(i) = El
 Else
 A(i) = El
 End If
 Next
End Function
Видимо возврат забыли, поставить, дописал Items = a, зачирикали итемсы. Вообще классная вещь, уже оценил.)

Добавлено через 13 минут
Не все одинаково, с Dictionary, пришлось немного поразбираться)
Во первых не нужен Set при присваивании объектов, его наличие вызывает ошибку.
2е массивы ключей и итемов начинаютс не с 0 а с 1
3е элемент не создается запросом (Msgbox Dic("несуществующий_элемент") вызовет ошибку)
4е что особенно ценно на мой взгляд, можно использовать объекты-ячейки (или как их там), как уникальные ключи, что не доступно в Dictionary
5е поскольку, основано на Collection должна сохраняться очередность элементов, что также ценно)

Добавлено через 6 минут
Цитата Сообщение от bedvit Посмотреть сообщение
Хеш-таблица: быстрая замена словарям и коллекциям.
Также хотелось бы потестить, но все задумки сводятся к использованию ячеек в качестве ключей. Это явно для массовых задач.
0
 Аватар для bedvit
1208 / 259 / 22
Регистрация: 20.05.2016
Сообщений: 1,136
Записей в блоге: 21
02.08.2022, 08:39
testuser2, Все задумки сводятся к использованию любых базовых типов данных в качестве ключа (храниься в виде строки). Так же как и в словарях и коллекциях VBA.
Причем здесь ячейки? Из ячейки тоже можно взять значения для ключа или из переменной VBA или откуда угодно.
0
1379 / 834 / 89
Регистрация: 08.02.2017
Сообщений: 3,478
Записей в блоге: 1
02.08.2022, 08:45
Цитата Сообщение от bedvit Посмотреть сообщение
Из ячейки тоже можно взять значения для ключа или из переменной VBA или откуда угодно.
Но ведь для этого нужно время на обращение к объектам?
0
 Аватар для bedvit
1208 / 259 / 22
Регистрация: 20.05.2016
Сообщений: 1,136
Записей в блоге: 21
02.08.2022, 08:58
testuser2, предлагаю Вам ознакомиться с темой поближе. Можно там же задать вопрос, или здесь создать новую тему, я отвечу. Работает быстрее чем словари и коллекции VBA.
0
1379 / 834 / 89
Регистрация: 08.02.2017
Сообщений: 3,478
Записей в блоге: 1
02.08.2022, 11:22
Цитата Сообщение от testuser2 Посмотреть сообщение
4е что особенно ценно на мой взгляд, можно использовать объекты-ячейки
Наконец-то я прозрел, коллекция берет не объекты в ключи, а лишь значения ячеек, все убегаю с темы, больше не мусорю
0
1379 / 834 / 89
Регистрация: 08.02.2017
Сообщений: 3,478
Записей в блоге: 1
03.11.2023, 13:59
Функция RedimPreserve2D1ColumnVar. Позволяет редимить одностолбиковый 2D вариантный массив. Как известно, Redim Preserve можно делать только для крайней правой размерности. По этой причине одномерный или однострочный 2D массив можно редимить безпрепядственно, а одностолбиковый нет, хотя по структуре данных они все одинаковые. Если перобразовать на время одностолбиквый в однострочный (или одномерный) то можно редимить и его (как в примере). Для работы с массивом другого типа, нужно просто поменят тип переменной Arr.
Кликните здесь для просмотра всего текста
Visual Basic
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
44
45
Declare PtrSafe Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As LongPtr)
Declare PtrSafe Function ArrPtr Lib "msvbvm60" Alias "VarPtr" (Src() As Any) As LongPtr
 
Type SAFEARRAYBOUND
    cCount              As Long
    lBound              As Long
End Type
Type SAFEARRAYBOUND2D
    Bounds(1)           As SAFEARRAYBOUND
End Type
#If Win64 Then
    Const ptrSz         As LongPtr = 8
    Const offsetBnds    As LongPtr = 24
#Else
    Const ptrSz         As Long    = 4
    Const offsetBnds    As Long    = 16
#End If
 
Sub RedimPreserve2D1ColumnVar(Arr(), newLBnd As Long, newUBnd As Long)
    Dim SABnd2D As SAFEARRAYBOUND2D
    RedimPreserve2D1ColumnVar_ Arr(), newLBnd, newUBnd, SABnd2D
End Sub
Sub RedimPreserve2D1ColumnVar_(Arr(), newLBnd As Long, newUBnd As Long, SABnd2D As SAFEARRAYBOUND2D, Optional ByVal stumb As Long)
    Dim tmpBnds As SAFEARRAYBOUND, pSA As LongPtr    
    CopyMemory pSA, ByVal ArrPtr(Arr), ptrSz
    CopyMemory ByVal VarPtr(stumb) - ptrSz, pSA + offsetBnds, ptrSz
    tmpBnds = SABnd2D.Bounds(0)
    SABnd2D.Bounds(0) = SABnd2D.Bounds(1)
    SABnd2D.Bounds(1) = tmpBnds
    ReDim Preserve Arr(SABnd2D.Bounds(1).lBound To UBound(Arr), SABnd2D.Bounds(0).lBound To newUBnd)
    SABnd2D.Bounds(1) = SABnd2D.Bounds(0)
    SABnd2D.Bounds(0) = tmpBnds
    SABnd2D.Bounds(0).lBound = newLBnd
End Sub
 
Sub ПримерИспользования()
    Dim Arr()
    ReDim Arr(1 To 5, 1 To 1)
    Arr(1, 1) = 2
    Arr(2, 1) = 5
    Arr(3, 1) = 7
    Stop 'см. Locals
    RedimPreserve2D1ColumnVar Arr, 1, 3
    Stop 'см. Locals
End Sub
0
 Аватар для AndreA SN
1021 / 125 / 2
Регистрация: 26.08.2011
Сообщений: 1,218
Записей в блоге: 2
09.11.2023, 00:11
аналитика, IndenterVBA для 2016 офиса стоит использовать? Надстройка актуализируется? Помнится мне когда-то ее использование было удовольствием.
1
1 / 1 / 0
Регистрация: 26.01.2024
Сообщений: 2
26.01.2024, 14:16
Всем привет!

Не претендую на оригинальность или мастерство кодинга, однако в сети не нашел решения под задачу (даже описания метода), потому выкладываю тут своё решение.

Генератор комбинаций

Позволяет получить результаты множественных пересечений вариантов.
Возможны несколько режимов работы, в зависимости от задачи.
Так же, реализована функция фильтрации исключений в результатах в различных режимах.

Области входных данных реализованы через "умные таблицы" на листе. Вся обработка функционирует через объект "Dictionary".

В самом файле так же присутствует описание таблиц в свернутых областях.

Немного истории.
Была задача, подготовить файлы к загрузке в 1С. В файлах находится описание из каталога по спец.технике складской и её возможных опций. У всего своя цена и условия применения опций. В общей сложности, примерно 90000 вариаций. Для этого была разработана обработка генерации, которая получает полный перечень всех возможных комплектаций в разрезе модели.

Еще сценарии использования:
Обработку можно использовать нестандартно. Например, если надо выбрать звучное имя ребенку, то в качестве базы взять Фамилию, в качестве перечисления предполагаемые Имена, а в качестве комбинаторики Отчество. По итогу, получатся различные комбинации ФИО.
Или чтобы просчитать все комбинации событий, тогда базой будет отправная точка, с начальным весовым значением, перечислением будут одни последующие события со своими весовыми коэффициентами, а комбинаторикой будут дальнейшие события. В зависимости от выбранного режима, можно получить итоговые комбинации с суммарными весовыми коэффициентами возможности развития сценария (субъективно).

Да и в целом, возможно кому-нибудь пригодятся алгоритмы.
Вложения
Тип файла: zip Генератор комбинаций.zip (70.3 Кб, 12 просмотров)
1
500 / 155 / 19
Регистрация: 04.10.2015
Сообщений: 615
01.02.2024, 21:39
Довольно часто для построения диаграмм использование стандарного инструмента MS Graph нежелательно, например по соображениям совместимости.
Как альтернатива этому, можно использовать для этого функции GDI (Graphics Device Interface).
Качество полученных диаграмм при этом, может не уступать диаграммам Microsoft (конечно все зависит от квалификации программиста).
Единственное, что может сдерживать применение этих функций - это их недостаточное знание и природная леность.

Я не призываю к отказу от тех инструментов, к которым привыкли пользователи, пусть каждый решает это сам, но ввиду крохотного размера этой утилиты имеет повод задуматься над его использованием.
Здесь выложена демонстрация лишь очень небольшого объема возможностей, с помощью которых можно создавать графику на GDI, но если вас это заинтересует как программиста, то вас ждет много открытий в этой области. Я в этом уверен.

Разработано и протестировано на 32 разрядном Office. Работает также и на Win64.

Примечание.
Для того, чтобы это работало, нужно в настройках Excel выставить опцию
"Доверять доступ к Visual Basic Project" в True (галочка установлена)
или в некоторых версиях она может называться "Доверять доступ к объектной модели проектов VBA", а также понизить уровень безопасности макросов.
Миниатюры
Авторские программы, библиотеки, надстройки и шаблоны  
Вложения
Тип файла: rar Diagrams_LiteVer2.rar (126.4 Кб, 25 просмотров)
2
1379 / 834 / 89
Регистрация: 08.02.2017
Сообщений: 3,478
Записей в блоге: 1
26.03.2024, 17:56
Класс для работы с буфером обмена vbaCleapboard, взятый мной по ссылке на другом форуме и доработан мной для лучшей поддержки кириллицы and etc..
Кликните здесь для просмотра всего текста
Visual Basic
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
'Class vbaClipboard
'Code edited from https://social.msdn.microsoft.com/Forums/office/en-US/ee9e0d28-0f1e-467f-8d1d-1a86b2db2878/a-clipboard-object-for-vba-including-microsoft-word?forum=worddev
'Moved to VB7 64 bit support https://stackoverflow.com/questions/35416662/text-to-clipboard-in-vba-windows-10-issue
'Improved by Tester to support Unicode, Utf8 and etc. 24-26.03.24 https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=1&TID=163737&TITLE_SEO=163737-vba-chast-teksta-_poluzhirnyy_-v-bufer-obmena_-iz-peremennoy&MID=1293241#message1293241
Option Explicit
 
#If VBA7 Then
    Private Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As LongPtr) As LongPtr
    Private Declare PtrSafe Function RegisterClipboardFormatW Lib "user32" (ByVal lpString As LongPtr) As Long 'Ptr
    Private Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long
    Private Declare PtrSafe Function CloseClipboard Lib "user32" () As LongPtr
    Private Declare PtrSafe Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Long) As Long
    Private Declare PtrSafe Function GetClipBoardData Lib "user32" Alias "GetClipboardData" (ByVal wFormat As Long) As LongPtr
    Private Declare PtrSafe Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As LongPtr) As LongPtr
    Private Declare PtrSafe Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As LongPtr
    Private Declare PtrSafe Function GlobalLock Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr
    Private Declare PtrSafe Function GlobalUnlock Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr
    Private Declare PtrSafe Function GlobalSize Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr
    Private Declare PtrSafe Function lstrcpyW Lib "kernel32" (ByVal lpString1 As LongPtr, ByVal lpString2 As LongPtr) As LongPtr
    'NOTE: These declarations are not provided in https://stackoverflow.com/questions/35416662/text-to-clipboard-in-vba-windows-10-issue
    Private Declare PtrSafe Function EnumClipboardFormats Lib "user32" (ByVal wFormat As Long) As Long
    Private Declare PtrSafe Function GetClipboardFormatNameW Lib "user32" (ByVal wFormat As Long, ByVal lpString As LongPtr, ByVal nMaxCount As Long) As Long 'Ptr
    Private Declare PtrSafe Function GlobalFree Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr
    Private Declare PtrSafe Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As LongPtr, ByVal cchMultiByte As Long, ByVal lpWideCharStr As LongPtr, ByVal cchWideChar As Long) As Long
    Private Declare PtrSafe Function WideCharToMultiByte Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As LongPtr, ByVal cchWideChar As Long, ByVal lpMultiByteStr As LongPtr, ByVal cchMultiByte As Long, ByVal lpDefaultChar As LongPtr, ByVal lpUsedDefaultChar As LongPtr) As Long
#Else
    Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function RegisterClipboardFormatW Lib "user32" (ByVal lpString As Long) As Long
    Private Declare Function EmptyClipboard Lib "user32" () As Long
    Private Declare Function CloseClipboard Lib "user32" () As Long
    Private Declare Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Long) As Long
    Private Declare Function GetClipBoardData Lib "user32" (ByVal wFormat As Long) As Long
    Private Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
    Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
    Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
    Private Declare Function GlobalSize Lib "kernel32" (ByVal hMem As Long) As Long
    Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
    'the code from this thread, use:
    'Replacing with that used in https://stackoverflow.com/questions/35416662/text-to-clipboard-in-vba-windows-10-issue
    Private Declare Function lstrcpyW Lib "kernel32" (ByVal lpString1 As Long, ByVal lpString2 As Long) As Long
    'NOTE: These declarations are not provided in https://stackoverflow.com/questions/35416662/text-to-clipboard-in-vba-windows-10-issue
    Private Declare Function EnumClipboardFormats Lib "user32" (ByVal wFormat As Long) As Long
    Private Declare Function GetClipboardFormatNameW Lib "user32" (ByVal wFormat As Long, ByVal lpString As Long, ByVal nMaxCount As Long) As Long
    Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
    Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As Long, ByVal cbMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
    Private Declare Function WideCharToMultiByte Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpDefaultChar As Long, ByVal lpUsedDefaultChar As Long) As Long
'    Private Declare Function SysAllocStringByteLen Lib "oleaut32" (ByVal olestr As Long, ByVal BLen As Long) As Long
'    Private Declare Function SysAllocStringLen Lib "oleaut32" (ByVal olestr As Long, ByVal BLen As Long) As Long
#End If
 
Private Const GMEM_MOVEABLE = &H2
Private Const GMEM_ZEROINIT = &H40
Private Const GHND = (GMEM_MOVEABLE Or GMEM_ZEROINIT) 'Use for hwnd
Private Const NAME_MAX_LENGTH = 1024
Private Const APINULL = 0
Private Const CF_TEXT = 1               'Text format. Each line ends with a carriage return/linefeed (CR-LF) combination. A null character signals the end of the data. Use this format for ANSI text.
Private Const CF_BITMAP = 2             'A handle to a bitmap (HBITMAP).
Private Const CF_METAFILEPICT = 3       'Handle to a metafile picture format as defined by the METAFILEPICT structure. When passing a CF_METAFILEPICT handle by means of DDE, the application responsible for deleting hMem should also free the metafile referred to by the CF_METAFILEPICT handle.
Private Const CF_SYLK = 4               'Microsoft Symbolic Link (SYLK) format.
Private Const CF_TIFF = 6               'Tagged-image file format.
Private Const CF_DIF = 5                'Software Arts' Data Interchange Format.
Private Const CF_OEMTEXT = 7            'Text format containing characters in the OEM character set. Each line ends with a carriage return/linefeed (CR-LF) combination. A null character signals the end of the data.
Private Const CF_DIB = 8                'A memory object containing a BITMAPINFO structure followed by the bitmap bits.
Private Const CF_PALETTE = 9            'Handle to a color palette. Whenever an application places data in the clipboard that depends on or assumes a color palette, it should place the palette on the clipboard as well.
Private Const CF_PENDATA = 10           'Data for the pen extensions to the Microsoft Windows for Pen Computing.
Private Const CF_RIFF = 11              'Represents audio data more complex than can be represented in a CF_WAVE standard wave format.
Private Const CF_WAVE = 12              'Represents audio data in one of the standard wave formats, such as 11 kHz or 22 kHz PCM.
Private Const CF_UNICODETEXT = 13       'Unicode text format. Each line ends with a carriage return/linefeed (CR-LF) combination. A null character signals the end of the data.
Private Const CF_ENHMETAFILE = 14       'A handle to an enhanced metafile (HENHMETAFILE).
Private Const CF_HDROP = 15             'A handle to type HDROP that identifies a list of files. An application can retrieve information about the files by passing the handle to the DragQueryFile function.
Private Const CF_LOCALE = 16            'The data is a handle to the locale identifier associated with text in the clipboard. When you close the clipboard, if it contains CF_TEXT data but no CF_LOCALE data, the system automatically sets the CF_LOCALE format to the current input language. You can use the CF_LOCALE format to associate a different locale with the clipboard text.
Private Const CF_DIBV5 = 17             'A memory object containing a BITMAPV5HEADER structure followed by the bitmap color space information and the bitmap bits.
Private Const CF_DSPBITMAP = &H82       'Bitmap display format associated with a private format. The hMem parameter must be a handle to data that can be displayed in bitmap format in lieu of the privately formatted data.
Private Const CF_DSPENHMETAFILE = &H8E  'Enhanced metafile display format associated with a private format. The hMem parameter must be a handle to data that can be displayed in enhanced metafile format in lieu of the privately formatted data.
Private Const CF_DSPMETAFILEPICT = &H83 'Metafile-picture display format associated with a private format. The hMem parameter must be a handle to data that can be displayed in metafile-picture format in lieu of the privately formatted data.
Private Const CF_DSPTEXT = &H81         'Text display format associated with a private format. The hMem parameter must be a handle to data that can be displayed in text format in lieu of the privately formatted data.
Private Const CF_GDIOBJFIRST = &H300    'Start of a range of integer values for application-defined GDI object clipboard formats. The end of the range is CF_GDIOBJLAST.
Private Const CF_GDIOBJLAST = &H3FF     'See CF_GDIOBJFIRST.
Private Const CF_OWNERDISPLAY = &H80    'Owner-display format. The clipboard owner must display and update the clipboard viewer window, and receive the WM_ASKCBFORMATNAME, WM_HSCROLLCLIPBOARD, WM_PAINTCLIPBOARD, WM_SIZECLIPBOARD, and WM_VSCROLLCLIPBOARD messages. The hMem parameter must be NULL.
Private Const CF_PRIVATEFIRST = &H200   'Start of a range of integer values for private clipboard formats. The range ends with CF_PRIVATELAST. Handles associated with private clipboard formats are not freed automatically; the clipboard owner must free such handles, typically in response to the WM_DESTROYCLIPBOARD message.
Private Const CF_PRIVATELAST = &H2FF    'See CF_PRIVATEFIRST.
Private Const CP_UTF8 As Long = 65001
Public Enum CharsetFlags
    vbUnic = 0 'double-byte
    vbAnsi = 1 'single-byte
    vbUtf8 = 2
End Enum
Public Enum ClearFlags
    ClearClip = True
    NotClearClip = False
End Enum
 
Public Property Get ClipboardFormatsAvailable() 'As Dictionary
    Const maxlen As Long = 50
    Dim FormatNum As Long
    Dim ln As Long
    Dim FormatName As String
    On Error GoTo ErrorHandler
        
    Set ClipboardFormatsAvailable = CreateObject("Scripting.Dictionary")
    OpenClipboard 0
    FormatNum = EnumClipboardFormats(FormatNum)
    While FormatNum <> 0
        FormatName = String(maxlen, vbNullChar)
        ln = GetClipboardFormatNameW(FormatNum, StrPtr(FormatName), maxlen)
        FormatName = Left(FormatName, ln)
        If FormatName = vbNullString Then
            FormatName = BuiltInClipboardFormatName(FormatNum)
        End If
        
        ClipboardFormatsAvailable.Add FormatName, FormatNum
                
        FormatNum = EnumClipboardFormats(FormatNum)
    Wend
    CloseClipboard
    
    Exit Property
ErrorHandler:
    On Error Resume Next
    CloseClipboard
End Property
 
Public Property Get GetText(Format, Optional ByVal Charset As CharsetFlags) As String
#If VBA7 Then
    Dim hMemory As LongPtr
'    Dim iLock As LongPtr
#Else
    Dim hMemory As Long
'    Dim iLock As Long
#End If
    Dim wSize As Long
    Dim FormatName As String
    Dim FormatNumb As Long
    
    Select Case VarType(Format)
    Case vbString
        FormatName = Format
        FormatNumb = BuiltInClipboardFormatNumber(FormatName)
        If FormatNumb = vbEmpty Then
            FormatNumb = GetFormatNumber(FormatName)
            If FormatNumb = 0 Then Exit Property 'формат отсутствует в б/о
        End If
    Case vbInteger To vbDouble
        FormatNumb = Format
        If IsClipboardFormatAvailable(FormatNumb) = APINULL Then Exit Property
    '        Err.Raise vbObjectError + 1, "vbaClipboard", "Requested clipboard format number " & FormatNumb & " Is Not available On the clipboard."
    '    End If
    Case Else: Exit Property                'если формат не строка и не число, завершаем функцию
    End Select
    
    OpenClipboard vbEmpty
    hMemory = GetClipBoardData(FormatNumb)  'получение текст из буфера
    CloseClipboard
    If hMemory = vbEmpty Then Exit Property
'        Err.Raise vbObjectError + 1, "vbaClipboard", "Unable To retrieve data from the Clipboard."
'    End If
    
    wSize = CLng(GlobalSize(hMemory))       'копирование текста в переменную
    If wSize = vbEmpty Then Exit Property
'    iLock = GlobalLock(hMemory)
    GetText = String(wSize / 2, vbNullChar)
    lstrcpyW StrPtr(GetText), hMemory 'iLock
'    GlobalUnlock hMemory
    
    If Charset = vbAnsi Then                'преобразование кодировки (при необходимости)
        GetText = StrConv(GetText, vbUnicode)
    ElseIf Charset = vbUtf8 Then
        GetText = FromUTF8(GetText)
    End If
End Property
 
Public Sub SetText(sText As String, Format, Optional ByVal Charset As CharsetFlags, Optional ByVal ClearFlag As ClearFlags)
#If VBA7 Then
    Dim iStrPtr As LongPtr
    Dim iLock As LongPtr
#Else
    Dim iStrPtr As Long
    Dim iLock As Long
#End If
    Dim iLen As Long
    Dim FormatName As String
    Dim FormatNumber As Long
    
    If ClearFlag Then OpenClipboard 0: EmptyClipboard: CloseClipboard 'опциональная очистка б/о
    
    Select Case VarType(Format)
    Case vbString
        FormatName = Format
        FormatNumber = BuiltInClipboardFormatNumber(FormatName)
        If FormatNumber = 0 Then
            FormatNumber = GetFormatNumber(FormatName) 'если в б/о существует формат, используем его.
            If FormatNumber = 0 Then
                FormatNumber = RegisterClipboardFormatW(StrPtr(FormatName)) 'Nope. Register the format
            End If
        End If
        Select Case FormatName
          Case "HTML Format"
            sText = addHTMLWraper(sText) 'преобразуется в Ansi (1byte) по умолчанию
            iLen = LenB(sText) + 1
            GoTo 1
        End Select
    Case vbInteger To vbDouble
        FormatNumber = Format
    Case Else: Exit Sub               'если тип переменной Format не число и не строка, завершаем процедуру
    End Select
        
    If Charset = vbAnsi Then          '1byte
        sText = StrConv(sText, vbFromUnicode)
    ElseIf Charset = vbUtf8 Then
        sText = ToUTF8(sText)
    End If
    iLen = LenB(sText) + 2
    
1   iStrPtr = GlobalAlloc(GHND, iLen) 'выделение глобального блока памяти и копирование туда текста
    iLock = GlobalLock(iStrPtr)
    lstrcpyW iLock, StrPtr(sText)
    GlobalUnlock iStrPtr
    
    OpenClipboard 0
    SetClipboardData FormatNumber, iStrPtr 'запись в б/о
    GlobalFree iStrPtr                'освобождение памяти
    CloseClipboard
End Sub
 
Public Sub Clear()                    'очистка б/о
    OpenClipboard 0
    EmptyClipboard
    CloseClipboard
End Sub
 
Public Function GetFormatNumber(FormatName As String) As Long
    Const maxlen As Long = 50
    Dim sName As String
    Dim ln As Long
    
    OpenClipboard 0
    GetFormatNumber = EnumClipboardFormats(GetFormatNumber)
    Do While GetFormatNumber '<> 0
        sName = String$(maxlen, vbNullChar)
        ln = GetClipboardFormatNameW(GetFormatNumber, StrPtr(sName), maxlen)
        If ln Then
            sName = Left(sName, ln)
        Else
            sName = BuiltInClipboardFormatName(GetFormatNumber)
        End If
        
        If sName = FormatName Then Exit Do
                
        GetFormatNumber = EnumClipboardFormats(GetFormatNumber)
    Loop
    CloseClipboard
End Function
Private Function BuiltInClipboardFormatNumber(aClipboardFormatName As String) As Long
    Dim result As Long
    Select Case UCase(aClipboardFormatName)
    Case "CF_TEXT": result = 1
    Case "CF_BITMAP": result = 2
    Case "CF_METAFILEPICT": result = 3
    Case "CF_SYLK": result = 4
    Case "CF_DIF": result = 5
    Case "CF_TIFF": result = 6
    Case "CF_OEMTEXT": result = 7
    Case "CF_DIB": result = 8
    Case "CF_PALETTE": result = 9
    Case "CF_PENDATA": result = 10
    Case "CF_RIFF": result = 11
    Case "CF_WAVE": result = 12
    Case "CF_UNICODETEXT": result = 13
    Case "CF_ENHMETAFILE": result = 14
    Case "CF_HDROP": result = 15
    Case "CF_LOCALE": result = 16
    Case "CF_DIBV5": result = 17
    Case "CF_DSPBITMAP": result = &H82
    Case "CF_DSPENHMETAFILE": result = &H8E
    Case "CF_DSPMETAFILEPICT": result = &H83
    Case "CF_DSPTEXT": result = &H81
    Case "CF_GDIOBJFIRST": result = &H300
    Case "CF_GDIOBJLAST": result = &H3FF
    Case "CF_OWNERDISPLAY": result = &H80
    Case "CF_PRIVATEFIRST": result = &H200
    Case "CF_PRIVATELAST": result = &H2FF
    Case Else: result = 0
    End Select
    BuiltInClipboardFormatNumber = result
End Function
Private Function BuiltInClipboardFormatName(ByVal aIndex As Long) As String 'Note: Adding LongPtr this to support 64Bit
    Dim n As String
    Select Case aIndex
    Case 1: n = "CF_TEXT"
    Case 2: n = "CF_BITMAP"
    Case 3: n = "CF_METAFILEPICT"
    Case 4: n = "CF_SYLK"
    Case 5: n = "CF_DIF"
    Case 6: n = "CF_TIFF"
    Case 7: n = "CF_OEMTEXT"
    Case 8: n = "CF_DIB"
    Case 9: n = "CF_PALETTE"
    Case 10: n = "CF_PENDATA"
    Case 11: n = "CF_RIFF"
    Case 12: n = "CF_WAVE"
    Case 13: n = "CF_UNICODETEXT"
    Case 14: n = "CF_ENHMETAFILE"
    Case 15: n = "CF_HDROP"
    Case 16: n = "CF_LOCALE"
    Case 17: n = "CF_DIBV5"
    Case &H82: n = "CF_DSPBITMAP"
    Case &H8E: n = "CF_DSPENHMETAFILE"
    Case &H83: n = "CF_DSPMETAFILEPICT"
    Case &H81: n = "CF_DSPTEXT"
    Case &H300: n = "CF_GDIOBJFIRST"
    Case &H3FF: n = "CF_GDIOBJLAST"
    Case &H80: n = "CF_OWNERDISPLAY"
    Case &H200: n = "CF_PRIVATEFIRST"
    Case &H2FF: n = "CF_PRIVATELAST"
    End Select
    BuiltInClipboardFormatName = n
End Function
Private Function addHTMLWraper(ByVal sHtmlElement As String) As String
    Const sHtmlHeader = "Version:1.0" & vbCrLf & _
            "StartHTML:0000000105" & vbCrLf & _
            "EndHTML:0000000000" & vbCrLf & _
            "StartFragment:0000000138" & vbCrLf & _
            "EndFragment:0000000000" & vbCrLf & _
            "<HTML><BODY><!--StartFragment -->"
    Const sContextEnd = "<!--EndFragment --></BODY></HTML>"
    sHtmlElement = StrConv(ToUTF8(sHtmlElement), vbUnicode)
    addHTMLWraper = sHtmlHeader & sHtmlElement & sContextEnd
    Mid$(addHTMLWraper, 44) = Format(Len(addHTMLWraper), "0000000000")
    Mid$(addHTMLWraper, 94) = Format(138 + Len(sHtmlElement), "0000000000") '138 = Len(sHtmlHeader)
    addHTMLWraper = StrConv(addHTMLWraper, vbFromUnicode) ',vbNarrow??
End Function
 
Private Function TrimNull(ByVal aString As String) As String
    Dim nullAt As Long
    nullAt = InStr(1, aString, vbNullChar)
    If nullAt > 0 Then
        TrimNull = Left(aString, nullAt - 1)
    Else
        TrimNull = aString
    End If
End Function
Private Function ToUTF8(sText As String) As String 'unicode(2byte) to utf8(1byte)
    Dim ln As Long
    ln = WideCharToMultiByte(CP_UTF8, 0, StrPtr(sText), Len(sText), 0, 0, 0, 0)
    If ln Then
        ToUTF8 = MidB$(String$(ln \ 2 + 1, vbNullChar), 1, ln)
        WideCharToMultiByte CP_UTF8, 0, StrPtr(sText), Len(sText), StrPtr(ToUTF8), ln, 0, 0
    End If
End Function
Public Function FromUTF8(sText As String) As String 'utf8(1byte) to unicode(2byte)
    Dim ln As Long
    ln = MultiByteToWideChar(CP_UTF8, 0, StrPtr(sText), LenB(sText), 0, 0)
    If ln Then
        FromUTF8 = String(ln, vbNullChar)
        MultiByteToWideChar CP_UTF8, 0, StrPtr(sText), LenB(sText), StrPtr(FromUTF8), ln
    End If
End Function

Кликните здесь для просмотра всего текста
Visual Basic
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
Sub ПримерИспользования()
    Dim myClp As New vbaClipboard, key
    Dim formats 'as Dictionary
    
    'Перечисление всех форматов в б/о
    Set formats = myClp.ClipboardFormatsAvailable
    For Each key In formats
        Debug.Print formats(key), key
    Next
    Stop
    
    'поместить форматированный текст в б/о
    myClp.SetText "Простой текст1", 13, ClearFlag:=True 'помещаем строку в б/о без преобразований
    Stop
    myClp.SetText "Простой текст2", "CF_TEXT", vbAnsi 'c преобразованием в Ansi
    Stop
'    myClp.Clear
    myClp.SetText "<b>Жирный текст</b>, не жирный текст", "HTML Format" 'преобразуется в utf8 по умолчанию
    Stop
    
    MsgBox "Скопируйте какой-нибудь текст в браузере"
    Stop
    'получить текст из б/о
    Debug.Print myClp.GetText(1, vbAnsi)              'получить с преобразованием из Ansi
    Stop
    Debug.Print myClp.GetText("CF_UNICODETEXT")       'без преобразования (из юникода)
    Stop
    Debug.Print myClp.GetText("HTML Format", vbUtf8)  'с преобразованием из Utf8
    Stop
End Sub
1
1705 / 574 / 74
Регистрация: 10.04.2009
Сообщений: 9,283
27.03.2024, 08:45
testuser2, там у вас в коде If VBA7 - это ворд 2007?
у меня именно ворд 2007 и весь блок
между #If VBA7 Then и #Else
вставлен красного цвета и на 1-й строке ругается на myClp As New vbaClipboard
\\\\\\\\\\\\
но главное задумка Скопируйте какой-нибудь текст в браузере
это понятно, а что разве в Иммедиате Debug.Print реально будет печатать скопированное в трёх интерпретациях согласно кода?
0
1379 / 834 / 89
Регистрация: 08.02.2017
Сообщений: 3,478
Записей в блоге: 1
13.05.2024, 02:33
Класс ArrayContainer являющийся дополнительным кнтейнером для массива, позволяющего поместить массив внутрь объектов и изменять их там. Как известно vb*-классы да и вообще com-классы, реализую принцип инкапсуляции, и изолирования данных, благодаря чему можно поместить в объект, исключительно копию массива, и получить из объекта опять же копию уже того массива, который внутри объекта. Данный клас призван исправить эту ситуацию не без помощи типа Variant, и его волшебных свойств, и позволяет как бы прикоснуться к массиву, помещенному внутрь объекта и даже произвести над ним какие-то действия. Что мне особенно понравилось, получилось редим без использования дополнитльной переменной. Такой метод coll(1).Ar()(2) работатет также не совсем стандартно, он получает массив(точнее ссылку на массив) во временную переменную, а уже из этой переменной получается значение массива с индексом 2. При этом не происходит копирование всего массива. Первый вариант кода был здесь. Это усовершенствованный вариант, позволяющий использовать массивы любого типа.

Класс
Visual Basic
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
Option Explicit
 
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpDest As Any, lpSource As Any, ByVal cbCopy As LongPtr)
Private Type tpVariant
    tp As Integer
    r1 As Integer
    r2 As Integer
    r3 As Integer
    Ptr As LongPtr
    r4 As LongPtr
End Type
#If Win64 Then
    Private Const varSz As LongPtr = 24
    Private Const ptrSz As LongPtr = 8
#Else
    Private Const varSz As Long = 16
    Private Const ptrSz As Long = 4
#End If
Private Const VT_Ref = &H4000
Private vArr
 
Public Sub Add(A)
    Dim vt As Integer
    Dim tVar As tpVariant
    If IsArray(A) = False Then Exit Sub
    
    CopyMemory vt, ByVal VarPtr(A), 2
    If vt > VT_Ref Then
        CopyMemory ByVal VarPtr(vArr), ByVal VarPtr(A), varSz
    Else
        tVar.tp = vt Xor VT_Ref
        tVar.Ptr = VarPtr(A) + 8
        CopyMemory ByVal VarPtr(vArr), tVar, varSz
    End If
End Sub
 
Public Property Get Ar(Optional ByVal ind1& = -1, Optional ByVal ind2& = -1)
'    Attribute Item.VB_UserMemId = 0
    If ind2 > -1 Then
        If ind1 > -1 Then Ar = vArr(ind1, ind2)
    ElseIf ind1 > -1 Then
        Ar = vArr(ind1)
    Else
        CopyMemory ByVal VarPtr(Ar), ByVal VarPtr(vArr), varSz
    End If
End Property
 
Public Property Let Ar(Optional ByVal ind1& = -1, Optional ByVal ind2& = -1, inp)
'    Attribute Item.VB_UserMemId = 0
    If ind2 > -1 Then
        vArr(ind1, ind2) = inp
    ElseIf ind1 > -1 Then
        vArr(ind1) = inp
    End If
End Property
 
Public Function GetCopy()
    GetCopy_ GetCopy, vArr
End Function
Private Sub GetCopy_(Dst, Src)
    Dst = Src
End Sub

Пример использования
Visual Basic
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
Sub Example()
    Dim arr@(), arrRef, arrCopy
    Dim coll As New VBA.Collection
    
    ReDim arr(3): arr(0) = 111: arr(1) = 222: arr(2) = 125
   
    coll.Add New ArrayContainer 'добавляем экземпляр класса в коллекцию
    coll(1).Add arr2            'добавляем массив в "контейнер"
    arrRef = coll(1)            'получаем ссылку на массив из контейнера
    Stop
    arrCopy = coll(1).GetCopy   'получить копию на массив из контейнера
    Stop
    Debug.Print coll(1).Ar()(2) 'получаем значение массива способ 1
    Stop
    Debug.Print coll(1)(2)      'способ 2
    Stop
    ReDim Preserve arrRef(7)    'редимим с испльзованием ссылки
    Stop
    ReDim Preserve coll(1).Ar(5) 'редимим массив в контейнере
    Stop
    coll(1).Ar(3) = 123         'изменяем  значения массива в контейнере
    coll(1)(4) = 321
    Debug.Print coll(1)(3); coll(1)(4)   'проверяем измененное значение
    Stop
End Sub
Вложения
Тип файла: zip ArrayContainer.zip (848 байт, 15 просмотров)
0
1379 / 834 / 89
Регистрация: 08.02.2017
Сообщений: 3,478
Записей в блоге: 1
07.09.2024, 04:55
'Функция(Excel UDF) для интерпретации текстового выражения (кода VBA) и вывода результата этого выражения
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
'Testuser 07.09.2024
'обсуждение: https://www.cyberforum.ru/vba/thread3177661.html
Function ExecuteLine(Param, Optional ByVal execFlg As Long)
    Static ret
    If execFlg = True Then
        ret = Param
    Else
        Application.Run "'ExecuteLine " & Param & ", True'"
        ExecuteLine = ret
    End If
End Function
Code
1
2
3
4
Примеры:
=ExecuteLine("Rnd")
=ExecuteLine("Application.Caller.Parent.Parent.FullName")
=ExecuteLine("CStr(CDec(""426632324442343,243242122"")*CDec(""5465421321654,645334323""))")
1
1379 / 834 / 89
Регистрация: 08.02.2017
Сообщений: 3,478
Записей в блоге: 1
09.04.2025, 07:01
Расширение Chrome, отображающее выделенный код VBA/VB6 в отдельном окне с подсветкой. Оно не законченное, только минимальный функционал, могут быть огрехи. Для работы нужно распаковать папку с расширением. Зайти в chrome://extensions/, включить "режим разработчика" нажать "загрузить распакованое расширение" и выбрать папку с расширением.
Вложения
Тип файла: 7z highlight-extension.7z (39.9 Кб, 10 просмотров)
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,679
Записей в блоге: 14
18.04.2025, 21:34
Простой конструктор графов с обходами, генерацией фундаментальных циклов, поиском гамильтоновых и эйлеровых циклов.
Миниатюры
Авторские программы, библиотеки, надстройки и шаблоны  
Вложения
Тип файла: zip !!!Графы.zip (1.28 Мб, 8 просмотров)
1
767 / 284 / 57
Регистрация: 01.06.2023
Сообщений: 801
05.05.2025, 12:59
RTF Report - генератор в Access печатных отчетов в формате RTF, DOCX, XLSX из шаблонов.

Из возможностей:
  • Не нужны специальные компоненты и DLL, все в проекте Access;
  • Минимум кода на стороне Access (кода относящегося к конкретному шаблону). Вся логика в RTF шаблоне;
  • Поддержка нескольких источников данных. Таблицы наполняются вниз, но не вширь, т.е. число столбцов должно быть известно заранее;
  • Поддержка многоуровневых источников данных вида Master-Detail (только в RTF, DOCX);
  • Поддержка условных блоков. По условию можно отключать/включать блоки из документа (только в RTF, DOCX);
  • Поддержка вставки изображений из полей типа File или по пути из ФС;
  • Поддержка вычисляемых выражений в полях документа. Так же в шаблоне можно задать формат вывода для не текстовых типов данных;
  • Есть возможность расширения пользовательскими функциями;
  • Для скорости генерации отчеты можно "скомпилировать" и в таком виде хранить в БД (только в RTF, DOCX). Исходный шаблон при этом будет трудно восстановить. Удобно если нужно передать шаблон на сторону, но ограничить возможность внесения правок в сам шаблон;
  • Поддержка штрих кодов в формате EAN13 и CODE128, без дополнительных шрифтов (вставляются векторными картинками);
  • Поддержка QRCode, при подключении соответствующего модуля;
1
767 / 284 / 57
Регистрация: 01.06.2023
Сообщений: 801
05.05.2025, 13:01
Пример во вложении
Вложения
Тип файла: zip RTFReport (1).zip (929.2 Кб, 12 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.05.2025, 13:01
Помогаю со студенческими работами здесь

Надстройки AddIns. Кто-нибудь работал с этим?
Надстройки AddIns. Кто-нибудь работал с этим? Где можно почитать рускоязычную доку?

Функция из надстройки приводит к ошибке: ошибка: "Sub or Function not defined"
добрый день. я сделал надстройку для Excel с публичной функцией: Public Function...

Вызов надстройки через VBA
Здравствуйте. Очень нужна Ваша помощь. Задача следующая: В VBA для Excel 2003 необходимо...

Всё про надстройки .XLA
Предлагаю в этой теме обсудить все аспекты надстроек .XLA . Частично эти вопросы затрагивались в...

Назначение комбинации клавиш макроса у надстройки
Есть надстройка в ней полезные макросы.....для вызова которых есть комбинации клавиш.... и так...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
260
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru