Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 02.04.2011
Сообщений: 3

For Each пробегает не все значения (MS Excel)

03.03.2013, 09:03. Показов 2814. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.

Недавно при написании макроса на VBA заметил одну странность.
Задача стоит простая: перебрать все строки на одном листе и, если в значении первой ячейки строки присутствуют символы "-S-", скопировать такую строку на второй лист, затем удалить ее с первого.

Код выглядит следующим образом:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Dim sheet1, sheet2 As Worksheet                             
Set sheet1 = Application.ThisWorkbook.Sheets("Лист1")
Set sheet2 = Application.ThisWorkbook.Sheets("Лист2")
 
sheet1.Activate
Dim lastrow As Long
lastrow = sheet1.Cells(Rows.Count, 1).End(xlUp).Row
MsgBox ("The number of the last row is " & lastrow)
 
Dim i As Long
i = 1
Dim r_name As Variant
    For Each r_name In sheet1.Range(sheet1.Cells(2, 1), sheet1.Cells(lastrow, 1))
        If r_name.Value Like "*-S-*" Then
            r_name.EntireRow.Copy sheet2.Cells(i, 1)
            i = i + 1
            r_name.EntireRow.Delete
        End If
    Next r_name
Странность в том, что если копировать строку и затем удалять ее(как написано в коде), то отрабатывает это не на весь r_name(на листе остаются значения с "-S-"), а если вместо копирования и удаления сделать, например, так:
Visual Basic
1
2
3
4
5
For Each r_name In sheet1.Range(sheet1.Cells(2, 1), sheet1.Cells(lastrow, 1))
        If r_name.Value Like "*-S-*" Then
           r_name.EntireRow.Interior.Color = RGB(220, 0, 0)
        End If
Next r_name
то отработает все без проблем, все искомые строки закрасятся.

Господа, что я делаю не так?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.03.2013, 09:03
Ответы с готовыми решениями:

Все значения выделенного диапазона листа Excel умножить на заданное число
Разработайте форму с одним полем и одной кнопкой. В поле вводится число, а при нажатии на кнопку все значения выделенного диапазона листа...

VBA в MS Excel надо чтобы все введённые значения появлялись на листе только после закрытия последней
Делал психологический тест в Excel, каждый вопрос появляется в своей UserForm, в которой есть только одно окошко для ответа, куда надо...

напечатать подряд все значения аргумента, затем все значения функции
Есть у меня код,как напечатать значения аргумента, затем все значения функции.Подскажите. for (double x = 1; x <= 5; x+= 0.5) { ...

4
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
03.03.2013, 09:36
Дело в том, что ты перебирая коллекцию, одновременно удаляешь из неё элементы. Перебирать нужно с конца
1
0 / 0 / 0
Регистрация: 02.04.2011
Сообщений: 3
03.03.2013, 09:43  [ТС]
Цитата Сообщение от ViterAlex Посмотреть сообщение
Дело в том, что ты перебирая коллекцию, одновременно удаляешь из неё элементы. Перебирать нужно с конца
Т.е. сделать это For'ом?
PureBasic
1
For i = lastrow to 2 Step = -1
0
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
03.03.2013, 10:31
Да. Только второй знак "=" уберите
Для наглядности можете в исходном коде перед стр. 14 поставить r_name.Select (потом не забудьте удалить!) и пройти по шагам - F8.
А вообще это надо делать автофильтром - тем более что в первой строке заголовок.
Отфильтровать по "*-S-*", скопировать видимые, удалить видимые.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38180 / 21115 / 4307
Регистрация: 12.02.2012
Сообщений: 34,724
Записей в блоге: 14
03.03.2013, 10:55
Думаю, что можно и так:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
  Do
 
       c_before&=col.count
 
       '::: Далее перебор элементов коллекции в
       '::: любом удобном порядке и удаление нужных
 
       c_after&=col.count
 
       If c_before& = c_after& then Exit Do
 
  Loop
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.03.2013, 10:55
Помогаю со студенческими работами здесь

Цикл не пробегает строку
Задание на расшифровку текста. Дана одна строка с нормальным порядком алфавита и вторая со сдвинутым порядком. Вторая строка так же...

Программа, определяющая, есть ли в массиве хотя бы один столбец, содержащий все одинаковые значения, содержащий все разные значения
Написать программу, определяющую есть ли в массиве хотя бы один столбец, содержащий все одинаковые значения, содержащий все разные...

Цикл два раза пробегает по строкам
Добро всем! :senor: Лето закончилось и у нас начались трудовые будни)) Подскажите почему где-то на десятый раз цикл может два раза...

Массивы. Найти максимальные и минимальные значения. В строках, где находятся искомые значения все значения обратить в ноль и вернуть номер строки
Всем привет! Вот такая задачка: Ввести двумерный массив 5х6. Найти максимальные и минимальные значения. В строках, где находятся искомые...

Как перенести значения аргумента и значения функции в Excel?
Есть функция у(x); x задано от 0 до 2pi с шагом p/360. Как перенести значения аргумента и значения функции в Excel?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru