Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Вставка неизменяемой даты - Мир MS Excel

  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_, DrMini  
Вставка неизменяемой даты
RamilRinatovich Дата: Четверг, 03.09.2015, 14:46 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007
Добрый всем день! Пару дней назад начал изучение 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]Код нужно класть не в спойлер, а в кнопочку #. Исправил


Сообщение отредактировал _Boroda_ - Четверг, 03.09.2015, 15:01
 
Ответить
СообщениеДобрый всем день! Пару дней назад начал изучение 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
Дата добавления - 03.09.2015 в 14:46
Roman777 Дата: Четверг, 03.09.2015, 15:01 | Сообщение № 2
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
RamilRinatovich, примерно так должно быть:
Извиняюсь сначало неверно выложил
[vba]
Код
If Range("A1") = True Then
Range("B1") = Format(Now, "short date")
Else: Range("B1") = " "
End If
[/vba]


Много чего не знаю!!!!

Сообщение отредактировал Roman777 - Четверг, 03.09.2015, 15:03
 
Ответить
СообщениеRamilRinatovich, примерно так должно быть:
Извиняюсь сначало неверно выложил
[vba]
Код
If Range("A1") = True Then
Range("B1") = Format(Now, "short date")
Else: Range("B1") = " "
End If
[/vba]

Автор - Roman777
Дата добавления - 03.09.2015 в 15:01
_Boroda_ Дата: Четверг, 03.09.2015, 15:09 | Сообщение № 3
Группа: Админы
Ранг: Местный житель
Сообщений: 17005
Репутация: 6667 ±
Замечаний: ±

2003; 2007; 2010; 2013 RUS
ИСТИНА в 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]
По-хорошему если, то там еще много чего дописать нужно, но пока так, чтобы Вас не путать.
Select держит и не отпускает эту ячейку

Просто вместо вот такого (например)
[vba]
Код
    Range("B5").Select
      Selection = 5
[/vba]сразу пишите
[vba]
Код
    Range("B5") = 5
[/vba]
еще
Range("B1") = " "
- это не пусто, а пробел. Пусто будет вот так: ""
К сообщению приложен файл: 7165726.xlsm (13.7 Kb)


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеИСТИНА в 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]
По-хорошему если, то там еще много чего дописать нужно, но пока так, чтобы Вас не путать.
Select держит и не отпускает эту ячейку

Просто вместо вот такого (например)
[vba]
Код
    Range("B5").Select
      Selection = 5
[/vba]сразу пишите
[vba]
Код
    Range("B5") = 5
[/vba]
еще
Range("B1") = " "
- это не пусто, а пробел. Пусто будет вот так: ""

Автор - _Boroda_
Дата добавления - 03.09.2015 в 15:09
RamilRinatovich Дата: Четверг, 03.09.2015, 16:46 | Сообщение № 4
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007
ИСТИНА в 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]


Сообщение отредактировал RamilRinatovich - Четверг, 03.09.2015, 16:48
 
Ответить
Сообщение
ИСТИНА в 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]

Автор - RamilRinatovich
Дата добавления - 03.09.2015 в 16:46
Udik Дата: Четверг, 03.09.2015, 17:47 | Сообщение № 5
Группа: Друзья
Ранг: Старожил
Сообщений: 1588
Репутация: 192 ±
Замечаний: 0% ±

Excel 2016 х 64
Так понял
[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

End Sub
[/vba]
К сообщению приложен файл: testA1.xlsm (14.4 Kb)


вот вам барабан
яд 41001231307558 wm R419131876897
udik1968@gmail.com
 
Ответить
СообщениеТак понял
[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

End Sub
[/vba]

Автор - Udik
Дата добавления - 03.09.2015 в 17:47
Udik Дата: Четверг, 03.09.2015, 17:53 | Сообщение № 6
Группа: Друзья
Ранг: Старожил
Сообщений: 1588
Репутация: 192 ±
Замечаний: 0% ±

Excel 2016 х 64
выходит ошибка compile error else without if

это потому, что после Then стоит Exit Sub, надо сей оператор на новую строку или : отделить


вот вам барабан
яд 41001231307558 wm R419131876897
udik1968@gmail.com


Сообщение отредактировал Udik - Четверг, 03.09.2015, 17:53
 
Ответить
Сообщение
выходит ошибка compile error else without if

это потому, что после Then стоит Exit Sub, надо сей оператор на новую строку или : отделить

Автор - Udik
Дата добавления - 03.09.2015 в 17:53
RamilRinatovich Дата: Четверг, 03.09.2015, 19:39 | Сообщение № 7
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007
Так понял


Большое человеческое спасибо, Udik! Это именно то, что мне и нужно было, выручили!
[moder]Не нужно цитировать пост целиком. Об этом есть в Правилах форума. Удалил лишнее


Сообщение отредактировал _Boroda_ - Четверг, 03.09.2015, 22:26
 
Ответить
Сообщение
Так понял


Большое человеческое спасибо, Udik! Это именно то, что мне и нужно было, выручили!
[moder]Не нужно цитировать пост целиком. Об этом есть в Правилах форума. Удалил лишнее

Автор - RamilRinatovich
Дата добавления - 03.09.2015 в 19:39
RamilRinatovich Дата: Пятница, 04.09.2015, 09:59 | Сообщение № 8
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007
Еще раз доброго дня, форумчане! Кому не сложно посмотрите пожалуйста, а в чем тут может быть проблема? Мне нужно (как я и говорил уже ранее) чтоб при изменении одной ячейки (на Листе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]


Сообщение отредактировал RamilRinatovich - Пятница, 04.09.2015, 09:59
 
Ответить
СообщениеЕще раз доброго дня, форумчане! Кому не сложно посмотрите пожалуйста, а в чем тут может быть проблема? Мне нужно (как я и говорил уже ранее) чтоб при изменении одной ячейки (на Листе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]

Автор - RamilRinatovich
Дата добавления - 04.09.2015 в 09:59
Roman777 Дата: Пятница, 04.09.2015, 12:22 | Сообщение № 9
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
RamilRinatovich,
Можно попробовать использовать не то событие, которое у Вас а:
[vba]
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

End Sub
[/vba]
И код этого события должен лежать в модуле листа.


Много чего не знаю!!!!
 
Ответить
СообщениеRamilRinatovich,
Можно попробовать использовать не то событие, которое у Вас а:
[vba]
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

End Sub
[/vba]
И код этого события должен лежать в модуле листа.

Автор - Roman777
Дата добавления - 04.09.2015 в 12:22
RamilRinatovich Дата: Пятница, 04.09.2015, 12:46 | Сообщение № 10
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007
Можно попробовать использовать не то событие, которое у Вас а:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

End Sub

Вроде попробовал, никакой реакции абсолютно. В модуле листа как вы и предложили создал sub с текстом call Worksheet_SelectionChange, если я вас правильно понял
[moder]Я предупреждал. Читайте Правила форума


Сообщение отредактировал _Boroda_ - Пятница, 04.09.2015, 13:15
 
Ответить
Сообщение
Можно попробовать использовать не то событие, которое у Вас а:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

End Sub

Вроде попробовал, никакой реакции абсолютно. В модуле листа как вы и предложили создал sub с текстом call Worksheet_SelectionChange, если я вас правильно понял
[moder]Я предупреждал. Читайте Правила форума

Автор - RamilRinatovich
Дата добавления - 04.09.2015 в 12:46
Roman777 Дата: Пятница, 04.09.2015, 13:01 | Сообщение № 11
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
RamilRinatovich,
[vba]
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

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


Много чего не знаю!!!!
 
Ответить
СообщениеRamilRinatovich,
[vba]
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

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

Автор - Roman777
Дата добавления - 04.09.2015 в 13:01
Udik Дата: Пятница, 04.09.2015, 14:43 | Сообщение № 12
Группа: Друзья
Ранг: Старожил
Сообщений: 1588
Репутация: 192 ±
Замечаний: 0% ±

Excel 2016 х 64
что указание листов тут никакую роль не играет

Так проверьте сначала по имени листа
[vba]
Код

If Sh.Name<>"Лист2" Then Exit Sub
[/vba]


вот вам барабан
яд 41001231307558 wm R419131876897
udik1968@gmail.com
 
Ответить
Сообщение
что указание листов тут никакую роль не играет

Так проверьте сначала по имени листа
[vba]
Код

If Sh.Name<>"Лист2" Then Exit Sub
[/vba]

Автор - Udik
Дата добавления - 04.09.2015 в 14:43
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2026 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!