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

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

Макрос в Excell

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

Подскажите пожалуйста, кто знает, как написать макрос в Excell, при выполнении которого, будет проверяться равенство нулю содержимое определённой ячейки строки. И если это равенство выполняется - строка удаляется.
Просмотров: 13403
 
Непрочитано 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ä
Сообщений: 813


Цитата:
Сообщение от 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ä
Сообщений: 813


Цитата:
Сообщение от 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ä
Сообщений: 813


Цитата:
Сообщение от 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 Кб, 97 просмотров)
klinker вне форума  
 
Непрочитано 04.04.2011, 20:44
#21
Олег (jr.)

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


Ничего лучше не придумал, удали лишнее
Код:
[Выделить все]
Option Explicit

Sub demo()

Application.ScreenUpdating = False
Dim findRange As Range
Set findRange = Cells.Range("D4:D1000").Cells.SpecialCells(xlCellTypeLastCell).End(xlUp)
Dim copyRange As Range
Dim i, j, k, ins, stp, m
Dim data
k = 1: ins = 9 ''<-- number of rows to insert + 1
stp = 0

Dim numRows As Long
numRows = findRange.row
Cells.Range("D4").Select ''<-- first cell in row (check address!)
Dim col As Long, row As Long
col = ActiveCell.Column
row = ActiveCell.row
data = ActiveCell.CurrentRegion.Value2

For k = 1 To UBound(data, 1)
  m = ins + 1
    For j = 1 To m
    Cells.Range(Cells(row + j + stp - 1, col), Cells(row + j + stp - 1, col)).FormulaR1C1 = CStr(data(k, 1))
    Debug.Print data(k, 1)
Next
stp = stp + ins
Next

Application.ScreenUpdating = True

End Sub
И кстати предыдущее решение мог бы и показать, я с Экселем почти не работаю
а кому другому может было бы интересно
Олег (jr.) вне форума  
 
Непрочитано 05.04.2011, 09:48
#22
klinker


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


Спасибо, вот еще один вариант макроса, посоветовали на другом форуме. Спасибо за уделенное время, рад был пообщаться!!!!!!!!!!!!
Sub Task()
'Исходные данные в столбце А
vArr = Range([A1], Cells(Rows.Count, "A").End(xlUp))
For Each oObj In vArr
For j = 1 To 8
i = i + 1
Cells(i, 1) = oObj
Next
Next
End Sub
klinker вне форума  
 
Непрочитано 05.04.2011, 10:28
#23
squicko

дома строю
 
Регистрация: 09.01.2009
Самара
Сообщений: 47


Здравствуйте многоуважаемые!
Еще вопрос по теме: нужно при условия выполнения условия в заданной ячейке (ячейка с формулой) скрыть определенные строки. Получилось сделать только если я сам ввожу данные в ячейку.

Код:
[Выделить все]
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address(0, 0) = "K6" Then
    If Target.Value = "УСЛОВИЕ" Then
            With Sheets("Лист2")
                Sheets("Лист2").Rows("24:24").Hidden = True
                Sheets("Лист2").Rows("32:32").Hidden = True
            End With
    Else
            With Sheets("Лист2")
                Sheets("Лист2").Rows("24:24").Hidden = False
                Sheets("Лист2").Rows("32:32").Hidden = False
                Sheets("Лист2").Rows("24:24").AutoFit
                Sheets("Лист2").Rows("32:32").AutoFit
            End With
    End If
End If
End Sub
Красным выделено условие, хотелось бы чтобы это было вычисляемое значение, а не рукописное.

Последний раз редактировалось squicko, 05.04.2011 в 16:44.
squicko вне форума  
 
Непрочитано 05.04.2011, 13:22
#24
Олег (jr.)

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


Цитата:
Сообщение от klinker Посмотреть сообщение
Спасибо, вот еще один вариант макроса, посоветовали на другом форуме. Спасибо за уделенное время, рад был пообщаться!!!!!!!!!!!!
Sub Task()
'Исходные данные в столбце А
vArr = Range([A1], Cells(Rows.Count, "A").End(xlUp))
For Each oObj In vArr
For j = 1 To 8
i = i + 1
Cells(i, 1) = oObj
Next
Next
End Sub
Блин...., я совсем забыл про For Each
Успехов
Олег (jr.) вне форума  
 
Непрочитано 05.04.2011, 23:05
#25
Petrov-Vodkin


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


Почитал я тему вашу в пол глаза и созрел резонный вопрос:
А почему вы не используете Фильтр? (ctrl+shift+L)
Petrov-Vodkin вне форума  
 
Непрочитано 19.04.2011, 23:43
#26
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844


Тема почищена.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.04.2011, 14:26
#27
klinker


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


Всем привет! Помогите создать следующие макросы. Нужны маросы предвижения по таблице. Таблица заполняется из пользовательской формы. Создаю кнопки на стоку вверх, на строку вниз и кнопка подтвердить ввод данных. Этим кнопкам нужно назначить соответствующие макросы, но как их написать увы не знаю! Тварищи, программисты, подскажите какие комманды нужно назначить кнопкам? Напишите пожалуйста! Очень нужно!!!!!!!!!!
P.S. Кнопка подтверждения ввода аналог кнопки Enter
klinker вне форума  
 
Непрочитано 29.04.2011, 09:14
#28
klinker


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


Всем привет! Снова нужна помощь!!! Очень нужно создать форму для защиты файла excell. идея следующая: необходимо чтобы при запуске Excell выскакивало окошко в которое необходимо ввести имя пользователя, пароль. Макрос должен проверить пароль, если пароль не верный нужно, чтобы удалялся лист, к примеру "лист 1". Проблема в том, что я не знаю как создать и вызвать подобную форму и описать все операции на языке VBA! Если кто может или есть аналоги, выручайте!
klinker вне форума  
 
Непрочитано 30.04.2011, 00:42
#29
Petrov-Vodkin


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


Странные какие-то вещи ты в экселе сделать всё время пытаешься...
Лист удалять собрался, зачем? Чем не устраивает обычный пароль на книгу/лист?
Есть такая штука, "постановка задачи" называется. Если ей не овладеешь - ответов на твой вопрос будет столько же, сколько и на пост #27 .
Petrov-Vodkin вне форума  
 
Непрочитано 30.04.2011, 22:30
#30
KronSerg

Вода - моя работа
 
Регистрация: 10.11.2009
Санкт-Петербург
Сообщений: 3,639


На удаление листа в любом случае будет задан вопрос, сам попробуй, напиши строчку Sheets(1).Delete
По поводу поста 27, согласен с Petrov-Vodkin, что нужно не понятно.
__________________
Нерешаемых проблем не бывает.
KronSerg вне форума  
 
Непрочитано 30.04.2011, 23:46
#31
squicko

дома строю
 
Регистрация: 09.01.2009
Самара
Сообщений: 47


Помогите с вопросом в посте #23
squicko вне форума  
 
Непрочитано 01.05.2011, 08:21
#32
KronSerg

Вода - моя работа
 
Регистрация: 10.11.2009
Санкт-Петербург
Сообщений: 3,639


Попробуй так:
Код:
[Выделить все]
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim goal As Range
Set goal = Range("K6")
If goal = 6 Then
With Sheets("Лист2")
                Sheets("Лист2").Rows("24:24").Hidden = True
                Sheets("Лист2").Rows("32:32").Hidden = True
            End With
    Else
            With Sheets("Лист2")
                Sheets("Лист2").Rows("24:24").Hidden = False
                Sheets("Лист2").Rows("32:32").Hidden = False
                Sheets("Лист2").Rows("24:24").AutoFit
                Sheets("Лист2").Rows("32:32").AutoFit
            End With
    End If
End Sub
Запускается при любых изменениях на листе, если нужно отслеживать изменения инициированные с другого листа, то нужно писать отдельный макрос в нужные листы, либо писать макрос проверяющий нужную ячейку каждые 1000мс к примеру, это если изменения возможны из-за пределов книги.
__________________
Нерешаемых проблем не бывает.
KronSerg вне форума  
 
Непрочитано 03.05.2011, 17:41
#33
squicko

дома строю
 
Регистрация: 09.01.2009
Самара
Сообщений: 47


Немного не то. Интересует что то вроде:
для примера
формула в ячейке "K6": "=Лист2!A1+Лист3!A2"
(А1=2, А2=2)

Результат в ячеке имеем:цифру "3".
Так вот мне нужно чтобы в макросе проверялось условие равенства именно с "3", а не с формулой "=Лист2!A1+Лист3!A2"
Код:
[Выделить все]
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address(0, 0) = "K6" Then
    If Target.Value = "3" Then
            With Sheets("Лист2")
                Sheets("Лист2").Rows("24:24").Hidden = True
                Sheets("Лист2").Rows("32:32").Hidden = True
            End With
    Else
            With Sheets("Лист2")
                Sheets("Лист2").Rows("24:24").Hidden = False
                Sheets("Лист2").Rows("32:32").Hidden = False
                Sheets("Лист2").Rows("24:24").AutoFit
                Sheets("Лист2").Rows("32:32").AutoFit
            End With
    End If
End If
End Sub
Может быть я ставлю не тот оператор "Target.Value"?
squicko вне форума  
 
Непрочитано 03.05.2011, 22:34
#34
KronSerg

Вода - моя работа
 
Регистрация: 10.11.2009
Санкт-Петербург
Сообщений: 3,639


Этот макрос может сработать только в том листе в котором написан, вставь его в каждый лист изменив адрес целевой ячейки на полный (с указанием листа), если на ячейку возможно влияние из другой книги, нужно писать макрос периодически проверяющий значение ячейки.
__________________
Нерешаемых проблем не бывает.
KronSerg вне форума  
 
Непрочитано 03.05.2011, 23:16
#35
squicko

дома строю
 
Регистрация: 09.01.2009
Самара
Сообщений: 47


Не получается((
Код:
[Выделить все]
 Dim goal As Range
Set goal = Range("K6")
If goal = 6 Then
Как работает эта функция?
squicko вне форума  
 
Непрочитано 03.05.2011, 23:40
#36
KronSerg

Вода - моя работа
 
Регистрация: 10.11.2009
Санкт-Петербург
Сообщений: 3,639


Тут нет функции, есть переменная типа Range, можно в справке почитать
Такой код в каждый лист вставляй:
Код:
[Выделить все]
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim goal As Range
Set goal = Sheets(2).Range("K6")
If goal = 6 Then
With Sheets("Лист2")
                Sheets("Лист2").Rows("24:24").Hidden = True
                Sheets("Лист2").Rows("32:32").Hidden = True
            End With
    Else
            With Sheets("Лист2")
                Sheets("Лист2").Rows("24:24").Hidden = False
                Sheets("Лист2").Rows("32:32").Hidden = False
                Sheets("Лист2").Rows("24:24").AutoFit
                Sheets("Лист2").Rows("32:32").AutoFit
            End With
    End If
End Sub
__________________
Нерешаемых проблем не бывает.
KronSerg вне форума  
 
Непрочитано 03.05.2011, 23:58
#37
squicko

дома строю
 
Регистрация: 09.01.2009
Самара
Сообщений: 47


Спасибо разобрался, работает!!!

Меня смутило "goal", я правильно понимаю, что это константа, которой присваивается значение переменной диапазона range?

Последний раз редактировалось squicko, 04.05.2011 в 00:22.
squicko вне форума  
 
Непрочитано 04.05.2011, 07:11
#38
KronSerg

Вода - моя работа
 
Регистрация: 10.11.2009
Санкт-Петербург
Сообщений: 3,639


Dim goal As Range - объявление переменной типа Range, которую я назвал "goal"
Set goal = Sheets(2).Range("K6") - присвоение значения переменной.
If goal = 6 Then - проверка значения ячейки, ссылку на которую дали выше.
Все три строчки можно заменить на
Цитата:
If Sheets(2).Range("K6")=6 Then
если в коде не планируется менять диапазон или повторного его использовать.
__________________
Нерешаемых проблем не бывает.
KronSerg вне форума  
 
Непрочитано 04.05.2011, 08:53
#39
squicko

дома строю
 
Регистрация: 09.01.2009
Самара
Сообщений: 47


Спасибо за разъяснение! Втыкнулся))
squicko вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Макрос в Excell

Размещение рекламы