Форум программистов, компьютерный форум, киберфорум
Jack Famous
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Сцепить элементы каждой "строки "двумерного массива с выравниванием "друг по другом"

Запись от Jack Famous размещена 25.01.2023 в 19:19
Показов 1885 Комментарии 2
Метки aligment, fast, report, string, vba

Приветствую!
Функция нужна для отчётов: Debug.Print, MsgBox или печать лога в текстовый файл, но "чтоб как таблица было".
Скрин
Название: Снимок.PNG
Просмотров: 3030

Размер: 2.3 Кб
Код
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
Option Base 1
Option Explicit
Option Private Module
'==================================================================================================
Function PRDX_Arr2D_To1D_AlignmentStrings(a2D, Optional ByVal nSpaces& = 1) As String()
Dim aStr$(), aLen&(), aSps$()
Dim tx$, r&, c&, l&
 
ReDim aStr(UBound(a2D, 1))
ReDim aLen(UBound(a2D, 2))
 
For r = 1 To UBound(a2D, 1)
    For c = 1 To UBound(a2D, 2)
        a2D(r, c) = Trim$(a2D(r, c))
        l = Len(a2D(r, c))
        If l > aLen(c) Then aLen(c) = l
    Next c
Next r
 
ReDim aSps(UBound(aLen))
 
For c = 1 To UBound(aLen)
    aSps(c) = Space$(aLen(c) + nSpaces)
Next c
 
For r = 1 To UBound(a2D, 1)
    For c = 1 To UBound(a2D, 2)
        tx = aSps(c)
        Mid$(tx, 1, Len(a2D(r, c))) = a2D(r, c)
        aStr(r) = aStr(r) & tx
    Next c
 
    aStr(r) = Trim$(aStr(r))
Next r
 
PRDX_Arr2D_To1D_AlignmentStrings = aStr
End Function
'--------------------------------------------------------------------------------------------------
Private Sub Test_PRDX_Arr2D_To1D_AlignmentStrings()
Dim x
 
ReDim x(3, 3)
x(1, 1) = "My dream":   x(1, 2) = "is":     x(1, 3) = "to fly"
x(2, 1) = "Over":       x(2, 2) = "the":    x(2, 3) = "rainbow"
x(3, 1) = "So":         x(3, 2) = "":       x(3, 3) = "high"
 
Debug.Print Join(PRDX_Arr2D_To1D_AlignmentStrings(x, 3), vbLf)
End Sub


UPD 26/01/2023:
Описание обновления
• Ускорил в 4 раза.
• Теперь можно использовать в качестве разделителя элементов любой символ или даже строку. До общей длины по столбцу элементы по прежнему "добиваются" пробелами. Можно и это сделать переменной, но практического смысла пока не вижу.
• Теперь функция возвращает длину [каждой] строки сцепки, а строковый массив для заполнения, нужно передать.
Скрин
Название: Снимок2.PNG
Просмотров: 1873

Размер: 2.5 Кб
Код
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
Option Base 1
Option Explicit
Option Private Module
'==================================================================================================
Function PRDX_Arr2D_To1D_AlignmentStrings(a2D, a1D_Res$(), Optional ByVal sepJoin$ = " ") As Long
Dim aLen&(), tx$, txSp$, r&, c&, l&, lSep&
 
ReDim a1D_Res(UBound(a2D, 1))
ReDim aLen(UBound(a2D, 2))
 
For c = 1 To UBound(a2D, 2)
    For r = 1 To UBound(a2D, 1)
        l = Len(a2D(r, c))
        If l > aLen(c) Then aLen(c) = l
    Next r
Next c
 
l = 0
For c = 1 To UBound(aLen)
    l = l + aLen(c)
Next c
 
lSep = Len(sepJoin)
l = l + lSep * (UBound(aLen) - 1)
PRDX_Arr2D_To1D_AlignmentStrings = l
txSp = Space$(l): l = 0
 
For r = 1 To UBound(a2D, 1)
    tx = txSp
 
    For c = 1 To UBound(a2D, 2) - 1
        Mid$(tx, l + 1, aLen(c)) = a2D(r, c):   l = l + aLen(c)
        Mid$(tx, l + 1, lSep) = sepJoin:        l = l + lSep
    Next c
 
    Mid$(tx, l + 1, aLen(c)) = a2D(r, c)
    a1D_Res(r) = tx: l = 0
Next r
End Function
'--------------------------------------------------------------------------------------------------
Private Sub TestSpeed_PRDX_Arr2D_To1D_AlignmentStrings()
Dim bef$(), aft$()
Dim t!, n&, l&
Const nCyc& = 1000000
 
ReDim bef(3, 3)
bef(1, 1) = "My dream": bef(1, 2) = "is":   bef(1, 3) = "to fly"
bef(2, 1) = "Over":     bef(2, 2) = "the":  bef(2, 3) = "rainbow"
bef(3, 1) = "So":       bef(3, 2) = "":     bef(3, 3) = "high"
 
t = Timer
    For n = 1 To nCyc
        l = PRDX_Arr2D_To1D_AlignmentStrings(bef, aft, " — ")  ' 3.23
    Next n
Debug.Print Format$(Timer - t, "0.00"), l
Debug.Print Join(aft, vbLf)
End Sub
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 2
Комментарии
  1. Старый комментарий
    Привет!
    Visual Basic
    1
    
    Function PRDX_Arr2D_To1D_AlignmentStrings(a2D, a1D_Res$(), Optional ByVal sepJoin$ = " ") As Long
    Почему a2D как Variant?
    Попробовал a2D$() в объявлении и почти в два раза быстрее получилось.
    Запись от SergioJek размещена 28.01.2023 в 16:35 SergioJek вне форума
  2. Старый комментарий
    Цитата Сообщение от SergioJek
    Почему a2D как Variant?
    Попробовал a2D$() в объявлении и почти в два раза быстрее получилось.
    Приветствую и спасибо за конструктив!
    Variant, чтобы можно было сразу массив из диапазона листа передать, например ( PRDX_Arr2D_To1D_AlignmentStrings(Range() .Value … ). То есть, для универсальности.
    Вы правы - скорость 1,71 при строковом массиве. У себя заменю (диапазон с листа всегда можно обернуть в функцию приведения к строковому), а тут пусть пользователи выбирают, кому, что нужно
    Запись от Jack Famous размещена 31.01.2023 в 19:52 Jack Famous вне форума
 
Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru