Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Цикл по двум условиям - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Цикл по двум условиям (Макросы/Sub)
Цикл по двум условиям
thrasher Дата: Суббота, 13.02.2016, 00:10 | Сообщение № 1
Группа: Пользователи
Ранг: Участник
Сообщений: 63
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Доброго времени суток.
Возник вопрос, пытаюсь сделать программу для заполнения вкладки ap данными с вкладки sv.
То есть, если совпадает код точки (столбец С) и находится строка "Кол-во фэйсов Всего", данные по этой строке с вкладки sv из 15 столбца идут в 13 столбец вкладки ap.
Но программа не работает. Если убрать одно из условий
[vba]
Код
And sv.Cells(j, 10) = "Кол-во фэйсов Всего"
[/vba]
Находится только одно значение. Не понимаю, что делаю не так. Видимо сказывается отсутствие опыта.
Буду признателен за пинок в правильном направлении)
К сообщению приложен файл: example.xlsm (38.6 Kb)
 
Ответить
СообщениеДоброго времени суток.
Возник вопрос, пытаюсь сделать программу для заполнения вкладки ap данными с вкладки sv.
То есть, если совпадает код точки (столбец С) и находится строка "Кол-во фэйсов Всего", данные по этой строке с вкладки sv из 15 столбца идут в 13 столбец вкладки ap.
Но программа не работает. Если убрать одно из условий
[vba]
Код
And sv.Cells(j, 10) = "Кол-во фэйсов Всего"
[/vba]
Находится только одно значение. Не понимаю, что делаю не так. Видимо сказывается отсутствие опыта.
Буду признателен за пинок в правильном направлении)

Автор - thrasher
Дата добавления - 13.02.2016 в 00:10
Wasilich Дата: Суббота, 13.02.2016, 01:04 | Сообщение № 2
Группа: Друзья
Ранг: Старожил
Сообщений: 1232
Репутация: 326 ±
Замечаний: 0% ±

2003
Проверяем!
[vba]
Код
Sub find_values()
  Dim i&, j&, r_ap&, r_sv&
  r_ap = Sheets("ap").Cells(Rows.Count, 3).End(xlUp).Row
  r_sv = Sheets("sv").Cells(Rows.Count, 3).End(xlUp).Row
  For i = 4 To r_ap
    For j = 2 To r_sv
       If sv.Cells(j, 3).Value = ap.Cells(i, 3).Value And sv.Cells(j, 10) = "Кол-во фэйсов Всего" Then
        ap.Cells(i, 13).Value = sv.Cells(j, 15).Value
       End If
    Next j
  Next i
End Sub
[/vba]
 
Ответить
СообщениеПроверяем!
[vba]
Код
Sub find_values()
  Dim i&, j&, r_ap&, r_sv&
  r_ap = Sheets("ap").Cells(Rows.Count, 3).End(xlUp).Row
  r_sv = Sheets("sv").Cells(Rows.Count, 3).End(xlUp).Row
  For i = 4 To r_ap
    For j = 2 To r_sv
       If sv.Cells(j, 3).Value = ap.Cells(i, 3).Value And sv.Cells(j, 10) = "Кол-во фэйсов Всего" Then
        ap.Cells(i, 13).Value = sv.Cells(j, 15).Value
       End If
    Next j
  Next i
End Sub
[/vba]

Автор - Wasilich
Дата добавления - 13.02.2016 в 01:04
thrasher Дата: Суббота, 13.02.2016, 11:29 | Сообщение № 3
Группа: Пользователи
Ранг: Участник
Сообщений: 63
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Wasilic, большое спасибо за ответ, все работает как надо. Сам про вложенный цикл не додумался бы. У меня еще вопрос, зачем рядом с переменными стоит знак амперсанда, что это означает?
 
Ответить
СообщениеWasilic, большое спасибо за ответ, все работает как надо. Сам про вложенный цикл не додумался бы. У меня еще вопрос, зачем рядом с переменными стоит знак амперсанда, что это означает?

Автор - thrasher
Дата добавления - 13.02.2016 в 11:29
buchlotnik Дата: Суббота, 13.02.2016, 11:37 | Сообщение № 4
Группа: Заблокированные
Ранг: Участник клуба
Сообщений: 3442
Репутация: 929 ±
Замечаний: 20% ±

2010, 2013, 2016 RUS / ENG
это означает тип данных long
 
Ответить
Сообщениеэто означает тип данных long

Автор - buchlotnik
Дата добавления - 13.02.2016 в 11:37
Udik Дата: Суббота, 13.02.2016, 11:39 | Сообщение № 5
Группа: Друзья
Ранг: Старожил
Сообщений: 1588
Репутация: 192 ±
Замечаний: 0% ±

