Каким образом написать в VBA (Excel 2003) аналог примечания? Есть ячейка с текстом, по активации (двойному клику на неё) с новой строки должно добавляться имя пользователя и текущая дата\время. Нечто вроде системы логирования, кто и когда добавил новый комментарий.
Сам я, что называется, ненастоящий сварщик, поэтому при помощи гугла смог сделать вот такое:
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) 'включаем макрос If Not Intersect(Target, Range("K1:K1000")) Is Nothing Then 'делаем так, чтобы он работал только в диапазоне ячеек K1-K1000 With Target(1, 1) 'указываем, с какой ячейкой работать в данный момент .Value = .Value & vbLf & Now & " " & Application.UserName & ": " 'добавляем к активированной ячейке её же данные + перенос на новую строку + точное время\дату + пробел + имя пользователя + двоеточие и пробел (т.е. получается нечто вроде "16.10.2014 16:56:54 А. Иванов: ") End With End If End Sub
[/vba]
Вот только проблема - всё это дело вставляется не по клику (я так понимаю, где-то должен стоять On.Click или что-то вроде того), а уже после того как я вношу какие-то данные и убираю фокус с ячейки, а также после изменения ячейки все эти строки начинают добавляться без остановки, пока принудительно не нажмешь Esc. Почему и как это предотвратить, останавливая макрос после первого же выполнения - не понятно...
Можете помочь допилить скрипт?
Приветствую.
Каким образом написать в VBA (Excel 2003) аналог примечания? Есть ячейка с текстом, по активации (двойному клику на неё) с новой строки должно добавляться имя пользователя и текущая дата\время. Нечто вроде системы логирования, кто и когда добавил новый комментарий.
Сам я, что называется, ненастоящий сварщик, поэтому при помощи гугла смог сделать вот такое:
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) 'включаем макрос If Not Intersect(Target, Range("K1:K1000")) Is Nothing Then 'делаем так, чтобы он работал только в диапазоне ячеек K1-K1000 With Target(1, 1) 'указываем, с какой ячейкой работать в данный момент .Value = .Value & vbLf & Now & " " & Application.UserName & ": " 'добавляем к активированной ячейке её же данные + перенос на новую строку + точное время\дату + пробел + имя пользователя + двоеточие и пробел (т.е. получается нечто вроде "16.10.2014 16:56:54 А. Иванов: ") End With End If End Sub
[/vba]
Вот только проблема - всё это дело вставляется не по клику (я так понимаю, где-то должен стоять On.Click или что-то вроде того), а уже после того как я вношу какие-то данные и убираю фокус с ячейки, а также после изменения ячейки все эти строки начинают добавляться без остановки, пока принудительно не нажмешь Esc. Почему и как это предотвратить, останавливая макрос после первого же выполнения - не понятно...
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Not Intersect(Target, Range("K1:K1000")) Is Nothing Then 'делаем так, чтобы он работал только в диапазоне ячеек K1-K1000 With Target(1, 1) 'указываем, с какой ячейкой работать в данный момент .Value = .Value & vbLf & Now & " " & Application.UserName & ": " 'добавляем к активированной ячейке её же данные + перенос на новую строку + точное время\дату + пробел + имя пользователя + двоеточие и пробел (т.е. получается нечто вроде "16.10.2014 16:56:54 А. Иванов: ") End With Cancel = True End If End Sub
[/vba]
На двойной клик нужно писать другое событие [vba]
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Not Intersect(Target, Range("K1:K1000")) Is Nothing Then 'делаем так, чтобы он работал только в диапазоне ячеек K1-K1000 With Target(1, 1) 'указываем, с какой ячейкой работать в данный момент .Value = .Value & vbLf & Now & " " & Application.UserName & ": " 'добавляем к активированной ячейке её же данные + перенос на новую строку + точное время\дату + пробел + имя пользователя + двоеточие и пробел (т.е. получается нечто вроде "16.10.2014 16:56:54 А. Иванов: ") End With Cancel = True End If End Sub
Если кому понадобится, то вот, добавил ещё одно условие, чтобы перевода на новую строку не происходило, если ячейка изначально пуста:
[vba]
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Not Intersect(Target, Range("K4:K5000")) Is Nothing Then 'делаем так, чтобы он работал только в диапазоне ячеек K1-K1000 With Target(1, 1) 'указываем, с какой ячейкой работать в данный момент If IsEmpty(Target) Then .Value = Now & " " & Application.UserName & ": " 'добавляем к активированной ячейке её же данные + перенос на новую строку + точное время\дату + пробел + имя пользователя + двоеточие и пробел (т.е. получается нечто вроде "16.10.2014 16:56:54 А. Иванов: ") Else .Value = .Value & vbLf & Now & " " & Application.UserName & ": " 'добавляем к активированной ячейке её же данные + перенос на новую строку + точное время\дату + пробел + имя пользователя + двоеточие и пробел (т.е. получается нечто вроде "16.10.2014 16:56:54 А. Иванов: ") End If End With Cancel = True End If End Sub
[/vba]
А как ещё сделать: а) Чтобы по клику, после добавления времени\даты\имени, ячейка открывалась на редактирование как при обычном двойном клике? Иначе приходится после этого выставлять курсор в поле сверху (типа адресной строки, где формулы вводятся). б) Чтобы при редактировании этой ячейки через строку для формул, макрос срабатывал при нажатии Alt+Enter (перевод на новую строку)? Или этого нельзя добиться, так как происходит редактирование текста (ввод), которое нельзя обработать (выцепить из него хот-кей)? Пробовал поиграться с Application.OnKey, не вышло...
Теперь всё работает, спасибо огромное!
Если кому понадобится, то вот, добавил ещё одно условие, чтобы перевода на новую строку не происходило, если ячейка изначально пуста:
[vba]
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Not Intersect(Target, Range("K4:K5000")) Is Nothing Then 'делаем так, чтобы он работал только в диапазоне ячеек K1-K1000 With Target(1, 1) 'указываем, с какой ячейкой работать в данный момент If IsEmpty(Target) Then .Value = Now & " " & Application.UserName & ": " 'добавляем к активированной ячейке её же данные + перенос на новую строку + точное время\дату + пробел + имя пользователя + двоеточие и пробел (т.е. получается нечто вроде "16.10.2014 16:56:54 А. Иванов: ") Else .Value = .Value & vbLf & Now & " " & Application.UserName & ": " 'добавляем к активированной ячейке её же данные + перенос на новую строку + точное время\дату + пробел + имя пользователя + двоеточие и пробел (т.е. получается нечто вроде "16.10.2014 16:56:54 А. Иванов: ") End If End With Cancel = True End If End Sub
[/vba]
А как ещё сделать: а) Чтобы по клику, после добавления времени\даты\имени, ячейка открывалась на редактирование как при обычном двойном клике? Иначе приходится после этого выставлять курсор в поле сверху (типа адресной строки, где формулы вводятся). б) Чтобы при редактировании этой ячейки через строку для формул, макрос срабатывал при нажатии Alt+Enter (перевод на новую строку)? Или этого нельзя добиться, так как происходит редактирование текста (ввод), которое нельзя обработать (выцепить из него хот-кей)? Пробовал поиграться с Application.OnKey, не вышло...Venique
Сообщение отредактировал Venique - Четверг, 16.10.2014, 17:36
Ну и ладно тогда, в любом случае спасибо огромное! Наверное, так будет даже лучше, иначе если придется сделать перевод каретки, то каждый раз будет проставляться эта информация и её каждый раз придется удалять. Вот финальная версия макроса, надеюсь, кому-нибудь ещё это поможет:
[vba]
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 'включаем действие по клику If Not Intersect(Target, Range("K4:K5000")) Is Nothing Then 'включаем макрос для данного диапазона ячеек With Target(1, 1) 'указываем, с какой ячейкой работать макросу If IsEmpty(Target) Then 'если ячейка изначально пуста, то включаем макрос без перевода на новую строку .Value = Now & " " & Application.UserName & ": " Else 'в противном случае - перевод на новую строку будет .Value = .Value & vbLf & Now & " " & Application.UserName & ": " End If End With End If Cancel = 0 End Sub
[/vba]
Ну и чтобы людям было легче найти: excel, макрос на VBA, аналог примечания на VBA, макрос примечание, ввод данных в ячейку, добавить к тексту, добавить по клику, добавить время и имя
p.s: сам не сеошник, не подумайте
Ну и ладно тогда, в любом случае спасибо огромное! Наверное, так будет даже лучше, иначе если придется сделать перевод каретки, то каждый раз будет проставляться эта информация и её каждый раз придется удалять. Вот финальная версия макроса, надеюсь, кому-нибудь ещё это поможет:
[vba]
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 'включаем действие по клику If Not Intersect(Target, Range("K4:K5000")) Is Nothing Then 'включаем макрос для данного диапазона ячеек With Target(1, 1) 'указываем, с какой ячейкой работать макросу If IsEmpty(Target) Then 'если ячейка изначально пуста, то включаем макрос без перевода на новую строку .Value = Now & " " & Application.UserName & ": " Else 'в противном случае - перевод на новую строку будет .Value = .Value & vbLf & Now & " " & Application.UserName & ": " End If End With End If Cancel = 0 End Sub
[/vba]
Ну и чтобы людям было легче найти: excel, макрос на VBA, аналог примечания на VBA, макрос примечание, ввод данных в ячейку, добавить к тексту, добавить по клику, добавить время и имя
А как сделать, чтобы добавляемый данным макросом текст имел определённый цвет? Т.е. весь текст обычным (чёрным) цветом написан, а добавляемый комментарий уже синим, например.
[vba]
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 'включаем действие по клику If Not Intersect(Target, Range("K4:K5000")) Is Nothing Then 'включаем макрос для данного диапазона ячеек With Target(1, 1) 'указываем, с какой ячейкой работать макросу If IsEmpty(Target) Then 'если ячейка изначально пуста, то включаем макрос без перевода на новую строку .Value = Now & " " & Application.UserName & ": " Else 'в противном случае - перевод на новую строку будет .Value = .Value & vbLf & Now & " " & Application.UserName & ": " End If
If Application.UserName = "Иванов А." Then Target.Font.Color = vbRed Else Target.Font.Color = vbBlue End If
End With End If Cancel = 0 End Sub
[/vba]
Смог реализовать это через конструкцию ЕСЛИ имя пользователя = Иванов А. (мне нужно, чтобы цветом выделялись комментарии только определённого человека), но в таком случае меняется цвет ВСЕГО содержимого ячейки, а нужно только вводимого в данный момент текста.
А как сделать, чтобы добавляемый данным макросом текст имел определённый цвет? Т.е. весь текст обычным (чёрным) цветом написан, а добавляемый комментарий уже синим, например.
[vba]
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 'включаем действие по клику If Not Intersect(Target, Range("K4:K5000")) Is Nothing Then 'включаем макрос для данного диапазона ячеек With Target(1, 1) 'указываем, с какой ячейкой работать макросу If IsEmpty(Target) Then 'если ячейка изначально пуста, то включаем макрос без перевода на новую строку .Value = Now & " " & Application.UserName & ": " Else 'в противном случае - перевод на новую строку будет .Value = .Value & vbLf & Now & " " & Application.UserName & ": " End If
If Application.UserName = "Иванов А." Then Target.Font.Color = vbRed Else Target.Font.Color = vbBlue End If
End With End If Cancel = 0 End Sub
[/vba]
Смог реализовать это через конструкцию ЕСЛИ имя пользователя = Иванов А. (мне нужно, чтобы цветом выделялись комментарии только определённого человека), но в таком случае меняется цвет ВСЕГО содержимого ячейки, а нужно только вводимого в данный момент текста.Venique
Сообщение отредактировал Venique - Понедельник, 20.10.2014, 16:24
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 'включаем действие по клику If Not Intersect(Target, Range("K4:K5000")) Is Nothing Then 'включаем макрос для данного диапазона ячеек With Target(1, 1) 'указываем, с какой ячейкой работать макросу Dim Name$: Name = Application.UserName If IsEmpty(Target) Then 'если ячейка изначально пуста, то включаем макрос без перевода на новую строку .Value = Now & " " & Name & ": " Else .Value = .Value & vbLf & Now & " " & Name & ": " End If 'With .Characters(InStr(.Value, Name), Len(Name)) ' если раскомментировать эту строку и закометировать следующую, то выделится только имя пользователя With .Characters(Len(.Value), 1) .Font.Color = IIf(Name = "Иванов А.", vbRed, vbBlue) End With Application.SendKeys "^{END}" End With End If Cancel = 0 End Sub
[/vba]
как-то так [vba]
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 'включаем действие по клику If Not Intersect(Target, Range("K4:K5000")) Is Nothing Then 'включаем макрос для данного диапазона ячеек With Target(1, 1) 'указываем, с какой ячейкой работать макросу Dim Name$: Name = Application.UserName If IsEmpty(Target) Then 'если ячейка изначально пуста, то включаем макрос без перевода на новую строку .Value = Now & " " & Name & ": " Else .Value = .Value & vbLf & Now & " " & Name & ": " End If 'With .Characters(InStr(.Value, Name), Len(Name)) ' если раскомментировать эту строку и закометировать следующую, то выделится только имя пользователя With .Characters(Len(.Value), 1) .Font.Color = IIf(Name = "Иванов А.", vbRed, vbBlue) End With Application.SendKeys "^{END}" End With End If Cancel = 0 End Sub
Скрипт не отрабатывал, т.к. стояла защита на листе (в т.ч. запрет на изменение форматирования ячеек). Как только его выключил - заработало.
Но почему-то с закомментированной первой строкой нужных действий не происходит. Происходит только следующее: а) по клику на ячейку дата\время\фамилия не окрашиваются вообще; б) если в ячейке содержится "21.10.2014 17:38:20 Иванов А.:", при этом "Иванов А." уже окрашено в какой-то цвет, то окрашивание убирается; в) если выделить красным цветом цветом всю строку "21.10.2014 17:38:20 Иванов А.:", то при клике по ячейке окраска "инвертируется", а именно "Иванов А." на окрашенной строке становится синим, весь остальной текст красным.
Т.е. строка "With .Characters(Len(.Value), 1)" не то, что не работает, а работает совсем некорректно, увы. Вторая строка "With .Characters(InStr(.Value, Name), Len(Name))" исправно окрашивает фамилию\имя в цвет, но этого недостаточно. Можете помочь?
Отвечая на следующий свой вопрос - конструкция "IIf(Name = "Иванов А." or Name = "Иванов Б.", vbRed, vbBlue)" работает корректно.
Что отправляется командой Application.SendKeys "^{END}" по нажатию END пока не разобрался...
Немного отвечая самому себе...
Скрипт не отрабатывал, т.к. стояла защита на листе (в т.ч. запрет на изменение форматирования ячеек). Как только его выключил - заработало.
Но почему-то с закомментированной первой строкой нужных действий не происходит. Происходит только следующее: а) по клику на ячейку дата\время\фамилия не окрашиваются вообще; б) если в ячейке содержится "21.10.2014 17:38:20 Иванов А.:", при этом "Иванов А." уже окрашено в какой-то цвет, то окрашивание убирается; в) если выделить красным цветом цветом всю строку "21.10.2014 17:38:20 Иванов А.:", то при клике по ячейке окраска "инвертируется", а именно "Иванов А." на окрашенной строке становится синим, весь остальной текст красным.
Т.е. строка "With .Characters(Len(.Value), 1)" не то, что не работает, а работает совсем некорректно, увы. Вторая строка "With .Characters(InStr(.Value, Name), Len(Name))" исправно окрашивает фамилию\имя в цвет, но этого недостаточно. Можете помочь?
Отвечая на следующий свой вопрос - конструкция "IIf(Name = "Иванов А." or Name = "Иванов Б.", vbRed, vbBlue)" работает корректно.
Что отправляется командой Application.SendKeys "^{END}" по нажатию END пока не разобрался...Venique
Что отправляется командой Application.SendKeys "^{END}"
Ctrl+End так надо что ли? [vba]
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 'включаем действие по клику On Error GoTo err If Not Intersect(Target, Range("K4:K5000")) Is Nothing Then 'включаем макрос для данного диапазона ячеек With Target(1, 1) 'указываем, с какой ячейкой работать макросу With Application: .ScreenUpdating = 0: .EnableEvents = 0: End With Dim Name$: Name = Application.UserName Dim L&: L = Len(.Value) Dim char, arr&(), i& ReDim arr(L + (L > 0)) For i = 1 To L: arr(i - 1) = .Characters(i, 1).Font.Color: Next 'если ячейка изначально пуста, то включаем макрос без перевода на новую строку .Value = .Value & IIf(L, vbLf, "") & Now & " " & Name & ": " For i = 1 To L: .Characters(i, 1).Font.Color = arr(i - 1): Next 'With .Characters(InStr(.Value, Name), Len(Name)) ' если раскомментировать эту строку и закометировать следующую, то выделится только имя пользователя With .Characters(L + 1, Len(.Value) - L - 1) .Font.Color = IIf(Name = "krosav4ig", vbRed, vbBlue) End With .Characters(Len(.Value)).Font.ColorIndex = xlAutomatic Application.SendKeys "^{END}" End With End If Cancel = 0 If err.Number Then MsgBox "Ошибка " & err.Number & " (" & err.Description & ") в Worksheet_BeforeDoubleClick модуля Лист2" err: With Application: .ScreenUpdating = 1: .EnableEvents = 1: End With End Sub
Что отправляется командой Application.SendKeys "^{END}"
Ctrl+End так надо что ли? [vba]
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 'включаем действие по клику On Error GoTo err If Not Intersect(Target, Range("K4:K5000")) Is Nothing Then 'включаем макрос для данного диапазона ячеек With Target(1, 1) 'указываем, с какой ячейкой работать макросу With Application: .ScreenUpdating = 0: .EnableEvents = 0: End With Dim Name$: Name = Application.UserName Dim L&: L = Len(.Value) Dim char, arr&(), i& ReDim arr(L + (L > 0)) For i = 1 To L: arr(i - 1) = .Characters(i, 1).Font.Color: Next 'если ячейка изначально пуста, то включаем макрос без перевода на новую строку .Value = .Value & IIf(L, vbLf, "") & Now & " " & Name & ": " For i = 1 To L: .Characters(i, 1).Font.Color = arr(i - 1): Next 'With .Characters(InStr(.Value, Name), Len(Name)) ' если раскомментировать эту строку и закометировать следующую, то выделится только имя пользователя With .Characters(L + 1, Len(.Value) - L - 1) .Font.Color = IIf(Name = "krosav4ig", vbRed, vbBlue) End With .Characters(Len(.Value)).Font.ColorIndex = xlAutomatic Application.SendKeys "^{END}" End With End If Cancel = 0 If err.Number Then MsgBox "Ошибка " & err.Number & " (" & err.Description & ") в Worksheet_BeforeDoubleClick модуля Лист2" err: With Application: .ScreenUpdating = 1: .EnableEvents = 1: End With End Sub
Да, Вы правильно меня поняли. Мне было необходимо, чтобы макрос не только вставлял в ячейку дату\время\имя комментирующего, но и выделял эту вставленную информацию определённым цветом, если фамилия комментирующего совпадает с указанной в макросе. То есть, например, в ячейке текст инцидента написан чёрным, как и некоторые комментарии, а если свой комментарий вставляет супер-пользователь Иванов А., то его строка с датой\временем\именем выделяется синим для акцента.
Собственно, вот, немного причесал код. Надеюсь, ничего лишнего не удалил. Поправьте, ежели что, не обессудьте
[vba]
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 'включаем действие по клику If Not Intersect(Target, Range("K4:K5000")) Is Nothing Then 'включаем макрос для данного диапазона ячеек With Target(1, 1) 'указываем, с какой ячейкой работать макросу With Application: .ScreenUpdating = 0: .EnableEvents = 0: End With 'оптимизация производительности макроса Dim Name$: Name = Application.UserName 'задаём переменную Name, содержащую имя пользователя 'волшебство начинается Dim L&: L = Len(.Value) Dim char, arr&(), i& ReDim arr(L + (L > 0)) For i = 1 To L: arr(i - 1) = .Characters(i, 1).Font.Color: Next 'волшебство заканчивается .Value = .Value & IIf(L, vbLf, "") & Now & " " & Name & ": " 'проставляем дату\время\ФИО, в скобках - условие "пустая ли ячейка?" (т.е. делать перенос строки или нет) For i = 1 To L: .Characters(i, 1).Font.Color = arr(i - 1): Next 'ещё немного волшебства With .Characters(L + 1, Len(.Value) - L - 1) .Font.Color = IIf(Name = "Иванов А." Or Name = "Андреев П." Or Name = "Васьков А.", vbBlue, vbBlack) 'выделяем дату\время\ФИО в комментарии определённого пользователя End With .Characters(Len(.Value)).Font.ColorIndex = xlAutomatic 'оптимизация производительности макроса End With End If Cancel = 0 'открываем ячейку по двойному клику, а не только добавляем в неё данные With Application: .ScreenUpdating = 1: .EnableEvents = 1: End With 'оптимизация производительности макроса End Sub
[/vba]
Единственное, я заметил, что если в ячейке текст уже как-то отформатирован (например, какая-то его часть выделена жирным или подчёркнутым, изменён размер), то при отрабатывании макроса: а) если вставляется "цветной" комментарий, то всё форматирование (кроме цвета) сбрасывается к стандартному б) если вставляется "обычный" комментарий, то ВЕСЬ текст в ячейке, включая добавленный комментарий, становится жирным\другого размера и т.п., в зависимости от того, какое форматирование было к нему применено
Если первый пункт ещё не очень критичен, то второй уже сильно влияет, иначе весь файл превратится в разношёрстную "радугу"...
Большое спасибо!
Да, Вы правильно меня поняли. Мне было необходимо, чтобы макрос не только вставлял в ячейку дату\время\имя комментирующего, но и выделял эту вставленную информацию определённым цветом, если фамилия комментирующего совпадает с указанной в макросе. То есть, например, в ячейке текст инцидента написан чёрным, как и некоторые комментарии, а если свой комментарий вставляет супер-пользователь Иванов А., то его строка с датой\временем\именем выделяется синим для акцента.
Собственно, вот, немного причесал код. Надеюсь, ничего лишнего не удалил. Поправьте, ежели что, не обессудьте
[vba]
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 'включаем действие по клику If Not Intersect(Target, Range("K4:K5000")) Is Nothing Then 'включаем макрос для данного диапазона ячеек With Target(1, 1) 'указываем, с какой ячейкой работать макросу With Application: .ScreenUpdating = 0: .EnableEvents = 0: End With 'оптимизация производительности макроса Dim Name$: Name = Application.UserName 'задаём переменную Name, содержащую имя пользователя 'волшебство начинается Dim L&: L = Len(.Value) Dim char, arr&(), i& ReDim arr(L + (L > 0)) For i = 1 To L: arr(i - 1) = .Characters(i, 1).Font.Color: Next 'волшебство заканчивается .Value = .Value & IIf(L, vbLf, "") & Now & " " & Name & ": " 'проставляем дату\время\ФИО, в скобках - условие "пустая ли ячейка?" (т.е. делать перенос строки или нет) For i = 1 To L: .Characters(i, 1).Font.Color = arr(i - 1): Next 'ещё немного волшебства With .Characters(L + 1, Len(.Value) - L - 1) .Font.Color = IIf(Name = "Иванов А." Or Name = "Андреев П." Or Name = "Васьков А.", vbBlue, vbBlack) 'выделяем дату\время\ФИО в комментарии определённого пользователя End With .Characters(Len(.Value)).Font.ColorIndex = xlAutomatic 'оптимизация производительности макроса End With End If Cancel = 0 'открываем ячейку по двойному клику, а не только добавляем в неё данные With Application: .ScreenUpdating = 1: .EnableEvents = 1: End With 'оптимизация производительности макроса End Sub
[/vba]
Единственное, я заметил, что если в ячейке текст уже как-то отформатирован (например, какая-то его часть выделена жирным или подчёркнутым, изменён размер), то при отрабатывании макроса: а) если вставляется "цветной" комментарий, то всё форматирование (кроме цвета) сбрасывается к стандартному б) если вставляется "обычный" комментарий, то ВЕСЬ текст в ячейке, включая добавленный комментарий, становится жирным\другого размера и т.п., в зависимости от того, какое форматирование было к нему применено
Если первый пункт ещё не очень критичен, то второй уже сильно влияет, иначе весь файл превратится в разношёрстную "радугу"...Venique
Сообщение отредактировал Venique - Среда, 22.10.2014, 13:01
Единственное, я заметил, что если в ячейке текст уже как-то отформатирован (например, какая-то его часть выделена жирным или подчёркнутым, изменён размер), то при отрабатывании макроса: а) если вставляется "цветной" комментарий, то всё форматирование (кроме цвета) сбрасывается к стандартному б) если вставляется "обычный" комментарий, то ВЕСЬ текст в ячейке, включая добавленный комментарий, становится жирным\другого размера и т.п., в зависимости от того, какое форматирование было к нему применено
Может кто-нибудь помочь?
Цитата
Единственное, я заметил, что если в ячейке текст уже как-то отформатирован (например, какая-то его часть выделена жирным или подчёркнутым, изменён размер), то при отрабатывании макроса: а) если вставляется "цветной" комментарий, то всё форматирование (кроме цвета) сбрасывается к стандартному б) если вставляется "обычный" комментарий, то ВЕСЬ текст в ячейке, включая добавленный комментарий, становится жирным\другого размера и т.п., в зависимости от того, какое форматирование было к нему применено
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 'включаем действие по клику Cancel = 1 On Error GoTo err 'если произойдет какая-нибудь ошибка, выполнить последнюю строку кода If Not Intersect(Target, Range("K4:K5000")) Is Nothing Then 'включаем макрос для данного диапазона ячеек With Target(1, 1) 'указываем, с какой ячейкой работать макросу With Application: .ScreenUpdating = 0: End With 'оптимизация производительности макроса Dim Name$: Name = Application.UserName 'задаём переменную Name, содержащую имя пользователя 'волшебство начинается Dim L&: L = Len(.Value) Dim D$, i&, tmp$, k$ Select Case Application.MoveAfterReturnDirection Case xlDown: D = "UP": Case xlUp: D = "DOWN" Case xlRight: D = "LEFT": Case xlLeft: D = "RIGHT" End Select k = "{F2}^{END}" & IIf(L, "%{ENTER}", "") & Now & " " & Name & ": {ENTER}{" & D & "}" Application.SendKeys k DoEvents 'волшебство закончилось ; ) With .Characters(L + 1, Len(.Value) - L - 1) .Font.Color = IIf(Name = "Иванов А." Or Name = "Андреев П." Or Name = "Васьков А.", vbBlue, vbBlack) 'выделяем дату\время\ФИО в комментарии определённого пользователя End With With .Characters(L + 1, Len(.Value) - L).Font .Name = Application.StandardFont: .Bold = 0: .Italic = 0 .Size = Application.StandardFontSize: .Strikethrough = 0 .Subscript = 0: .Superscript = 0: .ThemeFont = xlThemeFontNone .TintAndShade = 0: .Underline = xlUnderlineStyleNone .OutlineFont = 0: .Shadow = 0: .FontStyle = "обычный" End With .Characters(L).Font.ColorIndex = xlAutomatic End With Application.SendKeys "{F2}" End If err: 'следующая строка дожна быть обязательно выполнена With Application: .ScreenUpdating = 1: .EnableEvents = 1: End With 'оптимизация производительности макроса End Sub
[/vba]
[vba]
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 'включаем действие по клику Cancel = 1 On Error GoTo err 'если произойдет какая-нибудь ошибка, выполнить последнюю строку кода If Not Intersect(Target, Range("K4:K5000")) Is Nothing Then 'включаем макрос для данного диапазона ячеек With Target(1, 1) 'указываем, с какой ячейкой работать макросу With Application: .ScreenUpdating = 0: End With 'оптимизация производительности макроса Dim Name$: Name = Application.UserName 'задаём переменную Name, содержащую имя пользователя 'волшебство начинается Dim L&: L = Len(.Value) Dim D$, i&, tmp$, k$ Select Case Application.MoveAfterReturnDirection Case xlDown: D = "UP": Case xlUp: D = "DOWN" Case xlRight: D = "LEFT": Case xlLeft: D = "RIGHT" End Select k = "{F2}^{END}" & IIf(L, "%{ENTER}", "") & Now & " " & Name & ": {ENTER}{" & D & "}" Application.SendKeys k DoEvents 'волшебство закончилось ; ) With .Characters(L + 1, Len(.Value) - L - 1) .Font.Color = IIf(Name = "Иванов А." Or Name = "Андреев П." Or Name = "Васьков А.", vbBlue, vbBlack) 'выделяем дату\время\ФИО в комментарии определённого пользователя End With With .Characters(L + 1, Len(.Value) - L).Font .Name = Application.StandardFont: .Bold = 0: .Italic = 0 .Size = Application.StandardFontSize: .Strikethrough = 0 .Subscript = 0: .Superscript = 0: .ThemeFont = xlThemeFontNone .TintAndShade = 0: .Underline = xlUnderlineStyleNone .OutlineFont = 0: .Shadow = 0: .FontStyle = "обычный" End With .Characters(L).Font.ColorIndex = xlAutomatic End With Application.SendKeys "{F2}" End If err: 'следующая строка дожна быть обязательно выполнена With Application: .ScreenUpdating = 1: .EnableEvents = 1: End With 'оптимизация производительности макроса End Sub
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 'включаем действие по клику Cancel = 0 On Error GoTo err 'если произойдет какая-нибудь ошибка, выполнить последнюю строку кода If Not Intersect(Target, Range("K4:K5000")) Is Nothing Then 'включаем макрос для данного диапазона ячеек With Target(1, 1) 'указываем, с какой ячейкой работать макросу With Application: .ScreenUpdating = 0: End With 'оптимизация производительности макроса Dim Name$: Name = Application.UserName 'задаём переменную Name, содержащую имя пользователя 'волшебство начинается Dim L&: L = Len(.Value) .Characters(L).Insert Right(.Value, 1) & IIf(L, vbLf, "") & Now & " " & Name & ": " Dim L2&: L2 = Len(Target.Characters.Text) Dim AL: Set AL = CreateObject("System.Collections.ArrayList") AL.Add "Иванов А.": AL.Add "Андреев П.": AL.Add "Васьков А." .Characters(L + 1, L2 - L - 1).Font.Color = IIf(AL.contains(Name), vbBlue, vbBlack) 'выделяем дату\время\ФИО в комментарии определённого пользователя Set AL = Nothing 'волшебство закончилось ; ) With .Characters(L + 1, L2 - L).Font .Name = Application.StandardFont: .Bold = 0: .Italic = 0 .Size = Application.StandardFontSize: .Strikethrough = 0 .Subscript = 0: .Superscript = 0: .ThemeFont = 0 .TintAndShade = 0: .Underline = -4142 .OutlineFont = 0: .Shadow = 0: .FontStyle = "обычный" End With .Characters(L2).Font.ColorIndex = xlAutomatic End With End If err: 'следующая строка дожна быть обязательно выполнена With Application: .ScreenUpdating = 1: .EnableEvents = 1: End With 'оптимизация производительности макроса End Sub
[/vba]
[vba]
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 'включаем действие по клику Cancel = 0 On Error GoTo err 'если произойдет какая-нибудь ошибка, выполнить последнюю строку кода If Not Intersect(Target, Range("K4:K5000")) Is Nothing Then 'включаем макрос для данного диапазона ячеек With Target(1, 1) 'указываем, с какой ячейкой работать макросу With Application: .ScreenUpdating = 0: End With 'оптимизация производительности макроса Dim Name$: Name = Application.UserName 'задаём переменную Name, содержащую имя пользователя 'волшебство начинается Dim L&: L = Len(.Value) .Characters(L).Insert Right(.Value, 1) & IIf(L, vbLf, "") & Now & " " & Name & ": " Dim L2&: L2 = Len(Target.Characters.Text) Dim AL: Set AL = CreateObject("System.Collections.ArrayList") AL.Add "Иванов А.": AL.Add "Андреев П.": AL.Add "Васьков А." .Characters(L + 1, L2 - L - 1).Font.Color = IIf(AL.contains(Name), vbBlue, vbBlack) 'выделяем дату\время\ФИО в комментарии определённого пользователя Set AL = Nothing 'волшебство закончилось ; ) With .Characters(L + 1, L2 - L).Font .Name = Application.StandardFont: .Bold = 0: .Italic = 0 .Size = Application.StandardFontSize: .Strikethrough = 0 .Subscript = 0: .Superscript = 0: .ThemeFont = 0 .TintAndShade = 0: .Underline = -4142 .OutlineFont = 0: .Shadow = 0: .FontStyle = "обычный" End With .Characters(L2).Font.ColorIndex = xlAutomatic End With End If err: 'следующая строка дожна быть обязательно выполнена With Application: .ScreenUpdating = 1: .EnableEvents = 1: End With 'оптимизация производительности макроса End Sub
Ух, только добрался до ПК... действительно "волшебство", до такого уже никак не додуматься самому...
Второй вариант изящнее первого, насколько я понял, но увы он перестаёт добавлять комментарии уже где-то после 7-10 клика по ячейке. Поэтому пришлось воспользоваться первым. Он хоть и не такой красивый и работает наверняка чуть медленнее, но работает правильно - наличие текста в ячейке понимает, дату\время\фио добавляет, окрашивает их, если это ФИО определённого человека, остальное форматирование не сбивает.
Так что спасибо Вам огромное, плюсиков в карму настоящую и виртуальную!
Ух, только добрался до ПК... действительно "волшебство", до такого уже никак не додуматься самому...
Второй вариант изящнее первого, насколько я понял, но увы он перестаёт добавлять комментарии уже где-то после 7-10 клика по ячейке. Поэтому пришлось воспользоваться первым. Он хоть и не такой красивый и работает наверняка чуть медленнее, но работает правильно - наличие текста в ячейке понимает, дату\время\фио добавляет, окрашивает их, если это ФИО определённого человека, остальное форматирование не сбивает.
Так что спасибо Вам огромное, плюсиков в карму настоящую и виртуальную! Venique
krosav4ig, вынужден опять обратиться за Вашей помощью... первая версия макроса начала себя некорректно вести. Во-первых, вместо открытия ячейки он почему-то начинает переходить на ячейку вверх (т.е. выполнять прописанные нажатия клавиш, хотя раньше такого не было). Иногда он все-таки открывает ячейку, прописывая нужное значение, только добавляя перед этим "+K13". Попробовал испытать макрос на другом листе, чистом - вписывает в ячейку "11.11.2014 15:36:16 =0F0:0=>2 .:", т.е. вместо имени пользователя что-то непонятное, хотя оно забито верно.
Решил вернуться ко второму варианту макроса, который более изящный и всё-такое, но вновь столкнулся с проблемой, из-за которой в начале и отказался от его использования - нельзя добавить больше 7-9 строк текста нажатием на ячейку. Т.е. он вставляет дату\время\ФИО только 7-9 раз (в зав-ти от длины ФИО), потом перестаёт. Методом удаления всех строк, выяснил, что за это отвечает следующий блок:
[vba]
Код
Dim Name$: Name = Application.UserName 'задаём переменную Name, содержащую имя пользователя 'волшебство начинается Dim L&: L = Len(.Value) .Characters(L).Insert Right(.Value, 1) & IIf(L, vbLf, "") & Now & " " & Name & ": "
[/vba]
Возможно, есть какое-то ограничение на размер переменной L$, но как его обойти - я так и не понял... можно как-то помочь с этим?
krosav4ig, вынужден опять обратиться за Вашей помощью... первая версия макроса начала себя некорректно вести. Во-первых, вместо открытия ячейки он почему-то начинает переходить на ячейку вверх (т.е. выполнять прописанные нажатия клавиш, хотя раньше такого не было). Иногда он все-таки открывает ячейку, прописывая нужное значение, только добавляя перед этим "+K13". Попробовал испытать макрос на другом листе, чистом - вписывает в ячейку "11.11.2014 15:36:16 =0F0:0=>2 .:", т.е. вместо имени пользователя что-то непонятное, хотя оно забито верно.
Решил вернуться ко второму варианту макроса, который более изящный и всё-такое, но вновь столкнулся с проблемой, из-за которой в начале и отказался от его использования - нельзя добавить больше 7-9 строк текста нажатием на ячейку. Т.е. он вставляет дату\время\ФИО только 7-9 раз (в зав-ти от длины ФИО), потом перестаёт. Методом удаления всех строк, выяснил, что за это отвечает следующий блок:
[vba]
Код
Dim Name$: Name = Application.UserName 'задаём переменную Name, содержащую имя пользователя 'волшебство начинается Dim L&: L = Len(.Value) .Characters(L).Insert Right(.Value, 1) & IIf(L, vbLf, "") & Now & " " & Name & ": "
[/vba]
Возможно, есть какое-то ограничение на размер переменной L$, но как его обойти - я так и не понял... можно как-то помочь с этим? Venique