Сравнение двух числовых диапазонов и добавление.Что не так?

Программирование на Visual Basic for Applications
sonata
Постоялец
Постоялец
 
Сообщения: 321
Зарегистрирован: 31.07.2002 (Ср) 13:18
Откуда: Russia

Сравнение двух числовых диапазонов и добавление.Что не так?

Сообщение sonata » 07.10.2003 (Вт) 11:51

Код: Выделить всё
Public Sub Сравнение_диапазонов_добавление()
'Столбец А содержит полный диапазон от 1 до 318(диапазон1)
'Столбец B содержит неполный диапазон от 1 до 318(диапазон2)
'Задача: добавить в нужное место диапазона2 недостающие числа,
'покрасив ячейку с ними в определенный цвет
Dim i, j As Integer
For i = 1 To 318
    For j = 1 To 318
    If Not (Cells(i, 1).value = Cells(j, 2).value) Then
        Cells(i, 2).Select
    Selection.Insert Shift:=xlDown
    Selection.Interior.ColorIndex = xlNone
    Cells(i, 2).value = Cells(i, 1).value
    'Cells(i, 3).value = 1
    End If
    Next j
   ' Else: Cells(i,3).value = 0
   ' End If
Next i
End Sub


Видимо, ошибка в том, что при добавлении строк, происходит перенумерация...А как это исправить?
Вложения
Недостающие номера квартир.zip
(10.55 Кб) Скачиваний: 51

Tuco
Постоялец
Постоялец
 
Сообщения: 508
Зарегистрирован: 18.06.2003 (Ср) 16:37
Откуда: Подмосковье

Сообщение Tuco » 07.10.2003 (Вт) 13:08

в таких случаях я обычно беру с большим запасом границу цикла и когда дохожу до пустой строки выхожу из этого цикла (Exit for)... может это и не очень красиво, и медленно, но это работает...
"There's more than one way to do it!"

Tony
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 121
Зарегистрирован: 03.08.2002 (Сб) 14:36
Откуда: Russia.EKB

Сообщение Tony » 07.10.2003 (Вт) 14:38

Думаю нет необходимости в двух циклах...
Код: Выделить всё
Public Sub Сравнение_диапазонов_добавление()
'Столбец А содержит полный диапазон от 1 до 318(диапазон1)
'Столбец B содержит неполный диапазон от 1 до 318(диапазон2)
'Задача: добавить в нужное место диапазона2 недостающие числа,
'покрасив ячейку с ними в определенный цвет
Dim j As Integer
    For j = 1 To 318
    If Not (Cells(j, 1).Value = Cells(j, 2).Value) Then
        Cells(j, 2).Select
    Selection.Insert Shift:=xlDown
    Selection.Interior.ColorIndex = 3
    Cells(j, 2).Value = Cells(j, 1).Value
    'Cells(i, 3).value = 1
    End If
    Next j
   ' Else: Cells(i,3).value = 0
   ' End If

End Sub


тока у тебя в примере в 189 строке оригинала есть ошибка... надо 297 а не 397... он просто все что идет ниже соответственно сдвигает
Да и ColorIndex я чуть чуть поправил для наглядности... :)
__________________
счастье в секундах, маленьких острых... щедрое к детям и скупое для взрослых...

sonata
Постоялец
Постоялец
 
Сообщения: 321
Зарегистрирован: 31.07.2002 (Ср) 13:18
Откуда: Russia

Сообщение sonata » 07.10.2003 (Вт) 14:56

Не думала, что все так просто окажется....
Ошибка всего лишь в строчке:
Cells(i, 2).value = Cells(i, 1).value
вместо i должно быть j.Но почему? Как это объяснить?

Tony
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 121
Зарегистрирован: 03.08.2002 (Сб) 14:36
Откуда: Russia.EKB

Сообщение Tony » 07.10.2003 (Вт) 15:07

знаешь трудно объяснить... не возьмусь... я пытался разобраться зачем тут два цикла.... и сломал не только голову но и карандаш в руке... (хороший кстати карандаш :D ) А в таких случаях проще представить как бы сам сделал... и решение не замедлило себя ждать... как то так...
__________________
счастье в секундах, маленьких острых... щедрое к детям и скупое для взрослых...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.10.2003 (Ср) 9:52

Соната!!!
А я всё думаю - когда же зайдёт снова? :)
Лови.
Вложения
Недостающие номера квартир.zip
Приведение столбиков один к другому.
Ну и функции расчёта интервалов подправил ;)
(17.35 Кб) Скачиваний: 56
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

sonata
Постоялец
Постоялец
 
Сообщения: 321
Зарегистрирован: 31.07.2002 (Ср) 13:18
Откуда: Russia

Сообщение sonata » 08.10.2003 (Ср) 13:37

:wink: Спасибо!
Красивое решение!Но для меня уж больно вумное! :)
Хотя, надо всегда стремиться к совершенству!!! :!:
Например, что-такое
PatternRange.Sort PatternRange.Cells(1), xlAscending???
Но, все равно спасибо!Мне приятно, что меня еже не забыли! :D

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 09.10.2003 (Чт) 7:18

Это фулпруф на случай, если исходные данные не отсортированы. Потому что только когда они отсортированы, сей алгоритм будет работать правильно. Иначе - два цикла :wink:
Команда PatternRange.Sort PatternRange.Cells(1), xlAscending означает: Сортировать диапазон PatternRange (не трогая остальное) по первому столбцу (а других нет) в порядке возрастания.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Штурман
Новичок
Новичок
 
Сообщения: 37
Зарегистрирован: 25.07.2003 (Пт) 10:47
Откуда: Москва

Сообщение Штурман » 09.10.2003 (Чт) 12:21

а мой код не работает?


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 68

    TopList