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

Есть код который удаляет все пустые строки, нужно если должность 1 и ФИО заполнено чтобы не удалялось

05.10.2020, 17:20. Показов 2020. Ответов 16

Студворк — интернет-сервис помощи студентам
Привет всем!) Есть код который удаляет все пустые строки, он работает. Нужно если должность одна и ФИО заполнено чтобы не удалялось. Сейчас чистится даже если ФИО заполнено и одна строка. Спасибо заранее!
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
Private Sub CommandButton34_Click()
Application.ScreenUpdating = False
     ActiveSheet.Unprotect (159) 'снимается пароль
       Application.Calculation = xlManual 'Отключение автоматических перерасчетов
  Dim countRow, Rowcount As Integer
  If MsgBox("Вы уверены что хотите удалить ВСЕ пустые строки?", vbYesNo) = vbYes Then
     countRow = ActiveSheet.UsedRange.Rows.Count
     Do While countRow >= 8
        Rowcount = ActiveSheet.Range("C" & countRow - (Rowcount - 1)).MergeArea.Rows.Count
        If Rowcount > 1 Then
           If ActiveSheet.Range("C" & countRow - (Rowcount - 1)).Value = "" Then
              ActiveSheet.Rows(countRow - (Rowcount - 1) & ":" & countRow).Select
              Selection.Delete Shift:=xlUp
              countRow = ActiveSheet.UsedRange.Rows.Count
              ActiveSheet.Range("C8").Select
           Else
              countRow = countRow - Rowcount
           End If
        Else
          countRow = countRow - 1
        End If
     Loop
     Call CommandButton35_Click
     ActiveSheet.Protect Password:=159, DrawingObjects:=True, Contents:=True, Scenarios:=True, _
                         AllowFormattingColumns:=True, AllowFormattingRows:=True
  Application.ScreenUpdating = True
  End If
End Sub
Вложения
Тип файла: rar Табель МЕД.rar (574.4 Кб, 7 просмотров)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.10.2020, 17:20
Ответы с готовыми решениями:

Есть две таблицы: Должность и Работники. Необходимо сделать так, чтобы выводило в поле Edit должность работника
Возможно ли это осуществить? Проблема в том, что на каждого работника выводит только одну должность - первую (официант). Если бы можно было...

Есть код, который переносит одну строку с tdbgrid в Ворд, нужно чтобы переносилась вся таблица
var pword: Variant; i, j, RowNum : Integer; xfilename: string; begin pword:=CreateOleObject('Word.Application'); ...

Класс, который удаляет из строки все пробелы
Нужен класс, который удаляет из строки все пробелы. Как сие лучше реализовать? Придумалось вот такое: #include <iostream> ...

16
349 / 190 / 108
Регистрация: 01.04.2020
Сообщений: 538
06.10.2020, 02:04
Sh0ck3r, попробуйте.
Надеюсь, ничего не перепутал.
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
38
39
40
41
42
43
44
45
Private Sub CommandButton34_Click()
Dim dRange As Range, delArea As Range
Dim RowLast As Long, i As Long, dRwF As Long, dRwL As Long
Dim KolDolzn As Byte
 
If MsgBox("Вы уверены что хотите удалить ВСЕ пустые строки?", vbYesNo) = vbYes Then
    Application.ScreenUpdating = False
    ActiveSheet.Unprotect (159) 'снимается пароль
    Application.Calculation = xlManual 'Отключение автоматических перерасчетов
        
    With ActiveWorkbook.ActiveSheet
        RowLast = .Cells.Find(What:="*", After:=Cells(1, 1), SearchOrder:=xlByRows, _
                                SearchDirection:=xlPrevious).Row
        For i = RowLast To 8 Step -1
            '   если понял правильно, удаляем всегда четыре строки вместе
            If .Cells(i, "C").MergeArea.Rows.Count = 4 Then
                dRwF = .Cells(i, "C").MergeArea(1).Row
                dRwL = i        'dRwF + .Cells(i, "C").MergeArea.Rows.Count - 1
                '   считаем количество должностей
                Set dRange = .Range("D" & dRwF & ":D" & dRwL)
                KolDolzn = Application.WorksheetFunction.CountA(dRange)
                '   если в столбце "C" данные, и количество должностей = 1, строки оставляем
                If .Cells(i, "C").MergeArea(1) <> "" And KolDolzn = 1 Then
                Else
                '   если нет, загоняем в Range Collection для следующего позже удаления строк
                    If delArea Is Nothing Then
                        Set delArea = Range(dRwF & ":" & dRwL)
                    Else
                        Set delArea = Union(delArea, .Range(dRwF & ":" & dRwL))
                    End If
                End If
                i = dRwF    '   понижаем счетчик для избежания не нужной работы
            End If
        Next
                '   удаляем строки
                If Not delArea Is Nothing Then delArea.Delete
    End With
    
    Application.Goto ActiveSheet.Range("A1"), True
    'Call CommandButton35_Click
    ActiveSheet.Protect Password:=159, DrawingObjects:=True, Contents:=True, Scenarios:=True, _
    AllowFormattingColumns:=True, AllowFormattingRows:=True
    Application.ScreenUpdating = True
End If
End Sub
1
0 / 0 / 0
Регистрация: 17.09.2019
Сообщений: 90
06.10.2020, 09:21  [ТС]
Спасибо, но немного не то. Нужно чтобы если ФИО заполнено, то чтобы оставляло в независимости от кол-ва должностей. А если должность одна и ФИО не заполнено, то удалить.
0
349 / 190 / 108
Регистрация: 01.04.2020
Сообщений: 538
06.10.2020, 10:51
Цитата Сообщение от Sh0ck3r Посмотреть сообщение
Спасибо, но немного не то.
макрoс рабoтает пo этoму услoвию:
Цитата Сообщение от Sh0ck3r Посмотреть сообщение
Нужно если должность одна и ФИО заполнено чтобы не удалялось.
этo услoвие уже другoе:
Цитата Сообщение от Sh0ck3r Посмотреть сообщение
Нужно чтобы если ФИО заполнено, то чтобы оставляло в независимости от кол-ва должностей. А если должность одна и ФИО не заполнено, то удалить.
не беда, мoжнo исправить, нo есть ещё вариант: если должности две и ФИО не заполнено, то чтo делать?
0
0 / 0 / 0
Регистрация: 17.09.2019
Сообщений: 90
06.10.2020, 10:59  [ТС]
тоже удалять) Любые строки где ничего нет в столбце С, в независимости от кол-ва должностей должно чистить. Если столбец с ФИО не заполнен, то чистить все должности.
Есть еще такой код, здесь нужно цикл задать через While:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Private Sub CommandButton34_Click()
Application.ScreenUpdating = False
     ActiveSheet.Unprotect (159) 'снимается пароль
       Application.Calculation = xlManual 'Отключение автоматических перерасчетов
 Dim rF As Range
 Dim lLastRow As Long
  If MsgBox("Вы уверены что хотите удалить ВСЕ пустые строки?", vbYesNo) = vbYes Then
    Set rF = ActiveSheet.UsedRange.FindNext("*", , , , xlByRows, xlPrevious)
    If rF Is Nothing Then
        lLastRow = rF.Row
        Rows.Delete (lLastRow)
    End If
    Loop
     Call CommandButton35_Click
     ActiveSheet.Protect Password:=159, DrawingObjects:=True, Contents:=True, Scenarios:=True, _
                         AllowFormattingColumns:=True, AllowFormattingRows:=True
  Application.ScreenUpdating = True
  End If
End Sub
Добавлено через 5 минут
Может этот код даже и проще, только я туплю как цикл запустить.
0
349 / 190 / 108
Регистрация: 01.04.2020
Сообщений: 538
06.10.2020, 11:00
Лучший ответ Сообщение было отмечено Sh0ck3r как решение

Решение

тoгда пoпрoбуйте:
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
38
39
40
41
42
43
44
45
Private Sub CommandButton34_Click()
Dim dRange As Range, delArea As Range
Dim RowLast As Long, i As Long, dRwF As Long, dRwL As Long
Dim KolDolzn As Byte
 