Excel 2016 х 64
зачем рядом с переменными стоит знак амперсанда

Это следы древности :) Так типы раньше определяли, в конце ставили %, &, $ и т.д. Амперсанд = Long


вот вам барабан
яд 41001231307558 wm R419131876897
udik1968@gmail.com
 
Ответить
Сообщение
зачем рядом с переменными стоит знак амперсанда

Это следы древности :) Так типы раньше определяли, в конце ставили %, &, $ и т.д. Амперсанд = Long

Автор - Udik
Дата добавления - 13.02.2016 в 11:39
buchlotnik Дата: Суббота, 13.02.2016, 11:41 | Сообщение № 6
Группа: Заблокированные
Ранг: Участник клуба
Сообщений: 3442
Репутация: 929 ±
Замечаний: 20% ±

2010, 2013, 2016 RUS / ENG
[offtop] Udik, чего ж сразу древности - так реально быстрее и лаконичнее B)
 
Ответить
Сообщение[offtop] Udik, чего ж сразу древности - так реально быстрее и лаконичнее B)

Автор - buchlotnik
Дата добавления - 13.02.2016 в 11:41
thrasher Дата: Суббота, 13.02.2016, 17:29 | Сообщение № 7
Группа: Пользователи
Ранг: Участник
Сообщений: 63
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Всем спасибо за ответы :)
 
Ответить
СообщениеВсем спасибо за ответы :)

Автор - thrasher
Дата добавления - 13.02.2016 в 17:29
thrasher Дата: Суббота, 13.02.2016, 20:06 | Сообщение № 8
Группа: Пользователи
Ранг: Участник
Сообщений: 63
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Мда, добавил еще 5 условий типа "Кол-во фэйсов Всего", прогнал на большом файле: ap-450,sv-15000 строк - время просчета 7 минут ;) ожидал бОльшей скорости, скринапдейт отключен.
 
Ответить
СообщениеМда, добавил еще 5 условий типа "Кол-во фэйсов Всего", прогнал на большом файле: ap-450,sv-15000 строк - время просчета 7 минут ;) ожидал бОльшей скорости, скринапдейт отключен.

Автор - thrasher
Дата добавления - 13.02.2016 в 20:06
nilem Дата: Суббота, 13.02.2016, 20:59 | Сообщение № 9
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
thrasher, привет
попробуйте так:


Яндекс.Деньги 4100159601573
 
Ответить
Сообщениеthrasher, привет
попробуйте так:

Автор - nilem
Дата добавления - 13.02.2016 в 20:59
Wasilich Дата: Воскресенье, 14.02.2016, 09:20 | Сообщение № 10
Группа: Друзья
Ранг: Старожил
Сообщений: 1232
Репутация: 326 ±
Замечаний: 0% ±

2003
ap-450,sv-15000 строк
Ну об этом же не было сказано раньше.
Было сказано только что:
Буду признателен за пинок в правильном направлении)
Что я и сделал. :)
 
Ответить
Сообщение
ap-450,sv-15000 строк
Ну об этом же не было сказано раньше.
Было сказано только что:
Буду признателен за пинок в правильном направлении)
Что я и сделал. :)

Автор - Wasilich
Дата добавления - 14.02.2016 в 09:20
Wasilich Дата: Воскресенье, 14.02.2016, 10:27 | Сообщение № 11
Группа: Друзья
Ранг: Старожил
Сообщений: 1232
Репутация: 326 ±
Замечаний: 0% ±

2003
рядом с переменными стоит знак амперсанда, что это означает?
Почитайте ЗДЕСЬ Статья 2011 года (древняя).
Это следы древности Так типы раньше определяли
Так я и сам древний. Начинал на "Лотус 123". :)


Сообщение отредактировал Wasilic - Воскресенье, 14.02.2016, 10:51
 
Ответить
Сообщение
рядом с переменными стоит знак амперсанда, что это означает?
Почитайте ЗДЕСЬ Статья 2011 года (древняя).
Это следы древности Так типы раньше определяли
Так я и сам древний. Начинал на "Лотус 123". :)

Автор - Wasilich
Дата добавления - 14.02.2016 в 10:27
thrasher Дата: Воскресенье, 14.02.2016, 14:11 | Сообщение № 12
Группа: Пользователи
Ранг: Участник
Сообщений: 63
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Wasilic, спасибо за пинок) мой коммент был простой констатацией факта. К Вашему коду, это не имеет никакого отношения)
nilem, спасибо, проверил - время выполнения 2 секунды hands единственная проблема, что я очень плохо понимаю этот код. Очень не хватает комментариев)
 
