Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/29: Рейтинг темы: голосов - 29, средняя оценка - 4.52
 Аватар для besstiaa
94 / 94 / 14
Регистрация: 04.06.2010
Сообщений: 223

Удалить строки, где данные в столбцах C,D,E на i равны данным этих же столцов из строки i-1

23.09.2010, 23:26. Показов 6000. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Нужен макрос, выполняющих определенные действия (см. ниже). С VBA сталкивалась один раз, и уже мало что помню. Писать всё полностью не прошу, но может быть хотя бы подскажите, какие функции и команды понадобятся, потому как полностью изучать некогда.

Задача макроса должна быть следующей. Есть таблица Excel с данными (числа). Нужно удалить строки, где данные в столбцах C,D,E на i равны данным этих же столцов из строки i-1;
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.09.2010, 23:26
Ответы с готовыми решениями:

Определить длину строки,удалить из строки все символы, которые равны заданному
Доброго времени суток уважаемые форумчане. Помогите пожалуйста с написанием кода для данной задачи в вижуале. Если будет возможно,то с...

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

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

17
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
24.09.2010, 08:01
ну можно так:
Visual Basic
1
2
3
4
5
For i = 1 To Kol_strok - 1
    If Cells(i, 3) = Cells(i + 1, 3) And Cells(i, 4) = Cells(i + 1, 4) And Cells(i, 5) = Cells(i + 1, 5) Then
        Rows(i).Delete Shift:=xlUp
    End If
Next i
Kol_strok определишь сам
1
 Аватар для besstiaa
94 / 94 / 14
Регистрация: 04.06.2010
Сообщений: 223
24.09.2010, 10:02  [ТС]
Alex77755,спасибо за наводку. Логика правда будет чуть "посложнее", но думаю с условиями я разберусь.

Добавлено через 2 минуты
А есть ли какая-то, чтобы определить количество заполненных строк на листе?
0
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
24.09.2010, 10:55
Вариант 1.
Visual Basic
1
2
i = Columns(1).Rows(65000).End(xlUp).Row + 1
MsgBox "Первая пустая ячейка -  A" & i
Вариант 2.
Visual Basic
1
2
3
4
5
6
7
i = 1
While Sheets("sheet1").Range("a" & i) <> Empty
i = i + 1
Wend
 
MsgBox "Первая пустая ячейка -  A" & i
End Sub
Возможны и другие варианты..
1
 Аватар для besstiaa
94 / 94 / 14
Регистрация: 04.06.2010
Сообщений: 223
24.09.2010, 11:51  [ТС]
Alex77755,спасибо))) Выручили))) Макрос написан. Он конечно весьма не универсален и есть свои нюансы, но для конкретных целей подошел, очень сэкономил время.

PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Sub Raspoz()
 
Dim i As Integer
Dim kstr As Long
i = 1
 
kstr = 1
While Sheets("Vyb_pbp_rasp").Range("a" & kstr) <> Empty
kstr = kstr + 1
Wend
 
MsgBox "Первая пустая ячейка -  A" & kstr
 
For j = 0 To kstr - 3
Rows(i).Select
'MsgBox ("Сравниваем строки  " & i & " и " & i + 1 & Chr(10) & "Значение столбцов C, D, E" & Chr(10) & _
            Cells(i, 3) & "  " & Cells(i, 4) & "  " & Cells(i, 5) & Chr(10) & _
            Cells(i + 1, 3) & "  " & Cells(i + 1, 4) & "  " & Cells(i + 1, 5))
    If (Cells(i + 1, 3) = Cells(i, 3) And Cells(i + 1, 4) = Cells(i, 4) And Cells(i + 1, 5) = Cells(i, 5)) _
    Or (Cells(i + 1, 3) = 0 And Cells(i + 1, 4) = 0 And Cells(i + 1, 5) = 0) Then
        Rows(i + 1).Select
        Rows(i + 1).Delete Shift:=xlUp
        'MsgBox ("Ok")
    Else: i = i + 1
    End If
Next j
 
End Sub
0
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
24.09.2010, 15:55
Rows(i).SELECT можно не делать - при больших таблицах - тормоз
Зачем дополнительная переменная "i"?
Есть же переменная цикла. К ней и привязывайся
1
 Аватар для besstiaa
94 / 94 / 14
Регистрация: 04.06.2010
Сообщений: 223
24.09.2010, 18:38  [ТС]
Цитата Сообщение от Alex77755 Посмотреть сообщение
Rows(i).SELECT можно не делать - при больших таблицах - тормоз
Зачем дополнительная переменная "i"?
Есть же переменная цикла. К ней и привязывайся
Да действительно. Забыла закомментировать эту строчку, использовала при отладке для наглядности. По поводу i и j;
j - это переменная для перебора, т.е. зависящая от количества строк изначально.
i - номер текущей строки для сравнения.
0
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
25.09.2010, 08:01
Если решила воспользоваться вторым вариантом, то вовсе не обязательно считать строки:


Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Sub Raspoz()
 
Dim i As Integer
 
i = 1
 
While Sheets("Vyb_pbp_rasp").Range("a" & i) <> Empty
    If (Cells(i + 1, 3) = Cells(i, 3) And Cells(i + 1, 4) = Cells(i, 4) And Cells(i + 1, 5) = Cells(i, 5)) _
    Or (Cells(i + 1, 3) = 0 And Cells(i + 1, 4) = 0 And Cells(i + 1, 5) = 0) Then
     Rows(i + 1).Delete Shift:=xlUp
    Else: i = i + 1
    End If
Wend
  
End Sub
1
 Аватар для besstiaa
94 / 94 / 14
Регистрация: 04.06.2010
Сообщений: 223
25.09.2010, 13:13  [ТС]
Alex77755,действительно проще и компактнее. Однако у меня есть несколько вопросов.

Во-первых, вы оба раза для удаления строки используете только метод delete, не выделяя при этом сначала строку, которую нужно удалить. У меня без select не работает удаление. Это у меня что-то не так, или от чего-то другого зависит?

Во-вторых, волнует момент времени выполнения. Если при изначально 8000 строк - время выполнения макроса около 3 минут, то при 50000 - уже больше часа. Конечно в любом случае это намного быстрее и удобнее ручного перебора, но хочется разобраться. Одно из предположений, что удаляется в итоге около 95% строк, а при удалении строки все оставшиеся сдвигаются вверх. Так как одинаковые строки (одинаковые по трем столбцам) идут подряд, т.е. блоками, то возможно ли при проверке сначала выделять все одинаковые с i-ой строкой строки (как правило около 20-23 строк после нее) и только потом удалять этот блок. В итоге окажется, что функция delete будет использована раз в 20 меньше. Если я не права в своих рассуждениях - поправьте, пожалуйста. Или подскажите, за счет чего можно еще увеличить быстродействие.
0
Частенько бываю
 Аватар для Vlanib
750 / 331 / 42
Регистрация: 20.06.2007
Сообщений: 854
25.09.2010, 13:56
А вы бы выложили пример файлика было бы проще вам помочь.
1
 Аватар для besstiaa
94 / 94 / 14
Регистрация: 04.06.2010
Сообщений: 223
25.09.2010, 14:20  [ТС]
Vlanib,без проблем. Правда я удалила ряд лишних столбцов, которые не используются при проверке. При таком раскладе время выполнения - 37 сек у меня.
Вложения
Тип файла: rar test.rar (54.9 Кб, 34 просмотров)
0
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
25.09.2010, 20:55
При таком количестве могу сказать однозначно - надо считать всё в массив и работать с массивом.

Добавлено через 2 часа 11 минут
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Sub Попробуй_вариантик()
Dim M()
Dim St, i, J, K, KS
KS = 2
Dim t
t = Time
St = Columns(1).Rows(65500).End(xlUp).Row
 M = Range(Cells(1, 1), Cells(St, 10)).Value
 
i = 1
 J = 2
Do
    Do While (M(J, 3) = M(i, 3) And M(J, 4) = M(i, 4) And M(J, 5) = M(i, 5)) _
    Or (M(J, 3) = 0 And M(J, 4) = 0 And M(J, 5) = 0) And J < St + 1
    J = J + 1
    If J = St + 1 Then GoTo 1
    Loop
    i = i + 1
            For K = 1 To 8
            M(i, K) = M(J, K)
            Next K
    J = J + 1
Loop While J < St + 1
1
 
Лист1.Select
Cells.ClearContents
   Range(Cells(1, 1), Cells(i + 1, 8)).Value = M
MsgBox (Timer - t & " seconds")
End Sub
хотел файлик прицепить - не цепляется
1
 Аватар для besstiaa
94 / 94 / 14
Регистрация: 04.06.2010
Сообщений: 223
25.09.2010, 22:00  [ТС]
Alex77755,ругается на Лист1.Select
Это тот лист, с которого данные считываются? Пытаюсь подставить своё название, все равно выдает ошибку Object required
0
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
25.09.2010, 22:04
Зашел с другого броузера
Смотри вложение
Вложения
Тип файла: rar test_massiv.rar (67.2 Кб, 45 просмотров)
1
 Аватар для besstiaa
94 / 94 / 14
Регистрация: 04.06.2010
Сообщений: 223
25.09.2010, 22:15  [ТС]
Alex77755,да, ваш вариант работает отлично и главное оч быстро) Буду разбираться теперь, что к чему до конца. Спасибо большое)))
0
0 / 0 / 0
Регистрация: 30.03.2012
Сообщений: 5
30.05.2012, 17:09
Ребята, а как реализовать такое с удалением определенных ячеек?
Есть таблица в csv
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
---A----- -----B----- ----C----- -----D---- -----E----
1 Parent-- -значение- --значение- --значение Category1
2 Child--- --значение- --значение- --значение Category1
3 Child--- --значение- --значение- --значение Category1
4 Parent-- --значение- --значение- --значение Category2
5 Child--- --значение- --значение- --значение Category2
... и т.д.
 
Нужно, чтобы макрос удалял данные в колонке E напротив Child.
То есть остается Parent и должно получится так:
---A----- -----B----- ----C----- -----D---- -----E----
1 Parent-- -значение- --значение- --значение Category1
2 Child--- --значение- --значение- --значение здесь должно быть пусто
3 Child--- --значение- --значение- --значение здесь должно быть пусто
4 Parent-- --значение- --значение- --значение Category2
5 Child--- --значение- --значение- --значение здесь должно быть пусто
... и т.д.
0
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
30.05.2012, 17:19
Выделяешь последнее слово и сравниваешь с предыдущим
0
0 / 0 / 0
Регистрация: 30.03.2012
Сообщений: 5
30.05.2012, 17:41
В смысле? Всего 6000 строк в таблице. Нужен макрос.
Есть такое решение, но ещё не проверял, может взгляните:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 ' FSO Constants
   t = timer
   Const ForReading   = 1
   Const ForWriting = 2
   Const ForAppending   = 8
   Const TristateUseDefault= -2
   
   ' Variables
   Dim objFSO, objTS, objOTS, objfile, tempStr
 
   ' Instantiate the object
   Set objFSO = CreateObject("Scripting.FileSystemObject")
 
   ' open the text file read only
   Set objTS = objFSO.OpenTextFile("C:\temp\obbnd\Tor_ip_list_ALL.csv", ForReading, False, TristateUseDefault)
   ' We now open the file to write it out
   If objFSO.FileExists("C:\temp\obbnd\Tor_ip_list_ALL.txt") Then
      Set objOTS = objFSO.OpenTextFile("C:\temp\obbnd\Tor_ip_list_ALL.txt", ForAppending) 'открываем итоговый файл для добавления записей
   Else
      Set objfile = objFSO.CreateTextFile("C:\temp\obbnd\Tor_ip_list_ALL.txt")
      Set objfile = Nothing
      Set objOTS = objFSO.OpenTextFile("C:\temp\obbnd\Tor_ip_list_ALL.txt", ForAppending)
   End if
 
   Do While objTS.AtEndOfStream <> True
   tempStr = objTS.ReadLine()
      objOTS.Write Replace(tempStr,".","-") & "/" & tempStr & vbCrLf
   Loop
   
   ' Close all files after we read it in.
   objTS.Close
   Set objTS = Nothing
   objOTS.Close
   Set objOTS = Nothing
   Set objFSO = Nothing
t=timer-t
msgbox "OK! Run in " & t
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.05.2012, 17:41
Помогаю со студенческими работами здесь

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

В числовых строках в вертикальных столбцах удалить строки по условию
Подскажите как в числовых строках в вертикальных столбцах Удалить строки по условию: Есть массив чисел 4 14 15 20 36 7 9 18 28 38 ...

Найти в матрице строки, где все элементы равны нулю
Доброго времени суток. Помогите пожалуйста решить задачу: Дана матрица А размером nxm. Найти в матрице строки, где все элементы равны нулю....

Вычислить произведение элементов в столбцах с нечетным номером; удалить второй элемент первой строки
Рябят выручайте!!! Помогите пожалуйста составить программу, в которой 1) организовать ввод квадратной матрицы размера nxn из целых...

Удалить те строки и столбцы матрицы, в которых значения главной диагонали равны нулю
Дана квадратная матрица порядка n. Как строки со столбцами удалять из матрицы?


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru