Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/29: Рейтинг темы: голосов - 29, средняя оценка - 4.79
8 / 8 / 5
Регистрация: 28.10.2012
Сообщений: 135
1

Как сделать запись в динамический двумерный массив

28.10.2012, 23:30. Показов 5274. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
что то не понимаю...на втором шаге Redim (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
Option Base 1
Dim NameArray() As Variant, Iname As String, Add As Boolean
ReDim NameArray(1, 2)
m = 0
                For i = 2 To 10 Step 1
                    Iname = Cells(i, 10).Value
                    Itime = Cells(i, 1).Value
                    If Len(Iname) > 1 Then
                            Add = True
                              For j = 1 To UBound(NameArray)
                                 If NameArray(j, 1) = Iname Then
                                  Add = False
                                End If
                              Next j
                                
                                 If Add Then
                                    m = m + 1
                                    ReDim Preserve NameArray(m, 2)
                                    NameArray(m, 1) = Iname
                                    NameArray(m, 2) = Itime
                                 End If
                    End If
                Next i
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.10.2012, 23:30
Ответы с готовыми решениями:

Как сделать двумерный динамический массив на 4 столбца ?
Что нужно изменить в этом коде чтобы у Mass1 стало 4 столбца? я побывал менять Mass2 = new int64_t;...

Как сделать двумерный динамический массив типа А
В общем вот пример Ну я думаю что все понятно. Что-то вроде new A Но это естественно не...

Как сделать двумерный динамический массив свойством класса
Имеется двумерный динамический массив списков Record. Массив является свойством класса. Не...

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

9
призрак
3263 / 891 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
28.10.2012, 23:36 2
изменить первую размерность в двумерном массиве нельзя.
0
8 / 8 / 5
Регистрация: 28.10.2012
Сообщений: 135
28.10.2012, 23:40  [ТС] 3
Цитата Сообщение от ikki Посмотреть сообщение
изменить первую размерность в двумерном массиве нельзя.
А у меня размерность фиксированная (1 на 2), как тогда увеличивать его размер...redim preserve видимо, только что в скобках?
0
призрак
3263 / 891 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
28.10.2012, 23:41 4
недавно в очередной раз обсуждали.
почитайте здесь: Как использовать ReDim Preserve для двумерного массива
0
6945 / 2849 / 549
Регистрация: 19.10.2012
Сообщений: 8,724
28.10.2012, 23:52 5
Судя по коду, тут можно делать так - сразу объявить массив максимально нужного размера, затем собирать критерии в словарь с номером строки этого массива, куда копируем данные.
Т.е. проверку наличия делаем в словаре, что быстрее, хотя на 10 значений можно в цикле перебирать и массив цикл в цикле.
Если не хочется объявлять массив с запасом - можно собирать данные в две параллельные коллекции без ключей. В конце можно объявить нужный массив и переложить данные.
0
8 / 8 / 5
Регистрация: 28.10.2012
Сообщений: 135
28.10.2012, 23:58  [ТС] 6
Цитата Сообщение от ikki Посмотреть сообщение
недавно в очередной раз обсуждали.
почитайте здесь: Как использовать ReDim Preserve для двумерного массива
Как я понял просто изменять второй параметр..Неужто нельзя просто создавать новую строку в массиве перед добавлением?

Добавлено через 3 минуты
Цитата Сообщение от Hugo121 Посмотреть сообщение
Судя по коду, тут можно делать так - сразу объявить массив максимально нужного размера, затем собирать критерии в словарь с номером строки этого массива, куда копируем данные.
Т.е. проверку наличия делаем в словаре, что быстрее, хотя на 10 значений можно в цикле перебирать и массив цикл в цикле.
Если не хочется объявлять массив с запасом - можно собирать данные в две параллельные коллекции без ключей. В конце можно объявить нужный массив и переложить данные.
Сразу объявить максимальный массив для меня не катит, так как нужно будет обработать неизвестное количество ячеек листа (в итоге сформировать массив различных имен)...с коллекциями не работал, нужно посмотреть.
0
6945 / 2849 / 549
Регистрация: 19.10.2012
Сообщений: 8,724
29.10.2012, 00:06 7
Как это неизвестное? Всегда можно определить количество заполненных ячеек листа.
Конечно, если из миллиона отберёте всего десяток - то объявлять массив на миллион немного расточительно...
Вы покажите задачу целиком - вполне может быть, что она решается в 10 строк кода.
0
призрак
3263 / 891 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
29.10.2012, 00:14 8
как я понял, этого будет достаточно:
Visual Basic
1
2
3
4
5
6
7
8
9
10
Sub t()
  Dim d As Object, i%
  Set d = CreateObject("scripting.dictionary")
  For i = 2 To 10
    If Not d.exists(Cells(i, 10).Value) Then d.Add Cells(i, 10).Value, Cells(i, 1).Value
  Next
  ' чисто для проверки
  [aa2].Resize(d.Count).Value = Application.Transpose(d.keys)
  [ab2].Resize(d.Count).Value = Application.Transpose(d.items)
End Sub
0
8 / 8 / 5
Регистрация: 28.10.2012
Сообщений: 135
29.10.2012, 00:14  [ТС] 9
Задача не вся,а первая ее часть.
Вобщем так - есть таблица сотрудников с временем их входов и выходов.Я хочу по каждому сотруднику посчитать общее время работы. Для этого нужно идти по этой таблице и ( как я хочу решить эту задачу), формировать массив типа (сотрудник и его текущее время). Где текущее время будет всегда вычисляться как разность следущего и предыдущего. Поэтому пришла мысль создать двумерный массив, и зполнить его только разными сотрудниками..а потом по каждому посчитать время..
0
6945 / 2849 / 549
Регистрация: 19.10.2012
Сообщений: 8,724
29.10.2012, 10:23 10
Сотрудников в словарь, каждому в item массив на 2 элемента. В первом храним последнее время, во втором собираем общее время. Чуть есть морока при выгрузке (неоптимально), поэтому проще (но чуть расточительнее, хотя Вам вероятно известно общее количество сотрудников? Можете накинуть ещё 10% запаса) создать массив в 2 столбца и собирать время и время туда, а в словаре хранить номер строки каждого сотрудника.

Добавлено через 8 минут
Вернее массив нужно на 4 столбца - где-то ещё нужно хранить метку вход/выход. Нужно ведь ещё отслеживать и это, а то может получиться, что человек пришёл, потом снова пришёл, потом пару раз подряд вышел... И вся Ваша бухгалтерия рухнет.
Даже не 4, а 5 - в пятом столбце записать, в каком месте обнаружен косяк, чтоб потом вручную с ним разбираться.

Или у Вас таблица, где вход и выход записаны рядом в одной строке, и такие косяки уже убраны до обработки? Нам неведомо...

Добавлено через 9 часов 34 минуты
Хотя если уникальных не десятки тысяч - то можно и Redim Preseve использовать, пусть будет массив в 4-5 строк с изменяемой шириной.
Его ведь потом всегда в конце можно повернуть, если нужно выгружать на лист.
Ну а если выгружать не нужно - то и так можно использовать, какая разница...
А вообще я Redim Preseve избегаю, т.к. бестолковая работа по перекладыванию по многу раз из одного массива в другой как-то подспудно напрягает
Тормознутая это штука при большом количестве циклов и нарастающем размере массива...

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sub test()
    Dim b(), i&, ii&, x&, t!
 
    For x = 1 To 1000
        t = Timer - t
 
        If x Mod 10 = 0 Then Application.StatusBar = ii & " = " & Application.Round(t, 2)
 
        For i = 1 To 1000
            ii = ii + 1
            ReDim Preserve b(ii)
        Next
 
    Next
 
    Application.StatusBar = False
End Sub
0
29.10.2012, 10:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.10.2012, 10:23
Помогаю со студенческими работами здесь

Как создать двумерный динамический массив
Как создать двумерный массив на C# (размерность неизвестна, вычисляется в ходе работы программы) и...

Как реализовать двумерный динамический массив?
Доброго дня суток, форумчане! Подскажите пожалуйста, как реализовать двумерный динамический массив?

Как создать динамический двумерный массив
Здравствуйте. Не знаю как объявить двумерный массив. Пытался так сделать не подходит float **...

Как объявить двумерный динамический массив
int *matrix = new int ; че ругается ? а как сделать если без констант надо ?


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru