Страницы: 1
RSS
Помогите с макросом "Активная ячейка". Нужно чтоб запускался при вводе данных.
 
Добрый день, хотелось бы написать макрос, который реагирует на изменение данных в ячейке, то есть если в одном листе excel-евского файла в какой-то ячейке ввести число например 543 то макрос переходит не визуально, а в памяти, на другой лист файла, а там таблица из нескольких столбцов с числами, так вот макрос находит в определенном солбце это (543) число, далее сравнивает рядом с ним стоящее в одной строке число с нулем, если оно меньше нуля то макрос возвращает в ту ячейку куда вводили число 543 значение того отрицательного числа которое стоит рядом в одной строке с числом 543. Ну а если число которое стоит в таблице рядом с 543 больше нуля то макрос ни чего не делает, а оператор вводит данные в другую ячейку. Ну в общем-то как сравнивать числа и выводить число в какую-то ячейку с этим я сам справлюсь, а вот как написать чтобы макрос начинал работу после введения данных в ячейку - вот это я не знаю. Кто знает подскажите пожалуйста?  
Привожу примерый макрос НО без начала  
 
  Sub сравнение()  
'  
' сравнение Макрос  
' Макрос записан 13.02.2010 (ккк)  
'  
' Сочетание клавиш: Ctrl+s  
'  
Dim a As Integer ' - это номер строки в таблице где происходит сравнение  
Dim n As Integer ' - это переменная которой присваивается значение числа после того как его ввели  
Dim x As Integer ' - это номер строки на которой находиться ячейка в которую вводиться число  
Dim y As Integer ' - это номер столбца в котором находиться ячейка в которую вводиться число  
     
a = 1 'задается номер строки с которой начинаем  
     
'       ВОТ ТУТ КАК РАЗ В МЕСТО ЭТИХ ТРЕХ СТРОЧЕК И ДОЛЖНА ПО ИДЕЕ БЫТЬ КОМАНДА  
'              КОТОРАЯ ЗАПУСКАЕТ МАКРОС ПОСЛЕ ВВОДА ЧИСЛА В ЯЧЕЙКУ
 
'    Range("B2").Select    
'    ActiveCell.FormulaR1C1 = "543"  
'    n = введенному в ячейку числу  
 
 
 x = 2 ' для того чтобы макрос хоть как то работал задаем умышленно фиксированное значение  
 y = 2 ' для того чтобы макрос хоть как то работал задаем умышленно фиксированное значение  
 n = Sheets("лист-данные").Cells(x, y) 'присваиваем переменной n значение введенного в ячейку числа  
2           If n = Sheets("лист-таблица").Cells(a, 1) Then GoTo 1 ' находим такое же число как оператор вводил но уже в эталонной таблице  
   a = a + 1  
   If a <= 50 Then GoTo 2  
1      If Sheets("лист-таблица").Cells(a, 2) > 0 Then GoTo 3 ' Число найдено, а сдесь выясняем отрицательное ли число которое стоит рядом в эталонной таблице  
 
 Sheets("лист-данные").Cells(x, y) = Sheets("лист-таблица").Cells(a, 2) 'присваивается здачение отрицательного числа ячейке в которую изначально был ввод  
 Sheets("лист-данные").Select 'ну тут ниже меняетс цвет шриф для яркости  
   Cells(x, y).Select    
    Selection.Font.ColorIndex = 3  
     Selection.Font.Bold = True  
     With Selection.Font  
         .Name = "Arial Cyr"  
         .Size = 12  
         .Strikethrough = False  
         .Superscript = False  
         .Subscript = False  
         .OutlineFont = False  
         .Shadow = False  
         .Underline = xlUnderlineStyleNone  
         .ColorIndex = 3  
     End With  
     pause (20 = cek) ' то же не знаю как писать паузу в работе, а она нужна чтобы оператор увидел результат  
4       r = r + 1  
   If r < 50000000 Then GoTo 4 ' пришлось вместо паузы вот такой ерундой заниматься  
 Selection.ClearContents 'очистка ячейки куда был ввод  
 Selection.Font.ColorIndex = 1  
 
3     End Sub  
 
Естественно макрос до коца не проработан, да это не главное сейча для меня, проработаю, мне важно начало его написать.
 
Пока писал пример Дмитрий опередил. Повторяться не буду, смотри пример
 
{quote}{login=VovaK}{date=13.02.2010 11:45}{thema=}{post}Пока писал пример Дмитрий опередил. Повторяться не буду, смотри пример{/post}{/quote}  
 
Благодарю за отзыв, но я в силу своей не опытности не смогу разобраться в Вашем макросе, чтобы доработать его под свои задачи, а грузить Вас ими я не считаю этичным, может Вы сможете изменить мой макрос так чтобы он при вводе числа в ячейку дальше работал? Спасибо.  
 
Sub MyMacro()  
'  
' MyMacro Макрос  
' Макрос записан 13.02.2010 (ккк)  
'  
'Sub сравнение()  
'  
' сравнение Макрос  
' Макрос записан 13.02.2010 (ккк)  
'  
' Сочетание клавиш: Ctrl+s  
'  
Dim a As Integer ' a - это номер строки в таблице где происходит сравнение  
Dim n As Integer 'n - это переменная которой присваивается значение числа после того как его ввели  
Dim m As Integer  
Dim l As Integer  
   a = 1  
Application.EnableEvents = False  
'    Range("B2").Select  
'    ActiveCell.FormulaR1C1 = "543"  
'    n = введенномучислу  
x = 2  
y = 2  
n = Sheets("лист-данные").Cells(x, y) '  
2        If n = Sheets("лист-таблица").Cells(a, 1) Then GoTo 1  
   a = a + 1  
   If a <= 50 Then GoTo 2  
1   If Sheets("лист-таблица").Cells(a, 2) > 0 Then GoTo 3  
 
Sheets("лист-данные").Cells(x, y) = Sheets("лист-таблица").Cells(a, 2)  
Sheets("лист-данные").Select  
 Cells(x, y).Select  
  Selection.Font.ColorIndex = 3  
   Selection.Font.Bold = True  
   With Selection.Font  
       .Name = "Arial Cyr"  
       .Size = 12  
       .Strikethrough = False  
       .Superscript = False  
       .Subscript = False  
       .OutlineFont = False  
       .Shadow = False  
       .Underline = xlUnderlineStyleNone  
       .ColorIndex = 3  
   End With  
   'pause (20 = cek) ' то же не знаю как писать паузу в работе, а она нужна чтобы оператор увидел результат  
4    r = r + 1  
   If r < 50000000 Then GoTo 4  
Selection.ClearContents  
Selection.Font.ColorIndex = 1  
Application.EnableEvents = True  
 
3  
 
End Sub  
 
 
Я понимаю что сделан он топорно, но мне так понятно, мне главное чтобы он пошел, а дальше я напишу сам. А про паузу не знаете как сделать?
 
{quote}{login=The_Prist}{date=13.02.2010 11:42}{thema=}{post}

Используйте событийные процедуры листа - Worksheet_SelectionChange()

Если не знаете что это такое - <EM>http://excel-vba.ru/Tips_What_Module.html</EM>

Все описанное Вами укладывается в пять строк макроса. Только неясно, что делать, если введенного в ячейку значения нет на другом листе?

{/post}{/quote}  
 
Спасибо за отзыв, по ссылке прошел, мало что понял, новичек я еще, пишу по кальке, пока так. Но в любом случае я рад советам, если чесно не ожидал что так быстро кто-то ответит. еще раз спасибо, очень хотелось бы надеяться на дальнейшую помошь.
 
пример приложите с этим макросом, вычитывать его с листа никто не будет
 
{quote}{login=Dophin}{date=13.02.2010 01:19}{thema=}{post}пример приложите с этим макросом, вычитывать его с листа никто не будет{/post}{/quote}  
 
Вот мой макрос я его до минимума упростил:  
Sub MyMacro()  
' MyMacro Макрос  
' Макрос записан 13.02.2010 (ккк)  
' Сочетание клавиш: Ctrl+s  
Dim a As Integer ' a - это номер строки в таблице где происходит сравнение  
Dim n As Integer 'n - это переменная которой присваивается значение числа после того как его ввели  
Dim x As Integer  
Dim y As Integer  
Application.EnableEvents = False  
  a = 1  
  x = 2  
  y = 2  
  n = Sheets("лист-данные").Cells(x, y) '  
2        If n = Sheets("лист-таблица").Cells(a, 1) Then GoTo 1  
   a = a + 1  
   If a <= 50 Then GoTo 2  
1   If Sheets("лист-таблица").Cells(a, 2) > 0 Then GoTo 3  
  Sheets("лист-данные").Cells(x, y) = Sheets("лист-таблица").Cells(a, 2)  
  Application.EnableEvents = True  
3  
  End Sub  
 
А вот пример работающего макроса:  
 
Private Sub Worksheet_Change(ByVal Target As Range)  
Dim rng As Range  
Application.EnableEvents = False  
If Not Intersect(Target, Range("E:E")) Is Nothing Then  
On Error Resume Next  
 Set rng = ThisWorkbook.Sheets(2).UsedRange.Find(Target)  
 Target.Value = rng.Offset(0, 1).Value  
End If  
Application.EnableEvents = True  
End Sub  
 
Так вот хотелось бы из примера добавить что-то в мой макрос чтобы он тоже ожил.  
(у меня в файле в лист-таблица с числами столбец А и В)
 
Вас просят ПРИМЕР, т.е. ФАЙЛ. А Вы опять показываете свой код. Теперь просьба понятна?
 
Парни, Вы меня прям продвинули. :) Вобщем вот что на данный момент получилось, но пока данные можно заносить только в одной ячейке, а это проблема, вот пытаюсь ее решить пока безуспешно. И функцию пауза не найду как делать. Прикладываю последний вариант файла.
 
Давайте дальше: ввели в ячейку В5 число 521, например. Что должно произойти?
 
Если я правильно понял задачу, то:  
1. Удалите  в модуле листа "лист-данные" весь код;  
2. Вставьте нижеприведённый код в модуль листа "лист-данные".  
===  
Private Sub Worksheet_Change(ByVal Target As Range)  
Dim Rng As Range  
  If Target.Cells.Count > 1 Then Exit Sub  
  If Not Intersect(Target, Range("A1:F10")) Is Nothing Then  
     Set Rng = Sheets("Лист-таблица").Columns(1).Find(what:=Target, LookIn:=xlFormulas, lookAt:=xlWhole)  
        If Not Rng Is Nothing Then  
           If Rng.Offset(0, 1) < 0 Then  
              Application.EnableEvents = False  
              Target = Rng.Offset(0, 1)  
              Application.EnableEvents = True  
           End If  
        End If  
  End If  
End Sub  
P.S. Макрос в общем модуле можно удалить. Для решения поставленной задачи нужен только этот код.
 
Файл с небольшими комментариями к коду.
 
{quote}{login=Юрий М}{date=14.02.2010 12:12}{thema=}{post}Файл с небольшими комментариями к коду.{/post}{/quote}  
Юрий, спасибо огромное за коментарии к коду, пока трудно мне понять правильный и лаконичный стиль написания макросов, я все еще топорно используя приметивные команды, знаю об этом, но мне пока так удобнее, естественно Вы все достаточно сильно побудили меня к развитию, но пока хочу доделать именно мой макрос, ибо будет необходимость его постоянно корректировать, может все таки подскажете что мне там нужно дописать? залее задача такая чтобы можно было данные вводить не только в ячейке (2,2) но и в других, если можно, подскажите пожалуйста как присвоить переменной n, введенное число (значение активной ячейки) и как еще присвоить переменным x и y знчания номера строки и номера столбца активной ячейки? Уф!!! заранее благодарен.
 
В общий модуль, перед Sub нужно добавить объявление трёх глобальных переменных (это нужно для того, чтобы они были доступны из любого модуля). Но в данном случае Вам, скорее всего, нужно отталкиваться не от активной ячейки, а от Target - ячейки, в которой произошли изменения. Перед первой строкой макроса добавьте три таких:  
Public n  
Public x As Long  
Public y As Long  
Sub...  
В модуле листа, после строки If Not Intersect... пишем:  
x = Target.Row 'номер строки  
y = Target.Column 'номер столбца
 
