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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2009, 14:04   #1
Maka111
 
Регистрация: 03.05.2009
Сообщений: 6
По умолчанию хранение данных в Excel

Уважаемые, подскажите начинающему.
Стоит такая задача: в Excel поступают внешние данные (раз в секунду примерно), происходит определенный обсчет, для чего используется матрица коэффициентов, которые сохраняются в таблице.
т.е. в начале процедуры загружаем коэффициенты в переменные из ячеек, считаем, а потом обратно сохраняем обновленные коэффициенты.
В коде у меня это выглядит вот так:
Код:
   ' загрузка данных
   Range("al2").Select
   For a4 = 1 To Nrn1
       W01(1, a4) = ActiveCell.Offset(a4, 0).Value
   Next a4

   ' тут происходит обсчет

   ' выгрузка данных
   Range("al2").Select
   For a4 = 1 To Nrn1
      ActiveCell.Offset(a4, 0).Value = W01(1, a4)
   Next a4
проблемма в том, что при большом количесве коэффициентов, процедура выгрузки занимает слишком много времени.
и нет ли в VBA возможности жестко связать ячейку и переменную, что бы любое изменение переменной сразу автоматически отражалось в таблице?
интуитивно чувствую, что есть более простое решение, но знаний пока не хватает.
заранее спасибо

Последний раз редактировалось Maka111; 03.05.2009 в 14:17. Причина: исправлен код
Maka111 вне форума Ответить с цитированием
Старый 03.05.2009, 14:14   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Что-то я не понял вот этой записи:
Код:
Range("al2").Select
    For a4 = 1 To Nrn1
        W01(1, a4) = ActiveCell.Offset(a3, 0).Value
    Next a4
Зачем в цикле множество раз считывать значение одной и той же ячейки?

Попробуйте так - будет намного быстрее:
Код:
cv = Range("al2").Offset(a3, 0).Value ' кэшируем значение ячейки
    For a4 = 1 To Nrn1
        W01(1, a4) = cv
    Next a4
Или Вам требуется что-то вроде этого:
Код:
Sub test() ' работает очень быстро
    ПерваяЯчейка = "a12": КолвоСтрок = 20000: КолвоСтолбцов = 25

    arr = Range(ПерваяЯчейка).Resize(КолвоСтрок, КолвоСтолбцов).Value
    ' получаем двумерный массив 20000 * 25

    ' обрабатываем массив

    ' записываем массив обратно на лист:
    Range(ПерваяЯчейка).Resize(КолвоСтрок, КолвоСтолбцов).Value = arr
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 03.05.2009, 14:25   #3
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

вот это меняет местами первые 5 ячеек первой и второй строк.
Код:
Sub Chng()
  Dim ar(2)
  ar(1) = Range("A1:E1")
  ar(2) = Range("A2:E2")
  Range("A1:E1") = ar(2)
  Range("A2:E2") = ar(1)
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 03.05.2009, 14:41   #4
Maka111
 
Регистрация: 03.05.2009
Сообщений: 6
По умолчанию

to EducatedFool:
неточность с а4 и а3 исправил

конструкция: W01 = Range("al3").Resize(Nrn0, Nrn1).Value
выдает: can't assign to array
а вот это: Range("al3").Resize(Nrn0, Nrn1).Value = W01
работает


to IgorGO:
честно говоря не совсем понял как это использовать
Maka111 вне форума Ответить с цитированием
Старый 03.05.2009, 14:59   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
can't assign to array
Это потому что размерность вашего массива не совпадает с размерами диапазона ячеек.
Лучше сразу задать массив W01 с нужными размерностями, чтобы не переносить данные из одного массива в другой:
Код:
Sub test2()
    Nrn1 = 20000 ' для примера
    ReDim W01(1 To Nrn1, 1 To 1) ' назначаем размерность массива
    W01 = Range("al2").Resize(Nrn1).Value ' загрузка данных

    ' тут происходит обсчет

    Range("al2").Resize(Nrn1).Value = W01 ' выгрузка данных
End Sub
Ну или попробуйте так:
Код:
Sub test2()
    ' загрузка данных
    Nrn1 = 20000
    ReDim W01(1 To 1, 1 To Nrn1)
    arr = Range("al2").Resize(Nrn1).Value
    For a4 = 1 To Nrn1
        W01(1, a4) = arr(a4, 1)
    Next a4

    ' тут происходит обсчет

    ' выгрузка данных
    ReDim arr2(1 To Nrn1, 1 To 1)
    For a4 = 1 To Nrn1
        arr2(a4, 1) = W01(1, a4)
    Next a4
    Range("al2").Resize(Nrn1).Value = arr2
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 04.05.2009, 09:50   #6
Maka111
 
Регистрация: 03.05.2009
Сообщений: 6
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Это потому что размерность вашего массива не совпадает с размерами диапазона ячеек.
Лучше сразу задать массив W01 с нужными размерностями, чтобы не переносить данные из одного массива в другой:
у меня массив объявляется вот так: W01(Nrn0, Nrn1)
Nrn0 и Nrn1 - константы
как может быть несоответствие размерности вот тут:
W01 = Range("am3").Resize(Nrn0, Nrn1).Value
Maka111 вне форума Ответить с цитированием
Старый 04.05.2009, 10:10   #7
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Либо Nrn1 больше 216, и диапазон Range("am3").Resize(Nrn0, Nrn1) выходит за пределы листа, либо неправильно задан массив.

Попробуйте указать нижнюю границу массива (по умолчанию она равна нулю).
Вот так будет работать:
Код:
Sub test()
    Const Nrn0 = 100, Nrn1 = 200    '- константы
    ReDim W01(1 To Nrn0, 1 To Nrn1) ' объявляем динамический массив
    
'    Debug.Print LBound(W01, 1), UBound(W01, 1)
'    Debug.Print LBound(W01, 2), UBound(W01, 2)
'    Debug.Print Range("am3").Resize(Nrn0, Nrn1).Rows.Count
'    Debug.Print Range("am3").Resize(Nrn0, Nrn1).Columns.Count

    W01 = Range("am3").Resize(Nrn0, Nrn1).Value
End Sub
EducatedFool вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
хранение данных в файле (dc++) AsabeasT Общие вопросы Delphi 2 27.03.2009 11:57
Хранение дисков Levsha100 Свободное общение 24 04.02.2009 15:58
Хранение TColor в Access $teelR@t БД в Delphi 2 20.09.2007 13:56
Хранение и шифрование данных Paul Hindenburg БД в Delphi 1 20.08.2007 09:04