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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.09.2012, 08:54   #1
MaxxVer
Форумчанин
 
Регистрация: 17.03.2009
Сообщений: 226
По умолчанию Организация корректного цикла

Добрый день, уважаемые!

Есть макрос который находит в столбце 1 текущего листа искомые значения из листа "СУ" столбец 2 и делит конкретные ячейки строки (где найдены значения) на соответсвующие значения из листа "СУ" столбец 3.
Загвоздка в том, что макрос находит значение (i) делит и переходит к следующему i, а мне надо чтобы он провел операцию по всем i в столбце, только потом перешел к следующему.
Помогите сделать правильный цикл. Бьюсь долго с этим.

Код:
Sub delenie_na_kurs()
Dim Rng As Range, i As Integer, c, str As String
Dim Arr()
Arr = Array(4, 5, 6, 7, 20, 21, 26, 27, 28, 30, 32, 35, 36, 38, 39, 40, _
  42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, _
  60, 61, 62, 63, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, _
  79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, _
  97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 108, 109, 110, 112, 113, _
  114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, _
  129, 130, 131, 132, 133, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, _
  145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, _
  160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, _
  175, 176, 178, 179, 180, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, _
  192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203)
With Sheets("СУ")
For i = 2 To 8
  Set Rng = Columns(1).Find(what:=.Cells(i, 2), LookIn:=xlValues, lookAt:=xlWhole)
  If Not Rng Is Nothing Then
    str = Rng.Row
    For c = 0 To UBound(Arr)
      Cells(str, Arr(c)) = Cells(str, Arr(c)) / .Cells(i, 3)
    Next
  End If
Next
End With
End Sub


___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 27.09.2012 в 09:16.
MaxxVer вне форума Ответить с цитированием
Старый 27.09.2012, 09:45   #2
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Составлять таблицу, чтобы понять проблему, почему-то не хочется
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 27.09.2012, 10:03   #3
MaxxVer
Форумчанин
 
Регистрация: 17.03.2009
Сообщений: 226
По умолчанию

Добавил пример) Т.е. макрос пробегается по первой найденной строке с фамилией и перескакивает на следующую фамилию, хотя надо бы чтобы по вем строкам с искомой фамилией.
Вложения
Тип файла: rar Книга3.rar (19.3 Кб, 17 просмотров)
MaxxVer вне форума Ответить с цитированием
Старый 27.09.2012, 15:52   #4
MaxxVer
Форумчанин
 
Регистрация: 17.03.2009
Сообщений: 226
По умолчанию

Может быть я не совсем понятно описал просьбу... Если это так - скажите, пожалуйста, постараюсь более точно описать.
MaxxVer вне форума Ответить с цитированием
Старый 27.09.2012, 16:24   #5
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

В Вашем коде нужно использовать FindNext.
Но вообще есть мысль код переделать наоборот - будет проще.
Это если данные как в примере, без большого количества "левых" записей. Общее количество не важно - просто если много записей, которые не нужно обрабатывать, то будет низкий КПД.
Я думаю использовать словарь и обычный цикл.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 27.09.2012, 16:35   #6
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Код:
Sub tt()
    Dim cc, el1, el2, arr, i&, t As Double
    Application.ScreenUpdating = False
    
    arr = Array("d:g", "t:u", "z:ab", "ad:ad", "af:af", "ai:aj", "al:an", "ap:bk", "bm:db", "dd:df", "dh:ec", "ee:ft", "fv:fx", "fz:gu")

    With CreateObject("scripting.dictionary")

        For i = 2 To 8: .Item(Sheets("СУ").Cells(i, 2).Value) = Sheets("СУ").Cells(i, 3).Value: Next

        For Each cc In ActiveSheet.UsedRange.Columns(1).Cells
            If .exists(cc.Value) Then
                t = .Item(cc.Value)
                For Each el1 In arr
                    For Each el2 In Intersect(Rows(cc.Row), Range(el1)).Cells
                        el2.Value = el2.Value / t
                    Next
                Next
            End If
        Next
        
    End With
    Application.ScreenUpdating = True
End Sub
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 27.09.2012, 18:16   #7
MaxxVer
Форумчанин
 
Регистрация: 17.03.2009
Сообщений: 226
По умолчанию

Спасибо! Я подозревал что здесь лучше делать на словаре, но использовать его в коде пока не научился. Буду осваивать на вашем примере.
MaxxVer вне форума Ответить с цитированием
Старый 27.09.2012, 18:36   #8
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Ну здесь от словаря выгоды в скорости мало - т.к. данных-критериев не много.
Но зато код получается проще, нет ещё одного цикла в цикле.
Т.е. сперва в цикле заполнили словарь, затем просто с ним сверяемся, и если значение exists, то сразу из словаря берём нужный делитель. И на второй лист лазить не нужно
А все циклы в цикле - это чтоб обработать все ячейки:
1 цикл по столбцу имён
2 цикл по диапазонам из arr
3 цикл уже по ячейкам этих диапазонов
Тут можно было один цикл убрать - если массив arr сделать как у Вас

Ну а если налаживать Ваш вариант на Find/FindNext - то там ещё один цикл добавится, по найденным. Но имхо всё вместе будет выглядеть сложнее.
Но если нужных имён 10% от общего количества - то думаю на Find/FindNext будет быстрее.
Смотрите сами, что больше нравится - но мне FindNext писать неохота...
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 27.09.2012, 18:48   #9
MaxxVer
Форумчанин
 
Регистрация: 17.03.2009
Сообщений: 226
По умолчанию

Спасибо огромное за пояснения! Очень признателен что тратите своё время на меня, да еще и безвозмездно :-)
MaxxVer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Организация цикла лесяя Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 10.06.2011 00:00
Организация цикла If ... else 4e4en JavaScript, Ajax 5 07.11.2010 21:30
Организация цикла While Ra88 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 29.09.2010 09:11
Организация цикла mephist Microsoft Office Excel 2 17.07.2009 16:27
Организация корректного поиска в связанных таблицах посредством SQL в Delphi Krechet БД в Delphi 9 10.04.2009 16:40