Добрый всем день! Пару дней назад начал изучение VBA, поэтомупожалуйста не ругайтесь, если мой вопрос будет банален. Такая ситуация: имеется 2 ячейки: А1 и B1. В А1 - тип данных Булево, в B1 - Дата. Мне нужно сделать так, чтобы при установке значения Истина в ячейку A1, в ячейку B1 записывалась бы текущая дата и время. При этом при установке значения Ложь, ячейка B1 должна просто очищаться. Изначально я хотел сделать просто функцией ТДата, но не знал, что этой функцией дата вставляется динамически изменяемая. Мне такое не нужно. Нашел информацию, что можно добавлять текущую + неизменяемую дату в ячейку нажатием кнопок Ctrl+Shift+;. Поэтому решил написать макрос с использованием SendKeys. Но поскольку, я новичок - никак не получается додуматься как правильно написать в этом случае код и вообще как можно решить данный вопрос.
Написал такой код в модуле листа:
[vba]
Код
If Range("A1") = "Истина" Then Range("B1").Select SendKeys("^+;") Else Range("B1") = " " End If
[/vba]
Вроде как-будто что-то получается, но при этом Select держит и не отпускает эту ячейку. Знающие, подскажите пожалуйста как мне справиться с этим. [moder]Код нужно класть не в спойлер, а в кнопочку #. Исправил
Добрый всем день! Пару дней назад начал изучение VBA, поэтомупожалуйста не ругайтесь, если мой вопрос будет банален. Такая ситуация: имеется 2 ячейки: А1 и B1. В А1 - тип данных Булево, в B1 - Дата. Мне нужно сделать так, чтобы при установке значения Истина в ячейку A1, в ячейку B1 записывалась бы текущая дата и время. При этом при установке значения Ложь, ячейка B1 должна просто очищаться. Изначально я хотел сделать просто функцией ТДата, но не знал, что этой функцией дата вставляется динамически изменяемая. Мне такое не нужно. Нашел информацию, что можно добавлять текущую + неизменяемую дату в ячейку нажатием кнопок Ctrl+Shift+;. Поэтому решил написать макрос с использованием SendKeys. Но поскольку, я новичок - никак не получается додуматься как правильно написать в этом случае код и вообще как можно решить данный вопрос.
Написал такой код в модуле листа:
[vba]
Код
If Range("A1") = "Истина" Then Range("B1").Select SendKeys("^+;") Else Range("B1") = " " End If
[/vba]
Вроде как-будто что-то получается, но при этом Select держит и не отпускает эту ячейку. Знающие, подскажите пожалуйста как мне справиться с этим. [moder]Код нужно класть не в спойлер, а в кнопочку #. ИсправилRamilRinatovich
Сообщение отредактировал _Boroda_ - Четверг, 03.09.2015, 15:01
ИСТИНА в VBA - это True Поэтому на русскую "Истина" он реагировать не будет Предлагаю так [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)'при каждом изменении в ячейках листа If Range("B1") <> "" Then Exit Sub 'если в В1 уже что-то есть, то выходим из макроса If Range("A1") = True Then Range("B1") = Now End Sub
[/vba] По-хорошему если, то там еще много чего дописать нужно, но пока так, чтобы Вас не путать.
ИСТИНА в VBA - это True Поэтому на русскую "Истина" он реагировать не будет Предлагаю так [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)'при каждом изменении в ячейках листа If Range("B1") <> "" Then Exit Sub 'если в В1 уже что-то есть, то выходим из макроса If Range("A1") = True Then Range("B1") = Now End Sub
[/vba] По-хорошему если, то там еще много чего дописать нужно, но пока так, чтобы Вас не путать.
ИСТИНА в VBA - это True Поэтому на русскую "Истина" он реагировать не будет
Я понимаю. Извиняюсь, но кое-что в этом плане я не договорил, но не думал, что с этим может быть что-то связано. Говоря о ячейке с типом булево, имелось ввиду, что есть объект "Флажок", который возвращает своё значение в другую ячейку в виде ИСТИНА или ЛОЖЬ. Поэтому я так и указывал "Истина". Или вы это и имели ввиду и в этом случае VBA действительно меня не поймёт?
Private Sub Worksheet_Change(ByVal Target As Range)'при каждом изменении в ячейках листа If Range("B1") <> "" Then Exit Sub 'если в В1 уже что-то есть, то выходим из макроса If Range("A1") = True Then Range("B1") = Now End Sub
Так я попробовал, но, как вы и сказали "там еще много чего нужно дописать". В данном варианте текущая дата уже не изменяется каждую секундуь потому, что есть условие о выходе из макроса при наличии чего-либо в этой ячейке. До этого я сам не додумался, хотя и не знал такое Exit Sub. Я примерно на основе вfшего кода понял что мне нужно, но не могу это прописать: по моим мыслям это выглядело бы как-то так, т.е. условие в условии, но, судя по всему, так делать нельзя или можно, но как-то по-другому (выходит ошибка compile error else without if - к самой первой else): [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
If Range("B1") <> "" Then Exit Sub Else 'т.е. если ячейка B1 всё-таки пустая If Range("A1") = True Then 'должно проверяться новое условие того, что в ячейке А1 - значение True Range("B1") = Now 'Если значение true - значит записываем в B1 текущую дату Else: Range("B1") = "" 'Если что-либо другое, кроме True, то делаем ячейку b1 пустой End If End If End Sub
ИСТИНА в VBA - это True Поэтому на русскую "Истина" он реагировать не будет
Я понимаю. Извиняюсь, но кое-что в этом плане я не договорил, но не думал, что с этим может быть что-то связано. Говоря о ячейке с типом булево, имелось ввиду, что есть объект "Флажок", который возвращает своё значение в другую ячейку в виде ИСТИНА или ЛОЖЬ. Поэтому я так и указывал "Истина". Или вы это и имели ввиду и в этом случае VBA действительно меня не поймёт?
Private Sub Worksheet_Change(ByVal Target As Range)'при каждом изменении в ячейках листа If Range("B1") <> "" Then Exit Sub 'если в В1 уже что-то есть, то выходим из макроса If Range("A1") = True Then Range("B1") = Now End Sub
Так я попробовал, но, как вы и сказали "там еще много чего нужно дописать". В данном варианте текущая дата уже не изменяется каждую секундуь потому, что есть условие о выходе из макроса при наличии чего-либо в этой ячейке. До этого я сам не додумался, хотя и не знал такое Exit Sub. Я примерно на основе вfшего кода понял что мне нужно, но не могу это прописать: по моим мыслям это выглядело бы как-то так, т.е. условие в условии, но, судя по всему, так делать нельзя или можно, но как-то по-другому (выходит ошибка compile error else without if - к самой первой else): [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
If Range("B1") <> "" Then Exit Sub Else 'т.е. если ячейка B1 всё-таки пустая If Range("A1") = True Then 'должно проверяться новое условие того, что в ячейке А1 - значение True Range("B1") = Now 'Если значение true - значит записываем в B1 текущую дату Else: Range("B1") = "" 'Если что-либо другое, кроме True, то делаем ячейку b1 пустой End If End If End Sub
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> Cells(1, 1).Address Then Exit Sub If Target = True Then Cells(1, 2) = Now Else: If Target = False Then Cells(1, 2) = "" End If
End Sub
[/vba]
Так понял [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> Cells(1, 1).Address Then Exit Sub If Target = True Then Cells(1, 2) = Now Else: If Target = False Then Cells(1, 2) = "" End If
Большое человеческое спасибо, Udik! Это именно то, что мне и нужно было, выручили! [moder]Не нужно цитировать пост целиком. Об этом есть в Правилах форума. Удалил лишнее
Большое человеческое спасибо, Udik! Это именно то, что мне и нужно было, выручили! [moder]Не нужно цитировать пост целиком. Об этом есть в Правилах форума. Удалил лишнееRamilRinatovich
Сообщение отредактировал _Boroda_ - Четверг, 03.09.2015, 22:26
Еще раз доброго дня, форумчане! Кому не сложно посмотрите пожалуйста, а в чем тут может быть проблема? Мне нужно (как я и говорил уже ранее) чтоб при изменении одной ячейки (на Листе2), вставлялась дата в ячейку (на Листе2). Возникает несколько проблем. Во-первых проблема, в том, что указание листов тут никакую роль не играет. Получается, что при изменении данной ячейки на любом из листов влечет за собой изменения (т.е. вставку даты) в нужную нам ячейку. По-моему, это из-за того, что я модуль всей книги использую. Хотя, если использовав модуль листа, таким же образом ссылка в коде на другой лист не работала вообще. Во-вторых, проблема в том, что если я всё это даже делаю на одном листе, то Дата в упор не вставляется, если значение было возвращено в ячейку как формулой, так и флажком, как в моем случае (т.е.автоматически). Если в неё руками вбить истина или ложь, то работает. Если делаю всё то же самое, нажимая флажок и и меняя таким образом значения Истина/Ложь, то ничего не происходит... [vba]
Код
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Target.Address <> Worksheets("Лист2").Cells(3, 1).Address Then Exit Sub If Target = True Then Sheets("Лист1").Cells(3, 6) = Now Else: If Target = False Then Sheets("Лист1").Cells(3, 6) = "" End If
End Sub
[/vba]
Еще раз доброго дня, форумчане! Кому не сложно посмотрите пожалуйста, а в чем тут может быть проблема? Мне нужно (как я и говорил уже ранее) чтоб при изменении одной ячейки (на Листе2), вставлялась дата в ячейку (на Листе2). Возникает несколько проблем. Во-первых проблема, в том, что указание листов тут никакую роль не играет. Получается, что при изменении данной ячейки на любом из листов влечет за собой изменения (т.е. вставку даты) в нужную нам ячейку. По-моему, это из-за того, что я модуль всей книги использую. Хотя, если использовав модуль листа, таким же образом ссылка в коде на другой лист не работала вообще. Во-вторых, проблема в том, что если я всё это даже делаю на одном листе, то Дата в упор не вставляется, если значение было возвращено в ячейку как формулой, так и флажком, как в моем случае (т.е.автоматически). Если в неё руками вбить истина или ложь, то работает. Если делаю всё то же самое, нажимая флажок и и меняя таким образом значения Истина/Ложь, то ничего не происходит... [vba]
Код
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Target.Address <> Worksheets("Лист2").Cells(3, 1).Address Then Exit Sub If Target = True Then Sheets("Лист1").Cells(3, 6) = Now Else: If Target = False Then Sheets("Лист1").Cells(3, 6) = "" End If
Можно попробовать использовать не то событие, которое у Вас а:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
End Sub
Вроде попробовал, никакой реакции абсолютно. В модуле листа как вы и предложили создал sub с текстом call Worksheet_SelectionChange, если я вас правильно понял [moder]Я предупреждал. Читайте Правила форума
Можно попробовать использовать не то событие, которое у Вас а:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
End Sub
Вроде попробовал, никакой реакции абсолютно. В модуле листа как вы и предложили создал sub с текстом call Worksheet_SelectionChange, если я вас правильно понял [moder]Я предупреждал. Читайте Правила форумаRamilRinatovich
Сообщение отредактировал _Boroda_ - Пятница, 04.09.2015, 13:15