If MsgBox("Вы уверены что хотите удалить ВСЕ пустые строки?", vbYesNo) = vbYes Then
    Application.ScreenUpdating = False
    ActiveSheet.Unprotect (159) 'снимается пароль
    Application.Calculation = xlManual 'Отключение автоматических перерасчетов
        
    With ActiveWorkbook.ActiveSheet
        RowLast = .Cells.Find(What:="*", After:=Cells(1, 1), SearchOrder:=xlByRows, _
                                SearchDirection:=xlPrevious).Row
        For i = RowLast To 8 Step -1
            '   если понял правильно, удаляем всегда четыре строки вместе
            If .Cells(i, "C").MergeArea.Rows.Count = 4 Then
                dRwF = .Cells(i, "C").MergeArea(1).Row
                dRwL = i        'dRwF + .Cells(i, "C").MergeArea.Rows.Count - 1
                '   считаем количество должностей
                'Set dRange = .Range("D" & dRwF & ":D" & dRwL)
                'KolDolzn = Application.WorksheetFunction.CountA(dRange)
                '   если в столбце "C" данные, строки оставляем
                If .Cells(i, "C").MergeArea(1) <> "" Then
                Else
                '   если нет, загоняем в Range Collection для следующего позже удаления строк
                    If delArea Is Nothing Then
                        Set delArea = Range(dRwF & ":" & dRwL)
                    Else
                        Set delArea = Union(delArea, .Range(dRwF & ":" & dRwL))
                    End If
                End If
                i = dRwF    '   понижаем счетчик для избежания не нужной работы
            End If
        Next
                '   удаляем строки
                If Not delArea Is Nothing Then delArea.Delete
    End With
    
    Application.Goto ActiveSheet.Range("A1"), True
    'Call CommandButton35_Click
    ActiveSheet.Protect Password:=159, DrawingObjects:=True, Contents:=True, Scenarios:=True, _
    AllowFormattingColumns:=True, AllowFormattingRows:=True
    Application.ScreenUpdating = True
End If
End Sub
1
0 / 0 / 0
Регистрация: 17.09.2019
Сообщений: 90
06.10.2020, 11:03  [ТС]
сейчас если 1 должность и ФИО не заполнено, не удаляет(
0
349 / 190 / 108
Регистрация: 01.04.2020
Сообщений: 538
06.10.2020, 11:31
Цитата Сообщение от Sh0ck3r Посмотреть сообщение
сейчас если 1 должность и ФИО не заполнено, не удаляет(
вечерoм пoсмoтрю...
0
0 / 0 / 0
Регистрация: 17.09.2019
Сообщений: 90
06.10.2020, 11:47  [ТС]
Хорошо, но даже за это уже огромное спасибо!)
0
0 / 0 / 0
Регистрация: 17.09.2019
Сообщений: 90
06.10.2020, 12:07  [ТС]
У меня есть еще 1 косяк. Есть кнопка добавление строки, если стоишь на столбце с ФИО, то добавляет нового человека. Если на должности, то добавляет новую строку. Но если стоишь на верхней должности и нажимаешь кнопку, то получается вот такая фигня:
Миниатюры
Есть код который удаляет все пустые строки, нужно если должность 1 и ФИО заполнено чтобы не удалялось  
0
0 / 0 / 0
Регистрация: 17.09.2019
Сообщений: 90
06.10.2020, 12:08  [ТС]
1ый скрин не то) Нужно чтобы когда выбрана верхняя должность писало ошибку или чтобы добавляло вниз. С тем я разобрался) Все работает, спасибо!!!
Миниатюры
Есть код который удаляет все пустые строки, нужно если должность 1 и ФИО заполнено чтобы не удалялось  
0
0 / 0 / 0
Регистрация: 17.09.2019
Сообщений: 90
06.10.2020, 12:17  [ТС]
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Private Sub CommandButton9_Click()
  ActiveSheet.Unprotect (159) 'снимается пароль
  Application.Calculation = xlManual 'Отключение автоматических перерасчетов
  Application.ScreenUpdating = False
       With ActiveSheet
      .Rows(ActiveCell.Row & ":" & ActiveCell.Row + (.Cells(ActiveCell.Row, ActiveCell.Column).MergeArea.Rows.Count - 1)).Copy
      .Rows(ActiveCell.Row & ":" & ActiveCell.Row + (.Cells(ActiveCell.Row, ActiveCell.Column).MergeArea.Rows.Count - 1)).Insert Shift:=xlDown
  End With
  Call CommandButton35_Click
  ActiveSheet.Protect Password:=159, DrawingObjects:=True, Contents:=True, Scenarios:=True, _
                      AllowFormattingColumns:=True, AllowFormattingRows:=True
  Application.ScreenUpdating = True
End Sub
Вложения
Тип файла: rar Табель МЕД.rar (574.4 Кб, 4 просмотров)
0
349 / 190 / 108
Регистрация: 01.04.2020
Сообщений: 538
07.10.2020, 00:18
Sh0ck3r, не знаю понял ли я чего хотите достич. Попробуйте и отпишитесь правильно ли это работает:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub CommandButton9_Click()
  ActiveSheet.Unprotect (159) 'снимается пароль
  Application.Calculation = xlManual 'Отключение автоматических перерасчетов
  Application.ScreenUpdating = False
       With ActiveSheet
      .Cells(ActiveCell.Row, "C").Activate
      .Rows(ActiveCell.Row & ":" & ActiveCell.Row + (.Cells(ActiveCell.Row, ActiveCell.Column).MergeArea.Rows.Count - 1)).Copy
      .Rows(ActiveCell.Row & ":" & ActiveCell.Row + (.Cells(ActiveCell.Row, ActiveCell.Column).MergeArea.Rows.Count - 1)).Insert Shift:=xlDown
  End With
  Call CommandButton35_Click
  ActiveSheet.Protect Password:=159, DrawingObjects:=True, Contents:=True, Scenarios:=True, _
                      AllowFormattingColumns:=True, AllowFormattingRows:=True
  Application.ScreenUpdating = True
End Sub
0
0 / 0 / 0
Регистрация: 17.09.2019
Сообщений: 90
07.10.2020, 08:18  [ТС]
Вообще теперь не работает( Нужно чтобы если выбрана верхняя должность, то добавлять вниз.
0
349 / 190 / 108
Регистрация: 01.04.2020
Сообщений: 538
07.10.2020, 21:58
Цитата Сообщение от Sh0ck3r Посмотреть сообщение
Вообще теперь не работает
Неработает? Это не так. Вы, наверно, невнимательно смотрели. Теперь, вне зависимости от того который столбец активный, "C", "D" или какой-нибудь другой, процедура сделает копию всех четырёх строк - добавит четыре новые и вставит в них данные из прежде активной четвёрки строк.
0
0 / 0 / 0
Регистрация: 17.09.2019
Сообщений: 90
08.10.2020, 08:11  [ТС]
Так не нужно, нужно чтобы добавлялась 3я должность у того же человека. Их может быть до 5
0
349 / 190 / 108
Регистрация: 01.04.2020
Сообщений: 538
08.10.2020, 21:44
Sh0ck3r, я ответил вам здесь:
Есть код который добавляет строку с объединенными ячейками, работает только если выбрана нижняя строка
не знаю зачем повторяете ваши вопросы в новых темах, да ещё не со всей информацией
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.10.2020, 21:44
Помогаю со студенческими работами здесь

Нужно, чтобы переносились из одного stringgrid в другой. Переносится, но на те же строки и образуются пустые строки
Прикрепляю код. Помогите пожалуйста. Я в DElphi новичок var i: integer; begin StringGrid2.Show; ...

Нужно чтобы сначала шли цифры а затем все буквы но в обратном порядке Если в строке есть символ '.' вывести ошибку
/ * Есть строка, содержащая буквы и цифры. Превратите эту строку так, чтобы сначала в нем шли все цифры исходной строки, а затем - все...

Написать алгоритм Маркова, который в алфавите {a,b,c} удаляет в слове предпоследнюю букву, если в слове есть буквы b
Написать алгоритм Маркова, который в алфавите {a,b,c} удаляет в слове предпоследнюю букву, если в слове есть буквы b. Привести пример...

Нужно удалить все пустые строки
Написал процедуру, но как то криво работает. procedure TForm1.sSpeedButton35Click(Sender: TObject); var i,j,k,l:integer; ...

Проверяет ячейки столбцов, если пустые то удаляет сроку
Добрый день! Имеется excel файл ниже напечатанного формата: Столбец &quot;A&quot; - артикул; Начиная со столбца &quot;B&quot; и до...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru