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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 22.09.2008, 17:26   #1
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию Как выполнить умножение массива?

Есть макрос:
Код:
Sub Macro_zxc()
    Dim iPrices#(1 To 38, 1 To 1), iRow&, iLL As Long
    With Application
         .EnableEvents = False
         For iLL = 1 To 13
iPrices(1, 1) = 2.21
------------------
iPrices(38, 1) = 2.2 
             For iRow = 3 To 1533 Step 51
             With Sheets(iLL).Cells
             .Cells(iRow, 5).Resize(38).Value = iPrices
--------------------------
-------------------------
End Sub
Как выполнить умножение в строке:
.Cells(iRow, 9).Resize(38).Value = iPrices * 1.15

Через формулу, все ОК!
.Cells(iRow, 9).Resize(38).Value = "=RC[-4]*1.15"
valerij вне форума
Старый 22.09.2008, 17:48   #2
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Цитата:
Dim iPrices#(1 To 38, 1 To 1), iRow&, iLL As Long
Цитата:
.Cells(iRow, 9).Resize(38).Value = iPrices * 1.15
iPrices - это массив. нельзя массив умножать на число. можно умножить какой-то элемент массива на число, например:
Код:
.Cells(iRow, 9).Resize(38).Value = iPrices(1, 1) * 1.15
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума
Старый 22.09.2008, 17:56   #3
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
Код:
.Cells(iRow, 9).Resize(38).Value = iPrices(1, 1) * 1.15
Игорь!
Понял, а цикл в массиве содать мона?
.Cells(iRow, 9).Resize(38).Value = iPrices(X, 1) * 1.15

Где Х от 1 до 38
valerij вне форума
Старый 22.09.2008, 18:56   #4
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Цикл создается не в массиве.
Внутри цикла ты можешь перебрать элементы массива.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума
Старый 23.09.2008, 10:40   #5
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
Цикл создается не в массиве.
Внутри цикла ты можешь перебрать элементы массива.
Игорь, оказалось не все так просто, я не осилил.
От Уважаемого pashulka:
Самый простой способ заключается в вводе формулы и последующей замене формул на результат их вычислений, или же использовании Evaluate, т.е.

Код:
                iPrices(1, 1) = 2.21
----------------------------------------
                iPrices(38, 1) = 2.2
Например так :
 
With Sh.Cells(iRow, 5).Resize(38)
     .Value = iPrices
     .Offset(, 4).Value = Sh.Evaluate(.Address & "*1.15")
End With
 
тоже самое, но с применением переменной
 
Dim iPrices#(1 To 38, 1 To 1), iRow&, iAddress$
 
...
...
...
 
With Sh.Cells(iRow, 5).Resize(38)
     .Value = iPrices: iAddress = .Address
     .Offset(, 4).Value = Sh.Evaluate(iAddress & "*1.15")
End With
Что такое Evaluate, ни где не нашел в хелпе по анг., не понимаю, а перевод, ерунда.
valerij вне форума
Старый 23.09.2008, 11:58   #6
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Уважаемый Валерий,

1. Зачем так обьявлять:
Цитата:
Dim iPrices#(1 To 38, 1 To 1)
, если везде используется так: iPrices#(i, 1). Достаточно будет Dim iPrices#(38).

2. А цикл, видимо будет выглядеть так:
for x = 1 to 38
iRow = ... 'тут высчитываем в какой ряд записать iPrices(x)
Cells(iRow, 9).Resize(38).Value = iPrices(x) * 1.15
next x

понятно, что всем iPrices предварительно (перед этим циклом) уже присвоены значения.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума
Старый 23.09.2008, 12:51   #7
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
1. Зачем так обьявлять: , если везде используется так: iPrices#(i, 1). Достаточно будет Dim iPrices#(38)..
Игорь, тут я не знаю, ибо да массивов я еще не дошел, а пример от pashulka

Цитата:
2. А цикл, видимо будет выглядеть так:
for x = 1 to 38
iRow = ... 'тут высчитываем в какой ряд записать iPrices(x)
Cells(iRow, 9).Resize(38).Value = iPrices(x) * 1.15
next x
понятно, что всем iPrices предварительно (перед этим циклом) уже присвоены значения.
Я так пробовал, не работает, возьмем первое значение iPrices=2,21* 1.15 ,
получим 2,54 и это число протянется во все 38 ячеек, столбца 9, а так не должно быть

Что бы понятней было, вот модуль прикрепил
Вложения
Тип файла: rar Module4.rar (1.1 Кб, 9 просмотров)

Последний раз редактировалось valerij; 23.09.2008 в 13:01.
valerij вне форума
Старый 23.09.2008, 13:32   #8
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Попробуй так:
Код:
Sub Macro_ЦенаХЗ()
   Dim iPrices#(38), iRow&, iLL As Long
'*************************** ХлебоЗаводские Ц Е Н Ы *******************************************
   iPrices(1) = 2.21    '1 Хл. Буроз. Под.
   iPrices(2) = 1.61    '2 Хл. Бородино
   iPrices(3) = 1.67    '3 Хл. Бородино
   iPrices(4) = 1.98    '4 Хл. Азов. Фор.
   iPrices(5) = 1.88    '5 Хл. Украинский
   iPrices(6) = 1.98    '6 Хл. Украинский
   iPrices(7) = 2.27    '7 Хл. Ржан-Отруб.
   iPrices(8) = 2.37    '8 Хл. Ржан-Отруб.
   iPrices(9) = 2.01    '9 Хл. Приаз. Под.
   iPrices(10) = 2.11   '10 Хл. Приаз. Под.
   iPrices(11) = 2.43   '11 Хл. Донбасский
   iPrices(12) = 2.53   '12 Хл. Донбасский
   iPrices(13) = 1.84   '13 Хлеб Деликатес
   iPrices(14) = 2.47   '14 Хл. К О Л О С
   iPrices(15) = 2.42   '15 Хл. Горчичный
   iPrices(16) = 2.29   '16 Хл. Буроз.П-Овал
   iPrices(17) = 2.07   '17 Хл. Буроз.Овал УП
   iPrices(18) = 2.21   '18 Хл. Север. в УП
   iPrices(19) = 1.75   '19 Батон Для Бутер
   iPrices(20) = 2.17   '20 Б А Т О Н   Крест
   iPrices(21) = 2.25   '21 Батон  Резаный
   iPrices(22) = 0.34   '22 Б У Л К А  Днепр.
   iPrices(23) = 0.59   '23 Булка до Кавы
   iPrices(24) = 0.56   '24 Булка до Кавы
   iPrices(25) = 1.1    '25 Рог. Горчичный
   iPrices(26) = 1.15   '26 Рог. Горчичный
   iPrices(27) = 1.01   '27 Рог. Здоровье
   iPrices(28) = 0.95   '28 Рог. Здоровье
   iPrices(29) = 0.71   '29 Булка Сдобная
   iPrices(30) = 0.68   '30 Булка Сдобная
   iPrices(31) = 1.16   '31 С Д О Б А азовская
   iPrices(32) = 2.22   '32 В И Т У Ш К А
   iPrices(33) = 2.32   '33 К Е К С
   iPrices(34) = 1.96   '34 РОЖОК
   iPrices(35) = 1.22   '35 Булочка с Маком
   iPrices(36) = 1.03   '36 Булка Город.
   iPrices(37) = 1.09   '37 Булка Черкаская
   iPrices(38) = 2.2    '38 Багет Новинка
   With Application
      .ReferenceStyle = xlA1 ' Удаление стиля ссылок R1С1
'      .ScreenUpdating = False
      .EnableEvents = False
      For iLL = 1 To 13
        i = 0 'Добавил строку
        For iRow = 3 To 1533 Step 51
          i = i + 1 'Добавил строку
          With Sheets(iLL).Cells(iRow, 5).Resize(38)
            .Value = iPrices(i) 'Добавил (i)
            .Offset(, 4).Value = Evaluate(.Address & "*1.15")
            .Offset(, 5).Value = "=(RC[-3]-RC[-5])*100/RC[-5]"
'            .Cells(iRow, 5).Resize(38).Locked = True 'Защита столбцов 5, 6, 8, 10, 11
'            .Cells(iRow, 6).Resize(38).Locked = True
'            .Cells(iRow, 8).Resize(38).Locked = True
'            .Cells(iRow, 9).Resize(38).Locked = True
'            .Cells(iRow, 10).Resize(38).Locked = True
          End With
        Next
'       Erase iPrices
      Next
      .EnableEvents = True
'      .ScreenUpdating = True
   End With
End Sub
есть тут одна нестыковочка: в iPrices присвоено 38 значенний элементам массива, а в цикле For iRow = 3 To 1533 Step 51 обрабатывается только первые 30 из них. 8 остались за пределами этого цикла. Так задумано или это ошибка?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума
Старый 23.09.2008, 13:53   #9
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
есть тут одна нестыковочка: в iPrices присвоено 38 значенний элементам массива, а в цикле For iRow = 3 To 1533 Step 51 обрабатывается только первые 30 из них. 8 остались за пределами этого цикла. Так задумано или это ошибка?
Игорь, не правильно работает, запусти мой модуль, только перекачай его или For iLL = 1 To 13(13 исправь на 3)

Да нет тут ошибки, все 38 обрабатываются.
valerij вне форума
Старый 23.09.2008, 14:38   #10
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Интересно, это как же все обработаются?
For iRow = 3 To 1533 Step 51
первый проход
iRow = 3 + 51*(1-1) = 3
2-й iRow = 3 + 51*(2 - 1) = 54
3-й iRow = 3 + 51*(3 - 1) = 105
...
31-й iRow = 3+51*(31-1) = 1533

32 прохода по циклу не будет. следующий iRow=1584 больше 1533 - это выход из цикла. Как могут обрабатываться строки за 1533 - не знаю.

извини... я выхожу из этого обсуждения.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как выполнить условие по именам valerij Microsoft Office Excel 3 14.09.2008 21:55
неободимо выполнить php мит PHP 1 01.09.2008 22:36
Как выполнить код Java из Delphi? ap008 Общие вопросы Delphi 2 22.05.2008 09:51
переписать из массива в линейный двунаправленный список чётные элементы массива Black_Ak24 Помощь студентам 12 08.01.2008 00:44