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

Вход

Регистрация

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

 

= Мир MS Excel/Определение диапазона в зависимости от значений. - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Определение диапазона в зависимости от значений.
SkyPro Дата: Понедельник, 23.09.2013, 13:30 | Сообщение № 1
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
Добрый день.
Сразу суть вопроса:
Необходимо определить диапазон в зависимости от значения ячеек.
В столбце А, начиная с второй строки введены значения от 1 до 10.
т.е. вот так:


Диапазон определяется минимальным значением и максимальным.
Можно ли определить диапазоны без цикла по ячейкам?
У меня получилось вот так:
[vba]
Код
Sub rangeFND()
Application.ScreenUpdating = False
Dim rRange As Range, rCell As Range
With Sheets(1)
      For Each rCell In .Cells(2, 1).Resize(.UsedRange.Rows.Count, 1)
          If rCell.Value < rCell.Offset(1, 0).Value Then
            
                  If rRange Is Nothing Then
                      Set rRange = rCell
                  End If
                    
              If rCell.Value > rCell.Offset(-1, 0).Value Then
                  Set rRange = Union(rRange, rCell)
              End If
          Else
              If rCell.Value = "" Then Exit Sub
Set rRange = Union(rRange, rCell)
Debug.Print rRange.Address
rRange.Offset(0, 1).Formula = rRange.Address
Set rRange = Nothing
          End If
      Next
End With
Application.ScreenUpdating = True
End Sub
[/vba]

Буду благодарен за любой совет и помощь.
К сообщению приложен файл: ranges.xlsm (17.0 Kb)


skypro1111@gmail.com

Сообщение отредактировал SkyPro - Понедельник, 23.09.2013, 13:31
 
Ответить
СообщениеДобрый день.
Сразу суть вопроса:
Необходимо определить диапазон в зависимости от значения ячеек.
В столбце А, начиная с второй строки введены значения от 1 до 10.
т.е. вот так:


Диапазон определяется минимальным значением и максимальным.
Можно ли определить диапазоны без цикла по ячейкам?
У меня получилось вот так:
[vba]
Код
Sub rangeFND()
Application.ScreenUpdating = False
Dim rRange As Range, rCell As Range
With Sheets(1)
      For Each rCell In .Cells(2, 1).Resize(.UsedRange.Rows.Count, 1)
          If rCell.Value < rCell.Offset(1, 0).Value Then
            
                  If rRange Is Nothing Then
                      Set rRange = rCell
                  End If
                    
              If rCell.Value > rCell.Offset(-1, 0).Value Then
                  Set rRange = Union(rRange, rCell)
              End If
          Else
              If rCell.Value = "" Then Exit Sub
Set rRange = Union(rRange, rCell)
Debug.Print rRange.Address
rRange.Offset(0, 1).Formula = rRange.Address
Set rRange = Nothing
          End If
      Next
End With
Application.ScreenUpdating = True
End Sub
[/vba]

Буду благодарен за любой совет и помощь.

Автор - SkyPro
Дата добавления - 23.09.2013 в 13:30
SkyPro Дата: Понедельник, 23.09.2013, 14:28 | Сообщение № 2
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
Попробовал сделать с коллекцией, но получились те же яйца только в профиль:
[vba]
Код
Sub rangeFND2()
Application.ScreenUpdating = False
Dim rRange As Range, rCell As Range, r&, v$
Dim cl As New Collection
     With Sheets(1)
On Error GoTo err
         For r = 1 To .UsedRange.Rows.Count
         v = .Cells(r, 1).Value
             cl.Add v
         Next
      
         For r = 2 To cl.Count
             If cl.Item(r) < cl.Item(r + 1) Then
                     If rRange Is Nothing Then
                         Set rRange = .Cells(r, 1)
                     End If
              
                 If cl.Item(r) > cl.Item(r - 1) Then
                     Set rRange = Union(rRange, .Cells(r, 1))
                 End If
              Else
err:
                     Set rRange = Union(rRange, .Cells(r, 1))
                     Debug.Print rRange.Address
                     rRange.Offset(0, 1).Formula = rRange.Address
                     Set rRange = Nothing
             End If
         Next
      
     End With
Application.ScreenUpdating = True
End Sub
[/vba]


skypro1111@gmail.com
 
Ответить
СообщениеПопробовал сделать с коллекцией, но получились те же яйца только в профиль:
[vba]
Код
Sub rangeFND2()
Application.ScreenUpdating = False
Dim rRange As Range, rCell As Range, r&, v$
Dim cl As New Collection
     With Sheets(1)
On Error GoTo err
         For r = 1 To .UsedRange.Rows.Count
         v = .Cells(r, 1).Value
             cl.Add v
         Next
      
         For r = 2 To cl.Count
             If cl.Item(r) < cl.Item(r + 1) Then
                     If rRange Is Nothing Then
                         Set rRange = .Cells(r, 1)
                     End If
              
                 If cl.Item(r) > cl.Item(r - 1) Then
                     Set rRange = Union(rRange, .Cells(r, 1))
                 End If
              Else
err:
                     Set rRange = Union(rRange, .Cells(r, 1))
                     Debug.Print rRange.Address
                     rRange.Offset(0, 1).Formula = rRange.Address
                     Set rRange = Nothing
             End If
         Next
      
     End With
Application.ScreenUpdating = True
End Sub
[/vba]

Автор - SkyPro
Дата добавления - 23.09.2013 в 14:28
Матраскин Дата: Понедельник, 23.09.2013, 14:30 | Сообщение № 3
Группа: Друзья
Ранг: Обитатель
Сообщений: 375
Репутация: 81 ±
Замечаний: 0% ±

20xx
хотя бы 1 раз, а придётся пробежать по всем ячейкам.


в интернете опять кто-то не прав

Сообщение отредактировал Матраскин - Понедельник, 23.09.2013, 14:31
 
Ответить
Сообщениехотя бы 1 раз, а придётся пробежать по всем ячейкам.

Автор - Матраскин
Дата добавления - 23.09.2013 в 14:30
KuklP Дата: Понедельник, 23.09.2013, 14:36 | Сообщение № 4
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
Цитата (Матраскин, 23.09.2013 в 14:30, в сообщении № 3)
придётся пробежать по всем ячейкам

Не факт:)
[vba]
Код
Sub www()
     Dim r As Range, a As Range, c As Range
     Set r = Range("b2:b" & Cells(Rows.Count, 1).End(xlUp).Row)
     r.FormulaR1C1 = "=IF(RC[-1]>R[-1]C[-1],"""",1)"
     r = r.Value
     For Each a In r.SpecialCells(4).Areas
         Set c = a.Offset(-1).Resize(a.Count + 1)
         c = c.Offset(, -1).Address
     Next
End Sub
[/vba]


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
Сообщение
Цитата (Матраскин, 23.09.2013 в 14:30, в сообщении № 3)
придётся пробежать по всем ячейкам

Не факт:)
[vba]
Код
Sub www()
     Dim r As Range, a As Range, c As Range
     Set r = Range("b2:b" & Cells(Rows.Count, 1).End(xlUp).Row)
     r.FormulaR1C1 = "=IF(RC[-1]>R[-1]C[-1],"""",1)"
     r = r.Value
     For Each a In r.SpecialCells(4).Areas
         Set c = a.Offset(-1).Resize(a.Count + 1)
         c = c.Offset(, -1).Address
     Next
End Sub
[/vba]

Автор - KuklP
Дата добавления - 23.09.2013 в 14:36
SkyPro Дата: Понедельник, 23.09.2013, 14:42 | Сообщение № 5
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
Прошу прощения, видимо забыл указать в первом посте, что требуется не так "решить все без цикла", как найти вариант, который будет работать быстрее. При большем кол-ве строк.
На данный момент код KuklP работает (чисто визуально) медленне чем мои =\.
Мб какой-нибудь вариант с массивами? Я просто в них не особо разбираюсь.


skypro1111@gmail.com
 
Ответить
СообщениеПрошу прощения, видимо забыл указать в первом посте, что требуется не так "решить все без цикла", как найти вариант, который будет работать быстрее. При большем кол-ве строк.
На данный момент код KuklP работает (чисто визуально) медленне чем мои =\.
Мб какой-нибудь вариант с массивами? Я просто в них не особо разбираюсь.

Автор - SkyPro
Дата добавления - 23.09.2013 в 14:42
Hugo Дата: Понедельник, 23.09.2013, 15:12 | Сообщение № 6
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3703
Репутация: 792 ±
Замечаний: 0% ±

365
А с коллекцией немного другие яйца, в самом низу :)
В общем, все яйца немного разные...
Я голосую за Серёгины :)

Но не вполне понял что нужно получить - что, вот именно так писать рядом в ячейки адреса?


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеА с коллекцией немного другие яйца, в самом низу :)
В общем, все яйца немного разные...
Я голосую за Серёгины :)

Но не вполне понял что нужно получить - что, вот именно так писать рядом в ячейки адреса?

Автор - Hugo
Дата добавления - 23.09.2013 в 15:12
KuklP Дата: Понедельник, 23.09.2013, 15:21 | Сообщение № 7
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
Мой предыдущий код будет работать тем быстрей, чем длинней будут последовательности чисел. На массивах:
[vba]
Код
Sub www()
     Dim a, i&, s$
     a = Range("a1:a" & Cells(Rows.Count, 1).End(xlUp).Row).Value
     For i = 2 To UBound(a)
         If a(i, 1) > Val(a(i - 1, 1)) Then
             s = IIf(s = "", Cells(i, 1).Address, s)
         Else
             s = s & ":" & Cells(i - 1, 1).Address
             a(i - 1, 1) = s: s = Cells(i, 1).Address
         End If
     Next
     s = s & ":" & Cells(i - 1, 1).Address
     a(i - 1, 1) = s
     For i = UBound(a) To 2 Step -1
         If IsNumeric(a(i, 1)) Then a(i, 1) = a(i + 1, 1)
     Next
     [b1].Resize(UBound(a)) = a
End Sub
[/vba]


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
СообщениеМой предыдущий код будет работать тем быстрей, чем длинней будут последовательности чисел. На массивах:
[vba]
Код
Sub www()
     Dim a, i&, s$
     a = Range("a1:a" & Cells(Rows.Count, 1).End(xlUp).Row).Value
     For i = 2 To UBound(a)
         If a(i, 1) > Val(a(i - 1, 1)) Then
             s = IIf(s = "", Cells(i, 1).Address, s)
         Else
             s = s & ":" & Cells(i - 1, 1).Address
             a(i - 1, 1) = s: s = Cells(i, 1).Address
         End If
     Next
     s = s & ":" & Cells(i - 1, 1).Address
     a(i - 1, 1) = s
     For i = UBound(a) To 2 Step -1
         If IsNumeric(a(i, 1)) Then a(i, 1) = a(i + 1, 1)
     Next
     [b1].Resize(UBound(a)) = a
End Sub
[/vba]

Автор - KuklP
Дата добавления - 23.09.2013 в 15:21
SkyPro Дата: Понедельник, 23.09.2013, 15:25 | Сообщение № 8
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
вот именно так писать рядом в ячейки адреса?

Нет :)
Это я для наглядности добавил (вот такой своеобразный отладчик).
Достаточно просто определить диапазон, произвести действия в этом диапазоне и перейти к следующему.
Вот только первый вариант работает медленно, второй так же (чисто визуально, никогда не добавлял счетчик времени в макросы).
Вот и вопрос в том, что бы с наименьшими затратами ресурсов и времени определять диапазоны.
Сейчас пытась разобраться с массивами. Но успеха пока нет.


skypro1111@gmail.com
 
Ответить
Сообщение
вот именно так писать рядом в ячейки адреса?

Нет :)
Это я для наглядности добавил (вот такой своеобразный отладчик).
Достаточно просто определить диапазон, произвести действия в этом диапазоне и перейти к следующему.
Вот только первый вариант работает медленно, второй так же (чисто визуально, никогда не добавлял счетчик времени в макросы).
Вот и вопрос в том, что бы с наименьшими затратами ресурсов и времени определять диапазоны.
Сейчас пытась разобраться с массивами. Но успеха пока нет.

Автор - SkyPro
Дата добавления - 23.09.2013 в 15:25
SkyPro Дата: Понедельник, 23.09.2013, 15:26 | Сообщение № 9
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
KuklP, это шикарно :)


skypro1111@gmail.com
 
Ответить
СообщениеKuklP, это шикарно :)

Автор - SkyPro
Дата добавления - 23.09.2013 в 15:26
SkyPro Дата: Понедельник, 23.09.2013, 17:04 | Сообщение № 10
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
Вобщем попробовал я загнать сначала в массив весь столбец (по примеру Сергея), а потом уже разбираться с ним, но реального прироста в производительности не увидел =\
Видимо у меня руки не оттуда ростут :)
Попробовал заливать диапазоны цветом, так макросы по пол минуты на 1,5 к строк работают.
К сообщению приложен файл: 5193880.xlsm (29.9 Kb)


skypro1111@gmail.com

Сообщение отредактировал SkyPro - Понедельник, 23.09.2013, 17:06
 
Ответить
СообщениеВобщем попробовал я загнать сначала в массив весь столбец (по примеру Сергея), а потом уже разбираться с ним, но реального прироста в производительности не увидел =\
Видимо у меня руки не оттуда ростут :)
Попробовал заливать диапазоны цветом, так макросы по пол минуты на 1,5 к строк работают.

Автор - SkyPro
Дата добавления - 23.09.2013 в 17:04
KuklP Дата: Понедельник, 23.09.2013, 17:42 | Сообщение № 11
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
Я ж не знаю для чего это все. А так сравнительный тест на 20000 строк.
К сообщению приложен файл: 7235559.gif (8.9 Kb) · ranges.rar (76.1 Kb)


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
СообщениеЯ ж не знаю для чего это все. А так сравнительный тест на 20000 строк.

Автор - KuklP
Дата добавления - 23.09.2013 в 17:42
SkyPro Дата: Понедельник, 23.09.2013, 18:02 | Сообщение № 12
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
KuklP, насколько я понимаю, то вот єта строка:[vba]
Код
[b1].Resize(UBound(a)) = a
[/vba] Выводит все полученные диапазоны в колонку B.
А как таким же быстрым образом обработать полученные диапазоны? Допустим, покрасить их в какой-нибудь цвет (для каждого разный).
Пробовал вот так:[vba]
Код
F = 10000
     For i = UBound(a) To 2 Step -1
         If IsNumeric(a(i, 1)) Then a(i, 1) = a(i + 1, 1)
         Range(a(i, 1)).Interior.Color = F
         F = F + 100
     Next
[/vba]
Но макрос просто нереально долго начинает работать.


skypro1111@gmail.com
 
Ответить
СообщениеKuklP, насколько я понимаю, то вот єта строка:[vba]
Код
[b1].Resize(UBound(a)) = a
[/vba] Выводит все полученные диапазоны в колонку B.
А как таким же быстрым образом обработать полученные диапазоны? Допустим, покрасить их в какой-нибудь цвет (для каждого разный).
Пробовал вот так:[vba]
Код
F = 10000
     For i = UBound(a) To 2 Step -1
         If IsNumeric(a(i, 1)) Then a(i, 1) = a(i + 1, 1)
         Range(a(i, 1)).Interior.Color = F
         F = F + 100
     Next
[/vba]
Но макрос просто нереально долго начинает работать.

Автор - SkyPro
Дата добавления - 23.09.2013 в 18:02
KuklP Дата: Понедельник, 23.09.2013, 18:05 | Сообщение № 13
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
Дык, форматирование ячеек - долгая операция. Тут ничего не поделать. Только что на Планете писал - с данными надо работать, а не с фантиками и будет счастье B)


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
СообщениеДык, форматирование ячеек - долгая операция. Тут ничего не поделать. Только что на Планете писал - с данными надо работать, а не с фантиками и будет счастье B)

Автор - KuklP
Дата добавления - 23.09.2013 в 18:05
SkyPro Дата: Понедельник, 23.09.2013, 18:08 | Сообщение № 14
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
с данными надо работать, а не с фантиками

:)
Все же иногда и фантики нужны.

По сабжу:
Спасибо за помощь. Кой-чему научился :)


skypro1111@gmail.com
 
Ответить
Сообщение
с данными надо работать, а не с фантиками

:)
Все же иногда и фантики нужны.

По сабжу:
Спасибо за помощь. Кой-чему научился :)

Автор - SkyPro
Дата добавления - 23.09.2013 в 18:08
  • Страница 1 из 1
  • 1
Поиск:

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