Макрос в Excell
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Макрос в Excell

Макрос в Excell

Ответ
Поиск в этой теме
Непрочитано 21.08.2004, 19:59 #1
Макрос в Excell
Денэн
 
г.Саратов
Регистрация: 06.03.2004
Сообщений: 72

Подскажите пожалуйста, кто знает, как написать макрос в Excell, при выполнении которого, будет проверяться равенство нулю содержимое определённой ячейки строки. И если это равенство выполняется - строка удаляется.
Просмотров: 13555
 
Непрочитано 21.08.2004, 20:44
#2
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Примерно так (из активного листа). Примерчик выдрал как мог по быстрому из рабочего файла.
Код:
[Выделить все]
Private Sub Кнопка_Click()
Dim ActSh As Object ' активный лист
Dim Rw As Integer ' номер обрабатываемой строки
Dim Rs As Integer ' начальная строка диапазона
Dim Re As Integer ' конечная строка диапазона
Dim Cs As Integer ' начальная колонка диапазона
Dim Mest As Integer ' количество мест из ячейки листа

Set ActSh = Application.ActiveSheet ' активный лист

Rs = 5 ' границы области для примера
Re = 20
Cs = 1

        For Rw = Rs To Re
            Mest = Val(ActSh.Cells(Rw, Cs + 3).Text) ' количество мест из ячейки листа
            If Mest = 0 Then
                ActSh.Rows(Rw).Delete ' удалить строку
                Rw = Rw - 1
            Else
                ActSh.Rows(Rw).RowHeight = 15 ' высота строки
            End If
        Next Rw
.......................и т.д.
End Sub
Как к листу обращаться по имени (совпадение по той же теме ) - глядим в Экселев хелп
Цитата:
This example deletes row three on Sheet1.

Worksheets("Sheet1").Rows(3).Delete
vk вне форума  
 
Автор темы   Непрочитано 21.08.2004, 23:51
#3
Денэн


 
Регистрация: 06.03.2004
г.Саратов
Сообщений: 72


Уважаемый vk
А не подскажете как сделать всё тоже самое, но постоянный диапазон (например 10х2) задаётся относительно выбранной ячейки.
У меня ни как не получается.
Денэн вне форума  
 
Непрочитано 22.08.2004, 12:58
#4
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
постоянный диапазон (например 10х2) .... относительно выбранной ячейки
Поподробнее плиз... кем выбранной? Удалять только часть строки (ту что в диапазоне) или удалять всю строку а анализировать все ячейки диапазона?
А еще лучше подробненько сценарий распишите. Сделать то можно все. Ну или почти все. А вот с телепатией - хриновато :cry:
vk вне форума  
 
Автор темы   Непрочитано 22.08.2004, 15:31
#5
Денэн


 
Регистрация: 06.03.2004
г.Саратов
Сообщений: 72


Если поподробней, то имеется набор строк (разный, до 4000). Этот набор делится на таблицы по 14 строк. Все строки записаны подряд. В одном из столбцов (десятом) находятся числа 0 или 1. Если в ячейке 0 - строку надо удалить, если 1 - оставить. Первую строку таблицы нужно оставлять.
Я думал сдалать так:
1. Выделяю самую правую ячейку (15-й столбец) в первой строке таблицы.
2. Запускаю макрос. Макрос проверяет начиная со второй строки в каждой ячейке 10-го столбца выполнение равенства нулю. Если равенство выполняется удаляет всю строку. И так 13 строк.
3. Потом снова выделяю самую правую ячеку первой строки следущей таблицы.
4. Опять запускаю макрос и т.д.

Я сейчас это делаю вручную - задолбался! На один набор строк (лист) уходит не меньше часа
Денэн вне форума  
 
Непрочитано 22.08.2004, 15:57
#6
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Ага, более-менее, пнятно. У меня похожая задачка была, с той разницей, что в листе содержалась ячейка с ключевым словом. В моем случае "Наименование" (в строке заголовков колонок). Его и искал. Условие такое, чтоб вокруг таблицы было по одной пустой строке или столбцу (длина таблицы не фиксирована, день ото дня в шаблон потихоньку добавляются строки). Таким образом определяется область, а от нее уже и плясать... Как определяется диапазон в этом случае (еще кусок из того же макроса)
Код:
[Выделить все]
Set CellN = ActSh.Range("a1:z500").Find("Наим*") ' найти ячейку "Наименование"

    ActSh.Cells(CellN.Row, CellN.Column).Select ' выделить ячейку "Наименование"
    Selection.CurrentRegion.Select ' команда "Выделить область"
    AddrSel = ActiveWindow.RangeSelection.Address(ReferenceStyle:=xlR1C1) ' диапазон адресов выделенной области
    AddrList = Split(AddrSel, "R") ' разделение диапазона в массив
    Rs = Val(Split(AddrList(1), "C")(0)) + 1  ' начальная строка диапазона (не считая строки заголовка)
    Cs = Val(Split(AddrList(1), "C")(1)) ' начальная колонка диапазона
    Re = Val(Split(AddrList(2), "C")(0)) ' конечная строка диапазона
    Ce = Val(Split(AddrList(2), "C")(1)) ' конечная колонка диапазона
Если у тебя есть возможность разделить то так наверно проще будет. Да и при желании можно выбрать отдельную таблицу для правки. Если нет - то скорей всего удаление строк делать с конца таблицы, чтоб не париться с корректировкой номера строки. Скорей всего, это и будет оптимальным решением. Тогда в предыдущем коде чуток поправить For Rw = Re Rs To Step -1, а Rw = Rw - 1 просто убрать.
Да, и вряд ли стОит привязываться конкретно к выделенной ячейке. По ней можно достаточно надежно определить таблицу, а область и тем более, столбец с данными наверно лучше вычислить программно (ИМХО).
vk вне форума  
 
Автор темы   Непрочитано 22.08.2004, 20:21
#7
Денэн


 
Регистрация: 06.03.2004
г.Саратов
Сообщений: 72


Уважаемый vk!
Мне кажется мою задачу можно решить гораздо проще. Нам нужно просто из выделенной ячейки извлечь номер строки – число. Присвоить это число+1 переменной Rs тогда Re станет соответственно Rs+13 и записать код который Вы привели первым
Цитата:
Код:
[Выделить все]
For Rw = Rs To Re 
            Mest = Val(ActSh.Cells(Rw, Cs + 3).Text) ' количество мест из ячейки листа 
            If Mest = 0 Then 
                ActSh.Rows(Rw).Delete ' удалить строку 
                Rw = Rw - 1 
            
            End If 
        Next Rw
Столбец у меня всегда 10-й
Самый главный вопрос тогда становится как выделить номер строки и присвоить значение переменной Rs
Денэн вне форума  
 
Непрочитано 22.08.2004, 21:02
#8
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


В Экселе нет такого понятия как "выделенная ячейка". Есть понятие "выделенный диапазон", который может содержать и всего одну ячейку. Как из выделенного диапазона вытянуть границы - смотрите код в моем предыдущем постинге. Впрочем, это далеко не единственный способ. Нас интересует только Rs, а Re - это очевидно номер последней строки таблицы или Rs+13, если так угодно (не знаю, как Вам, но мне было б лень тыкать 256 раз в кнопку запуска макроса, чтоб пробежать все почти 4000 строк). Вместо Cs + 3 укажите явно номер столбца 10 (хоть я и против таких привязок, в прошлый раз столбец был однако 15-й... добавили слева что то?).
vk вне форума  
 
Непрочитано 22.08.2004, 21:06
#9
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Добавочка: в цикле Re надо также декрементировать, иначе цикл полезет на соседнюю таблицу, а оно как я понял Вам не надо.
vk вне форума  
 
Автор темы   Непрочитано 23.08.2004, 12:21
#10
Денэн


 
Регистрация: 06.03.2004
г.Саратов
Сообщений: 72


Уважаемый vk!
Для начала хочу выразить Вам свою глубокую признательность!Спасибо Вам большое! Вы освободили меня от монтонного долгого труда.
Со своей задачей я поступил следующим образом во первых я её еще упростил. Столбец который нужно проверять 12-й. В нем находятся числа 0 или 1. Причём число 1 встречается только один раз. Нужно удалить строки все строки, где в 12-м столбцечисло 0, кроме первой и строки где в 12-м столбце число 1. Т.е. от таблицы всегда остаётся 2 строки. В первоначальной таблице 15 , а как я раньше говорил 14 строк.
Используя Ваш код я написал такой макрос:
Код:
[Выделить все]
Sub Макрос10()

Dim ActSh As Object ' активный лист
Dim Rw As Integer ' номер обрабатываемой строки
Dim Rs As Integer ' начальная строка диапазона
Dim Sum As Integer ' счётчик цикла
Dim Mest As Integer ' текст из ячейки листа


Set ActSh = Application.ActiveSheet ' активный лист