Ответить
СообщениеWasilic, спасибо за пинок) мой коммент был простой констатацией факта. К Вашему коду, это не имеет никакого отношения)
nilem, спасибо, проверил - время выполнения 2 секунды hands единственная проблема, что я очень плохо понимаю этот код. Очень не хватает комментариев)

Автор - thrasher
Дата добавления - 14.02.2016 в 14:11
thrasher Дата: Вторник, 08.03.2016, 13:13 | Сообщение № 13
Группа: Пользователи
Ранг: Участник
Сообщений: 63
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Всем доброго времени суток.
Разбираюсь с кодом Nilem, к сожалению вторая часть макроса тяжела для моего понимания, в силу отсутствия должного опыта. У меня возник вопрос, возможно ли упростить вторую часть кода? Сейчас поиск идет по маске fc (I3:P3), а если будет массив с этими данными или коллекция? Хотелось бы в итоге воспроизвести код с той же производительностью, но с более прозрачной для нубов логикой.

[vba]
Код
Sub ertert()
Dim x, y(), j&, k&, r As Range, adr$, fc
Dim col As New Collection

'1
x = ap.Range("C4", ap.Cells(Rows.Count, 3).End(xlUp)).Value 'находим последнюю строку в 3м столбце на вкладке AP
ReDim y(1 To UBound(x), 1 To 8) 'Переназначаем переменную y - массив (от 1 до последней строки , fc (1 до 8))
fc = ap.Range("I3:P3").Value 'данные из шапки по которым идет поиск

On Error Resume Next: Err.Clear ' пропускаем и очищаем ошибки
For j = 1 To UBound(x) 'цикл добавления в коллекцию значений из 3 столбца вкладки AP
    col.Add Item:=j, Key:=CStr(x(j, 1))
Next j

'2
With sv.Columns(10)
    For j = 1 To UBound(fc, 2)
        If Len(fc(1, j)) Then
            Set r = .Find(fc(1, j), LookIn:=xlValues, lookat:=xlWhole)
            If Not r Is Nothing Then
                adr = r.Address
                Do
                    If Not IsEmpty(col.Item(CStr(r(1, -6).Value))) Then
                        k = col.Item(CStr(r(1, -6).Value))
                        y(k, j) = r(1, 6).Value
                    End If
                    Set r = .FindNext(r)
                Loop While r.Address <> adr
            End If
        End If
    Next j
End With

ap.Range("I4:P4").Resize(UBound(y)).Value = y()
End Sub

[/vba]
 
Ответить
СообщениеВсем доброго времени суток.
Разбираюсь с кодом Nilem, к сожалению вторая часть макроса тяжела для моего понимания, в силу отсутствия должного опыта. У меня возник вопрос, возможно ли упростить вторую часть кода? Сейчас поиск идет по маске fc (I3:P3), а если будет массив с этими данными или коллекция? Хотелось бы в итоге воспроизвести код с той же производительностью, но с более прозрачной для нубов логикой.

[vba]
Код
Sub ertert()
Dim x, y(), j&, k&, r As Range, adr$, fc
Dim col As New Collection

'1
x = ap.Range("C4", ap.Cells(Rows.Count, 3).End(xlUp)).Value 'находим последнюю строку в 3м столбце на вкладке AP
ReDim y(1 To UBound(x), 1 To 8) 'Переназначаем переменную y - массив (от 1 до последней строки , fc (1 до 8))
fc = ap.Range("I3:P3").Value 'данные из шапки по которым идет поиск

On Error Resume Next: Err.Clear ' пропускаем и очищаем ошибки
For j = 1 To UBound(x) 'цикл добавления в коллекцию значений из 3 столбца вкладки AP
    col.Add Item:=j, Key:=CStr(x(j, 1))
Next j

'2
With sv.Columns(10)
    For j = 1 To UBound(fc, 2)
        If Len(fc(1, j)) Then
            Set r = .Find(fc(1, j), LookIn:=xlValues, lookat:=xlWhole)
            If Not r Is Nothing Then
                adr = r.Address
                Do
                    If Not IsEmpty(col.Item(CStr(r(1, -6).Value))) Then
                        k = col.Item(CStr(r(1, -6).Value))
                        y(k, j) = r(1, 6).Value
                    End If
                    Set r = .FindNext(r)
                Loop While r.Address <> adr
            End If
        End If
    Next j
End With

ap.Range("I4:P4").Resize(UBound(y)).Value = y()
End Sub

[/vba]

Автор - thrasher
Дата добавления - 08.03.2016 в 13:13
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Цикл по двум условиям (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!