Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2009, 12:16   #1
Maxx
Форумчанин
 
Аватар для Maxx
 
Регистрация: 29.10.2008
Сообщений: 294
Вопрос Работа с массивами

Всем Доброго дня!

Есть на листе непрерывный набор данных типа Long в диапазоне A1:C300.

Можно ли эти данные поместить в 2-ух мерный массив статический (Dim My_Array(299, 2) As Long)?
Maxx вне форума Ответить с цитированием
Старый 23.11.2009, 12:20   #2
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Можно:
Код:
MyArray = [A1:C300].Value
Необходимо учесть, что при этом размерности массива начинаются с единицы.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 23.11.2009, 12:32   #3
Maxx
Форумчанин
 
Аватар для Maxx
 
Регистрация: 29.10.2008
Сообщений: 294
По умолчанию

ОГО, так просто! Спасибо!
Maxx вне форума Ответить с цитированием
Старый 23.11.2009, 12:53   #4
Maxx
Форумчанин
 
Аватар для Maxx
 
Регистрация: 29.10.2008
Сообщений: 294
По умолчанию

SAS888, а если вместо А1 и С300 будут переменные с адресами ячеек, то так будет правильно?

Код:
Dim MyArray(1, 300) As Long
MyArray = (a, b).Value
Maxx вне форума Ответить с цитированием
Старый 23.11.2009, 13:02   #5
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Нет. Вместо "A1" и "C300" можно использовать ссылки на ячейки. например:
Код:
MyArray = Range(Cells(i, j), Cells(x, y)).Value
или так:
Код:
Set x = Range(Cells(i, j), Cells(x, y))
MyArray = x.Value
ЗАМЕЧАНИЯ:
1. Диапазон ячеек должен быть непрерывный (иначе - ошибка).
2. Диапазон ячеек должен содержать не менее 2-х ячеек (иначе - ошибка).
2. Не смотря на то, что, свойство Value в VBA Excel используется по умолчанию, в данном случае его необходимо явно указывать явно (см. пример).
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 23.11.2009, 13:18   #6
Maxx
Форумчанин
 
Аватар для Maxx
 
Регистрация: 29.10.2008
Сообщений: 294
По умолчанию

Понял, спасибо!
Буду творить дальше
Maxx вне форума Ответить с цитированием
Старый 23.11.2009, 14:11   #7
Maxx
Форумчанин
 
Аватар для Maxx
 
Регистрация: 29.10.2008
Сообщений: 294
По умолчанию

SAS888, я вот тут сочинил следующее, пусть немного объёмно, но это для того, чтобы самому понять, как это будет работать:

Код:
Sub Массив()

a = Range("A1").Address
arow = Range("A1").Row
acol = Range("A1").Column

b = Cells(Cells(Rows.Count, "F").End(xlUp).Row, "F").Address
brow = Cells(Cells(Rows.Count, "F").End(xlUp).Row, "F").Row
bcol = Cells(Cells(Rows.Count, "F").End(xlUp).Row, "F").Column

ro = brow - arow + 1
col = bcol - acol + 1

Set x = Range(a, b)
MyArray = x.Value

Dim SummArray(1 To 300) As Long

For i = 1 To ro

summ = 0

For j = 1 To col
summ = summ + MyArray(i, j)
Next j

SummArray(i) = summ

Next i

Set y = Range(Cells(arow, 8), Cells(brow, 8))
y.Value = SummArray(i)

End Sub
В итоге выдает ошибку "Script out of range"
В чем проблема?

И как записать:
Код:
Dim SummArray(1 To 300) As Long
через переменные,
т.е.:
Код:
Dim SummArray(1 To ro) As Long
Вложения
Тип файла: rar Массив.rar (29.9 Кб, 13 просмотров)

Последний раз редактировалось Maxx; 23.11.2009 в 14:15.
Maxx вне форума Ответить с цитированием
Старый 23.11.2009, 14:28   #8
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Необходимо определить динамический массив, а затем, когда станет известна требуемая размерность, определить ее, используя ReDim.
Для примера, посмотрите, как можно решить Вашу задачу из поста №7:
Код:
Sub Массив_2()
    Dim i As Long, j As Long, s As Double, arr(), SummArray()
    arr = Range([A1], Cells(Rows.Count, "F").End(xlUp)).Value
    ReDim SummArray(1 To UBound(arr, 1))
    For i = 1 To UBound(arr, 1)
        For j = 1 To UBound(arr, 2): s = s + arr(i, j): Next
        SummArray(i) = s: s = 0
    Next
    Range([H1], Cells(UBound(SummArray), 8)).Value = Application.Transpose(SummArray)
End Sub
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 23.11.2009, 14:32   #9
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

После цикла i равно не 300 а на единицу больше


Замените SummArray(i) на SummArray(i - 1)

Set y = Range(Cells(arow, 8), Cells(brow, 8))
y.Value = SummArray(i - 1)
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 23.11.2009, 14:39   #10
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

1. Замена
Код:
Set y = Range(Cells(arow, 8), Cells(brow, 8))
y.Value = SummArray(i)
на
Код:
Set y = Range(Cells(arow, 8), Cells(brow, 8))
y.Value = SummArray(i - 1)
избавит от ошибки в коде. А полученный массив SummArray все равно из строки потребуется транспонировать в столбец.
2. Пример того, как задать размерность результирующего массива см. выше.
3. Могу еще предложить код без внутреннего цикла:
Код:
Sub Массив_3()
    Dim i As Long, j As Long, arr(), SummArray()
    arr = Range([A1], Cells(Rows.Count, "F").End(xlUp)).Value
    ReDim SummArray(1 To UBound(arr, 1))
    For i = 1 To UBound(arr, 1)
        SummArray(i) = Application.Sum(Application.Index(arr, i, 0))
    Next
    Range([H1], Cells(UBound(SummArray), 8)).Value = Application.Transpose(SummArray)
End Sub
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 23.11.2009 в 14:44.
SAS888 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с массивами mchip Microsoft Office Excel 8 22.04.2009 11:46
Работа с массивами MasterofCDM Общие вопросы Delphi 4 27.11.2008 23:45
Работа с массивами в C# MaskEdit Общие вопросы .NET 3 17.05.2008 17:59
Работа с массивами rexec Microsoft Office Excel 12 21.04.2008 13:29
Работа с массивами DeN1308 Помощь студентам 3 09.11.2007 11:50