ActiveCell.Range("A1").Select 'выделяю текущую ячейку

    AddrSel = ActiveWindow.RangeSelection.Address(ReferenceStyle:=xlR1C1) ' диапазон адрессов выделенной области
    AddrList = Split(AddrSel, "R") ' разделение диапазона в массив
    Rs = Val(Split(AddrList(1), "C")(0)) + 1  ' начальная строка диапазона (не считая первой)
    
    
    Rw = Rs

        For Sum = 1 To 27
    
            Mest = Val(ActSh.Cells(Rw, 12).Text) ' текст из ячейки
          If Mest = 0 Then
                ActSh.Rows(Rw).Delete ' удалить строку
                Sum = Sum + 1
            Else
            Rw = Rw + 1
            Sum = Sum + 1
            End If
           
                

        Next Sum
ActiveCell.Offset(2, 0).Range("A1").Select 'переход на следующую таблицу

End Sub
Цитата:
Если нет - то скорей всего удаление строк делать с конца таблицы, чтоб не париться с корректировкой номера строки
Действительно попарился. После того как попарился я ввел счётчик цикла (теперь пью пиво с рыбкой ). Но почему конечное значение Sum=27 я так и не понял. Я сначала написал:

Код:
[Выделить все]
For Sum = 1 To 14
Он мне 5 или 6 строчек проверил. И я методом тыка дошел до 27. Значит для 15 строчек будет Sum=27 .
Вот так, спасибо еще раз большое за помощь.
Хочу извиниться за стиль программирвания. Просто я сосем не программист. В институте что-то писали когда-то.
Денэн вне форума  
 
Непрочитано 23.08.2004, 18:57
#11
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Хочу извиниться за стиль программирвания. Просто я сосем не программист.
Да я тоже не программист. Просто лень делать ручками монотонную работу, которую может сделать машина - вот и приходится творить
А вот почему Sum=27 - это просто. дело в том, что сам по себе цикл For Sum = 1 To 27 уже управляет переменной Sum, да еще и в теле цикла прописано Sum = Sum + 1 и притом, независимо от условий. Если последнее убрать (и в If ив в Else) - то должно получиться по человечьи For Sum = 1 To 14 . Более того, Else вроде как вобще не нужно и лишнюю переменную можно убрать (если конечно ничего не надо делать с этим значением)
Код:
[Выделить все]
For Rw = Rs To Rs + 14 
          If Val(ActSh.Cells(Rw, 12).Text) = 0 Then 
                ActSh.Rows(Rw).Delete ' удалить строку 
          End If              
Next Sum
vk вне форума  
 
Автор темы   Непрочитано 24.08.2004, 09:30
#12
Денэн


 
Регистрация: 06.03.2004
г.Саратов
Сообщений: 72


Я первый раз так и сделал
Цитата:
Код:
[Выделить все]
Код: 

For Rw = Rs To Rs + 14 
          If Val(ActSh.Cells(Rw, 12).Text) = 0 Then 
                ActSh.Rows(Rw).Delete ' удалить строку 
          End If              
Next Sum
Но тогда после удаления строки Rs+I, макрос переходил на строку Rs+I+1 и строка следом за удаленной оставалась не проверенной.
:cry:
А может после Else и Then можно писать только одну строку кода? Потому что я записал:
Код:
[Выделить все]
For Sum = 1 To 15
    
            Mest = Val(ActSh.Cells(Rw, 11).Text) 
            If Mest = 0 Then
                ActSh.Rows(Rw).Delete                 
            Else
            Rw = Rw + 1
            Sum = Sum + 1
            End If
И всё работает также как и в предыдущем коде.
Денэн вне форума  
 
Непрочитано 24.08.2004, 15:07
#13
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Уй млинннн, сам уже запутался :cry: С конца же надо, чтоб не париться с корректировкой
For Rw = Rs + 14 To Rs Step -1
vk вне форума  
 
Непрочитано 30.03.2011, 10:19
#14
klinker


 
Регистрация: 02.09.2009
Сообщений: 82


Уважаемые коллеги, здравствуйте! Подскажите пожалуйста по данной теме. Вопрос следующий: Создана таблица, для проверки столбцов и строк оставляю первую строку и столец в которых будет отображаться сумма строки или столбца. Необходим макрос который пробежит сначала по первому столбцу, проверит ячейки и удалит строки со значением ноль, затем возратиться в начальную ячейку и пробежит по первой строке, проверит ячейки и удалит все столбцы со значением ноль! Очень нужно выручайте, работа горит, а просматривать все таблицы долго и ропоттливо! Заранее огромнейшее спасибо!!!!!!!!!!!
klinker вне форума  
 
