powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Массивы в VBA
19 сообщений из 69, страница 3 из 3
Массивы в VBA
    #36533338
AlexFr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vlth,
ВО, спасибо, а то я уж больше часа как раз там да около возюкаюсь...
Что-то проясняется... :))
...
Рейтинг: 0 / 0
Массивы в VBA
    #36533398
Фотография vlth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexFr, вот так удаление модуля, вроде, нормально срабатывает:
Код: plaintext
1.
2.
3.
4.
Sub test()
CreateArray "CrArr", "7,5,9,3,6"
Application.OnTime Now + TimeValue("00:00:01"), "TMP"
Application.OnTime Now + TimeValue("00:00:02"), "test2"
End Sub
...
Рейтинг: 0 / 0
Массивы в VBA
    #36533414
AlexFr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vlth,

Да-да, спасибо, я ужо структуру ваяю, чтоб она более ликвидно и доступно выглядела...
Можно даже лог сделать - просто супер, или "базу" наиболее часто используемых операций, дабы не запускать каждый раз процедуру по полной. Пару дней над структурой попарюсь (творческий процесс :) ), а потом все выложу. Вдруг кому интересен такой набор инструментов окажется...
...
Рейтинг: 0 / 0
Массивы в VBA
    #36534497
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Dim i As Integer, j As Integer, k As Integer
Dim MyCollection As New Collection

For i =  1  To  5 
  For j =  1  To  10 
    For k =  1  To  18 
      MyCollection.Add Rnd( 0 ), CStr(i) + "," + CStr(j) + "," + CStr(k)
    Next
  Next
Next

MsgBox MyCollection("3,4,8")
Интересный пример, думаю мне это пригодиться.
Но у меня возник вопрос. Смотрю в VBA в окне локальных переменных данную коллекцию.
Там я лишь вижу элементы вида Item X=Y, где X номер элемента в коллекции, а Y значение данного элемента.
Вопрос, как узнать название коллекции для конкретного элемента ItemX.
Т.е. смотря на некий элемент, например в данном примере Item 1, как узнать, что его имя "1,1,1".
Возможно с терминологией я попутал, т.к. свои коллекции я ранее не создавал.
...
Рейтинг: 0 / 0
Массивы в VBA
    #36534546
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никак.

Если это действительно требуется, тогда задача немного усложняется.
Как вы уже наверное поняли, элементом коллекции может быть не только просто переменная, но и экземпляр класса.
Таким образом, нужно создать собственный класс "с блэкджеком и шлюхами" и заодно со свойством "Name" и заполнять коллекцию экземплярами этого класса. То есть "1,1,1" вы зададите два раза, как свойство "Name" экземпляра класса, так и как ключ коллекции.

Класс в простейшем случае может содержать только две строки
Код: plaintext
1.
Public Value As Variant
Public Name As String
...
Рейтинг: 0 / 0
Массивы в VBA
    #36534568
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProНикак.Жаль конечно, что напрямую VBA это не показывает.
...
Рейтинг: 0 / 0
Массивы в VBA
    #36534705
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Djon PlayerЖаль конечно, что напрямую VBA это не показывает.

Если сделаете через класс - будет показывать.
...
Рейтинг: 0 / 0
Массивы в VBA
    #36534879
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поискал, нашёл пару вариантов решения этой проблемы:
/topic/257224
...
Рейтинг: 0 / 0
Массивы в VBA
    #36987211
Daniskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дана последовательность чисел ak(k=1,2,....n).Выбрать числа кратные 5 и подсчитать их число и найти их сумму.
...
Рейтинг: 0 / 0
Массивы в VBA
    #36987255
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DaniskinДана последовательность чисел ak(k=1,2,....n).Выбрать числа кратные 5 и подсчитать их число и найти их сумму.очень интересно.
...
Рейтинг: 0 / 0
Массивы в VBA
    #37055422
Van-Gog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
помогите решить Записать элементы массива X=(x1,x2,…, xn) в обратном порядке в массив Y=(y1,y2,…, yn). Вычислить сумму элементов массива Y с нечетными индексами
...
Рейтинг: 0 / 0
Массивы в VBA
    #37055446
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Van-Gogпомогите решитьпомочь? или прогу за вас написать?
...
Рейтинг: 0 / 0
Массивы в VBA
    #37055513
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Van-GogЗаписать элементы массива X=(x1,x2,…, xn) в обратном порядке в массив Y=(y1,y2,…, yn).
Впрочем, я сегодня добрый, вот решение первой части. Думаю, что вторая часть не вызовет затруднений.
Код: 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.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
Private Sub Command1_Click()

Dim x() As Integer, y() As Integer
Dim s As String, n As Integer, i As Integer
Dim Ex As Object, ExWB As Object, ExWS As Object

'инициализация
On Error Resume Next
Do
  Do
    s = InputBox("Введите размер массива")
    If s = "" Then Exit Sub
    n = CInt(s)
    If Err =  0  Then Exit Do
    MsgBox "Введенное выражение должно быть целым числом"
    Err.Clear
  Loop
  If n >  0  Then Exit Do
  MsgBox "Размер должен быть больше нуля"
Loop
On Error GoTo  0 
ReDim x( 1  To n)
ReDim y( 1  To n)

'заполнение начального массива случайными числами
For i =  1  To n
  x(i) = Fix(Rnd( 1 ) *  1000 )
  Debug.Print CStr(i), CStr(x(i))
Next

'собственно, решение задачи
On Error GoTo ExErr
Set Ex = CreateObject("Excel.Application")
Set ExWB = Ex.WorkBooks.Add
Set ExWS = ExWB.WorkSheets( 1 )
For i =  1  To n
  ExWS.Cells(i,  1 ) = i
  ExWS.Cells(i,  2 ) = x(i)
Next
ExWS.Range(ExWS.Cells( 1 ,  1 ), ExWS.Cells(n,  2 )).Sort Key1:=ExWS.Cells( 1 ,  1 ), Order1:= 2 , Header:= 2 

For i =  1  To n
  y(i) = ExWS.Cells(i,  2 )
  Debug.Print CStr(i), CStr(y(i))
Next
ExWB.Close False
Set Ex = Nothing

Exit Sub


ExErr:
MsgBox "Ошибка: "+Err.Description, vbCritical, "Не судьба"
Set Ex = Nothing

End Sub
...
Рейтинг: 0 / 0
Массивы в VBA
    #37057822
Van-Gog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне б попроше , но всеравно спасибо
...
Рейтинг: 0 / 0
Массивы в VBA
    #37058028
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Van-GogМне б попроше , но всеравно спасибо
я могу только еще посложнее...
попроще каждый дурак может - чего там всего один цикл с тремя строчками на каждое задание...
...
Рейтинг: 0 / 0
Массивы в VBA
    #37058594
.Михаил.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую. Без комментариев.
Далее функция по созданию массива
Код: 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.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
Function CreateArray(ByRef arrObj As Object, _
                ByVal arrName As String, _
                Optional ByVal Nrazmer As String = vbNullString) As Boolean
Dim arrn, i As Long, regs As Object, Response
Set regs = NewDict
'-------------------------------------------------------------------------------
'проверка существования массива
If arrObj.Exists(arrName) Then
    Response = MsgBox("Массив '" & arrName & "' уже существует. Заменить?", vbYesNo, "Вопрос")
    If Response = vbYes Then
        arrObj.Remove arrName
    Else
        MsgBox "Массив '" & arrName & "' не создан.": Exit Function
    End If
End If
'-------------------------------------------------------------------------------
'создание массива
arrObj.Add arrName, NewDict
arrObj(arrName).Add "Name", arrName
arrObj(arrName).Add "Razmer", NewDict
arrObj(arrName).Add "Values", NewDict
arrObj(arrName)("Razmer").Add "flag", True
arrObj(arrName)("Razmer").Add "N", Nothing
Nrazmer = Replace(Nrazmer, " ", vbNullString)
arrObj(arrName)("Razmer")("flag") = (Nrazmer <> vbNullString) 'False - нет ограничений по n-размерности массива
If arrObj(arrName)("Razmer")("flag") Then
    Set arrObj(arrName)("Razmer")("N") = NewDict
    arrn = Split(Nrazmer, ",")
    For i =  0  To UBound(arrn,  1 )
        CreateArray = False
        arrObj(arrName)("Razmer")("N").Add i, NewDict
        If preg_match(NewReg, "^(\d+)$", CStr(arrn(i)), regs) Then ' размерность типа - количество элеметнов X (от 0 до X-1)
            arrObj(arrName)("Razmer")("N")(i).Add "flag", True 'True - есть ограничения по количеству элементов массива
            arrObj(arrName)("Razmer")("N")(i).Add "from", CLng( 0 )
            arrObj(arrName)("Razmer")("N")(i).Add "to", CLng(regs( 1 )) -  1 
            CreateArray = True
        End If
        If preg_match(NewReg, "^(\d+)to(\d+)$", CStr(arrn(i)), regs) Then ' размерность типа - от Х до Y
            arrObj(arrName)("Razmer")("N")(i).Add "flag", True 'True - есть ограничения по количеству элементов массива
            If CLng(regs( 0 )) <= CLng(regs( 1 )) Then
                arrObj(arrName)("Razmer")("N")(i).Add "from", CLng(regs( 1 ))
                arrObj(arrName)("Razmer")("N")(i).Add "to", CLng(regs( 2 ))
                CreateArray = True
            Else
                CreateArray = False
            End If
        End If
        If CStr(arrn(i)) = vbNullString Then ' массив безразмерен
            arrObj(arrName)("Razmer")("N")(i).Add "flag", False  'False - нет ограничений по количеству элементов массива
            CreateArray = True
        End If
        If Not CreateArray Then
            MsgBox "Неправильно задана размерность '" & CStr(arrn(i)) & "', массив '" & arrName & "' не создан."
            arrObj.Remove arrName
            Exit Function
        End If
    Next
End If
End Function
Далее свойство для записи элементов массива
Код: 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.
Property Let ValueArray(ByRef arrObj As Object, _
                ByVal arrName As String, _
                ByVal Nrazmer As String, _
                ByVal arrValue)
If Not arrObj.Exists(arrName) Then
    MsgBox "Массив '" & arrName & "' не существует."
    Exit Property
End If
Dim flag As Boolean
Nrazmer = Replace(Nrazmer, " ", vbNullString)
If arrObj(arrName)("Razmer")("flag") Then
    Dim arrn, N As Long, i As Long
    arrn = Split(Nrazmer, ",")
    N = CLng(UBound(arrn,  1 ) +  1 ) 'размерность, указанная при вводе
    If CLng(arrObj(arrName)("Razmer")("N").Count) = N Then ' сверка размерностей
        For i =  0  To UBound(arrn,  1 )
            If arrObj(arrName)("Razmer")("N")(i)("flag") Then
                N = CLng(arrn(i))
                flag = (arrObj(arrName)("Razmer")("N")(i)("from") <= N And N <= arrObj(arrName)("Razmer")("N")(i)("to"))
                If Not flag Then MsgBox MsgBox "Массив '" & arrName & "': при записи неправильно указан индекс массива."
            Else
                flag = True
            End If
        Next
    Else
        MsgBox "Массив '" & arrName & "': при записи неправильно указана размерность массива"
        flag = False
    End If
Else
    flag = True
End If
'-----------------------------------------------------------
If flag Then
    If arrObj(arrName)("Values").Exists(Nrazmer) Then
        arrObj(arrName)("Values")(Nrazmer) = arrValue
    Else
        arrObj(arrName)("Values").Add Nrazmer, arrValue
    End If
End If
End Property
Свойство для "чтения" полностью приводить не буду, похоже на свойства для "записи", за исключением последнего:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
'-----------------------------------------------------------
If flag Then
    If arrObj(arrName)("Values").Exists(Nrazmer) Then
        ValueArray = arrObj(arrName)("Values")(Nrazmer)
    Else
        MsgBox "Значение отсутствует"
        ValueArray = Empty
    End If
End If
Некоторые вспомогательные функции, исползуемые выше
Код: plaintext
1.
2.
3.
Function NewDict() As Object
Set NewDict = CreateObject("Scripting.Dictionary")
End Function
Код: plaintext
1.
2.
3.
4.
5.
6.
Function NewReg() As Object
Set NewReg = CreateObject("VBScript.RegExp")
NewReg.Global = True
NewReg.IgnoreCase = True
NewReg.MultiLine = True
End Function
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Public Function preg_match(ByRef reg As Object, ByVal match As String, ByVal str As String, Optional ByRef regs As Object = Nothing) As Boolean
Dim i As Integer
reg.Pattern = match
If reg.Test(str) Then
    preg_match = True
    If Not regs Is Nothing Then
        regs.RemoveAll
        With reg.Execute(str).Item( 0 ).Submatches
            For i =  0  To .Count -  1 
                regs.Add i +  1 , Trim(.Item(i))
            Next
        End With
    End If
Else
    preg_match = False
End If
End Function
Пример использования
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Set arrGlobal = NewDict

CreateArray arrGlobal, "arrTest0"
CreateArray arrGlobal, "arrTest1", "10"
CreateArray arrGlobal, "arrTest2", "10, 20"
CreateArray arrGlobal, "arrTest3", "0 To 10"
CreateArray arrGlobal, "arrTest4", "10, 1 To 10"
CreateArray arrGlobal, "arrTest5", "1 To 10, 10 To 100"
CreateArray arrGlobal, "arrTest6", "5, 1 To 10, 10 To 100, 1000"

ValueArray(arrGlobal, "arrTest0", "0") =  1 
ValueArray(arrGlobal, "arrTest0", "0, 1") =  3 
ValueArray(arrGlobal, "arrTest1", "1") =  2 
ValueArray(arrGlobal, "arrTest2", "1, 2") =  3 
ValueArray(arrGlobal, "arrTest3", "3") =  4 
ValueArray(arrGlobal, "arrTest4", "5, 6") =  4 
ValueArray(arrGlobal, "arrTest6", "3, 5, 20, 300") =  4 

MsgBox ValueArray(arrGlobal, "arrTest6", "3, 5, 20, 300")
...
Рейтинг: 0 / 0
Массивы в VBA
    #37058680
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для чего эта жуть написана? Ничего, что такие "массивы" будут работать в разы медленнее обычных?
...
Рейтинг: 0 / 0
Массивы в VBA
    #37058714
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут как раз с полгодика назад поднимался вопрос о работе с массивами произвольной размерности....
...
Рейтинг: 0 / 0
Массивы в VBA
    #37058833
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже я не видел этот вопрос. Не представляю себе практическую задачу, где требовался бы такой массив.
...
Рейтинг: 0 / 0
19 сообщений из 69, страница 3 из 3
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Массивы в VBA
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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