И ещё: макрос будет срабатывать не только в ячейке(2, 2), а во всём диапазоне, который у Вас указан. В данном случае это ("A1:F10")
 
Забыл: добавьте:  
n = Target.Value
 
Затыкаеться как раз на строчке  
n = Target.Value  
видимо мой макрос не знает что такое Target , а как ему обозначить что это такое не знаю я... Сори.
 
svat, абсолютно пропадает желание помогать Вам: я пишу:  
"В модуле листа, после строки If Not Intersect... пишем:  
x = Target.Row 'номер строки  
y = Target.Column 'номер столбца..."  
А Вы куда вставляете? В какой модуль. Ну вот для кого я писал про модуль листа?
 
{quote}{login=Юрий М}{date=14.02.2010 02:25}{thema=}{post}svat, абсолютно пропадает желание помогать Вам: я пишу:  
"В модуле листа, после строки If Not Intersect... пишем:  
x = Target.Row 'номер строки  
y = Target.Column 'номер столбца..."  
А Вы куда вставляете? В какой модуль. Ну вот для кого я писал про модуль листа?{/post}{/quote}  
Юрий, я вставил в Ваш макрос как Вы рекомендуете, как-то странно работает, а почему он так работает я не совсем понимаю, F8 кнопка не работает чтобы по шагово отследить. Я операторы которые Вы применяете не знаю, а значит не могу исправлять макрос как мне нужно.
 
Помогите пожалуйста доработать именно мой макрос, ибо только в нем я могу что-то исправлять. В модуле листа "лист-данные" сейчас стоит код который запускает основной макрос, это работает. А в основном макросе не могу присвоить значениям переменных n, x, и y нужные мне значения. В этом сейчас проблема у меня. Хотелось бы чтобы не было мног новых операторов, а то я опять застопорюсь. Отнеситесь пожалуйста с пониманием к моей не опытности.  
 
P.S. готов перейти на разумную комерческую основу решение моей проблемы. мой телефон +79506232353 на него нужно послать  смс со словом "привет" и сумму которую хотите за ответ на вопрос, я увижу Ваш номер и смогу его пополнить.
 
Странное желание усложнить себе жизнь. Ведь всё гораздо проще решается. Впрочем, раз Вам так удобнее...  
1. Обратите внимание на код в модуле листа: Вы сначала вызывает макрос "MyMacro", а значения переменным, которые в нём используются, ещё не присвоены. Конечно, это вызовет ошибку. Исправил.  
2. Зачем Вы 5 000 000 раз (пять миллионов!) раз обращаетесь к переменной r? Это Вы так паузу делаете? Попробуйте вместо этого вставить такую строку:  
Application.Wait Time:=Now + TimeSerial(0, 0, 20) - приостановка на 20 секунд.
 
{quote}{login=svat}{date=14.02.2010 11:15}{thema=}{post} А в основном макросе не могу присвоить значениям переменных n, x, и y нужные мне значения. В{/post}{/quote}  
И не сможете - это нужно делать в коде модуля листа.
 
Ну вот, вроде бы все работает, но в одной ситуации идет сбой: если в любой ячейки не вводить число а просто нажать кнопку delete то после этого не работает макрос.
 
В модуле листа после строки n = Target.Value добавьте строку:  
If IsEmpty(n) Then Exit Sub
 
Юрий, все вроде бы работает, осталось доработать по мелочам.    
Вот например:  
   Dim rng As Range: Set rng = [B3:B500] ' [G3:G500] 'диапазон Вашей таблицы; G3:G500
 
Пытаюсь я сделать так чтобы макрос работал только в столбцах B, G, L, Q, V, AA, AF, AK, AP и т.д. по формуле b=b+4 (где b -намер столбца начиная со 2-го)  
Как можно обозначить выборочно зону действия макроса?  
 
Юрий, второй вопрос, я хочу Вас отблагодорить, как это можно сделать? Мне бы удобнее было пополнить номер Вашего телефона.
 
по поводу диапазона создал отдельную тему, думаю она будет интересна не только мне. По этому актуален только второй вопрос.
Страницы: 1
Читают тему
Наверх