Непрочитано 30.03.2011, 20:06
#15
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от klinker Посмотреть сообщение
Уважаемые коллеги, здравствуйте! Подскажите пожалуйста по данной теме. Вопрос следующий: Создана таблица, для проверки столбцов и строк оставляю первую строку и столец в которых будет отображаться сумма строки или столбца. Необходим макрос который пробежит сначала по первому столбцу, проверит ячейки и удалит строки со значением ноль, затем возратиться в начальную ячейку и пробежит по первой строке, проверит ячейки и удалит все столбцы со значением ноль! Очень нужно выручайте, работа горит, а просматривать все таблицы долго и ропоттливо! Заранее огромнейшее спасибо!!!!!!!!!!!
Типа того, ну не очень изячно есс-но ...

Код:
[Выделить все]
 Sub FixTable()
Dim findRange As Range
Dim currRange As Range
Dim rows As Long
  Application.Volatile
   Application.ScreenUpdating = False
   Application.Calculation = xlCalculationManual
   
    Set currRange = Range("K2:P13") ''<-- включая строку заголовков!

With currRange
 rows = .rows.Count
For i = rows To 2 Step -1

  On Error Resume Next
   Set findRange = .Cells(i, 1)

    If (IsNumeric(findRange) And Val(findRange) = 0) Then
      currRange.rows(i).Select
     Selection.Delete
     i = i - 1
    End If
   Next
  .Select
 End With
 
With Selection.Cells
 For i = Selection.Columns.Count To 2 Step -1
  Set findRange = .Range(Cells(1, i), Cells(.rows.Count, i)).Cells.find("0")
   If Not findRange Is Nothing Then
   .Range(Cells(1, i), Cells(Selection.rows.Count, i)).Select
   Selection.Clear
  End If
 Next
End With


   Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
    
End Sub
Олег (jr.) вне форума  
 
Непрочитано 31.03.2011, 09:23
#16
klinker


 
Регистрация: 02.09.2009
Сообщений: 82


Спасибо огромное! Но если макрос находит в верхней строке 10, 20, или 1000, тогда он тоже его удаляет! Можно ли как нибудь оговорить чтобы удалялся только столбец со значением ноль? Со строками ведь все впорядке! Все равно огромное спасибо за помощь и идею! Буду пробовать дальше............
klinker вне форума  
 
Непрочитано 31.03.2011, 23:24
#17
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от klinker Посмотреть сообщение
Спасибо огромное! Но если макрос находит в верхней строке 10, 20, или 1000, тогда он тоже его удаляет! Можно ли как нибудь оговорить чтобы удалялся только столбец со значением ноль? Со строками ведь все впорядке! Все равно огромное спасибо за помощь и идею! Буду пробовать дальше............
Да точно ..
Похоже в один заход это не получится
Попробуй каждую часть как отдельную процедуру,
только придется переопределять диапазон после первой части
заново
Олег (jr.) вне форума  
 
Непрочитано 04.04.2011, 12:49
#18
klinker


 
Регистрация: 02.09.2009
Сообщений: 82


Спасибо за все подсказки, разобрался!!!!!! Но возникла следующая запарка: Имеется столбец готовых значений. Например по вертикали 1,2,3,4,5,6,7,8,9. необходимо написать макрос, который бы после каждого значения создавал 8 пустых строк и копировал значение верхней ячейки в пустые ячейки. Итог должен быть по вертикали следующий: 1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5..........
Просто нужно обработать столбец в котором более 5 тысяч значений. А это вручную сделать не реально!!!!!!! Товарищи, коллеги, помогите с макросом!!!!!!!!!Заранее ОГРОМНОЕ спасибо!!!!!!!!!
klinker вне форума  
 
Непрочитано 04.04.2011, 17:10
#19
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от klinker Посмотреть сообщение
Спасибо за все подсказки, разобрался!!!!!! Но возникла следующая запарка: Имеется столбец готовых значений. Например по вертикали 1,2,3,4,5,6,7,8,9. необходимо написать макрос, который бы после каждого значения создавал 8 пустых строк и копировал значение верхней ячейки в пустые ячейки. Итог должен быть по вертикали следующий: 1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5..........
Просто нужно обработать столбец в котором более 5 тысяч значений. А это вручную сделать не реально!!!!!!! Товарищи, коллеги, помогите с макросом!!!!!!!!!Заранее ОГРОМНОЕ спасибо!!!!!!!!!
Прикрепи простой XLS файл с примером
в колонках укажи:
что имеешь и
что нужно получить
Олег (jr.) вне форума  
 
Непрочитано 04.04.2011, 17:31
#20
klinker


 
Регистрация: 02.09.2009
Сообщений: 82


Вот пример файла
Вложения
Тип файла: rar пример.rar (3.4 Кб, 98 просмотров)
klinker вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Макрос в Excell