Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Intersect(Target, Range("K4:K5000")) Is Nothing Then Exit Sub Dim Nm$, L&, s$, v Nm = Application.UserName: s = "Иванов А.: Андреев П.:": L = 1 With Target .Value = .Value & IIf(Len(.Value), vbLf, vbNullString) & Now & " " & Nm & ": " For Each v In Split(.Value, vbLf) .Characters(L, Len(v)).Font.Color = IIf(InStr(s, Split(v)(2)), vbBlue, vbBlack) L = L + Len(v) + 1 Next End With End Sub
[/vba]
может, как-то вот так: [vba]
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Intersect(Target, Range("K4:K5000")) Is Nothing Then Exit Sub Dim Nm$, L&, s$, v Nm = Application.UserName: s = "Иванов А.: Андреев П.:": L = 1 With Target .Value = .Value & IIf(Len(.Value), vbLf, vbNullString) & Now & " " & Nm & ": " For Each v In Split(.Value, vbLf) .Characters(L, Len(v)).Font.Color = IIf(InStr(s, Split(v)(2)), vbBlue, vbBlack) L = L + Len(v) + 1 Next End With End Sub
Проблема в том, что он сбивает уже имеющееся форматирование в ячейке. Т.е. если в ячейке какой-то текст уже окрашен красным, например, или имеет другой размер, то после клика по ячейке (при условии, что моя фамилия Иванов А.) он сбивает всё форматирование к стандартному, окрашивая лишь последнюю строку в синий.
Хотелось бы, чтобы макрос: 1) добавлял по клику в ячейку дату\время\фио, при этом учитывая, пустая ли ячейка или нет (т.е. нужно добавлять перед датой\временем\ФИО перенос строки или нет) 2) по клику ячейка открывалась для форматирования 3) не имел ограничений на количество "кликов" (т.е. вставлял дату\время\ФИО сколь угодно раз) 4) если Application.Username содержит определённое ФИО, то вставленную дату\время\ФИО он окрашивал синим 5) не сбивал уже имеющееся форматирование в ячейке
Пункты 1, 2 и 3 мне удалось реализовать вот этим кодом:
[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]
Макрос не имеет никаких ограничений, спокойно вставляет по клику дату\время\ФИО в ячейку и после открывает её для записи. А вот как сделать проверку ЕСЛИ Application.UserName = Иванов А. ТОГДА цвет(дата\время\ФИО) = Blue и сделать это так, чтобы остальное форматирование в ячейке не сбивалось - никак не могу додуматься...
Ребята предлагают варианты макросов (за что им огромное спасибо), но один некорректно работает совсем, второй почему-то перестаёт добавлять информацию уже после 7-9 кликов по ячейке, а Ваш сбивает остальное форматирование в ячейке
Проблема в том, что он сбивает уже имеющееся форматирование в ячейке. Т.е. если в ячейке какой-то текст уже окрашен красным, например, или имеет другой размер, то после клика по ячейке (при условии, что моя фамилия Иванов А.) он сбивает всё форматирование к стандартному, окрашивая лишь последнюю строку в синий.
Хотелось бы, чтобы макрос: 1) добавлял по клику в ячейку дату\время\фио, при этом учитывая, пустая ли ячейка или нет (т.е. нужно добавлять перед датой\временем\ФИО перенос строки или нет) 2) по клику ячейка открывалась для форматирования 3) не имел ограничений на количество "кликов" (т.е. вставлял дату\время\ФИО сколь угодно раз) 4) если Application.Username содержит определённое ФИО, то вставленную дату\время\ФИО он окрашивал синим 5) не сбивал уже имеющееся форматирование в ячейке
Пункты 1, 2 и 3 мне удалось реализовать вот этим кодом:
[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]
Макрос не имеет никаких ограничений, спокойно вставляет по клику дату\время\ФИО в ячейку и после открывает её для записи. А вот как сделать проверку ЕСЛИ Application.UserName = Иванов А. ТОГДА цвет(дата\время\ФИО) = Blue и сделать это так, чтобы остальное форматирование в ячейке не сбивалось - никак не могу додуматься...
Ребята предлагают варианты макросов (за что им огромное спасибо), но один некорректно работает совсем, второй почему-то перестаёт добавлять информацию уже после 7-9 кликов по ячейке, а Ваш сбивает остальное форматирование в ячейке Venique
Сообщение отредактировал Venique - Понедельник, 17.11.2014, 17:39
Тогда придется запоминать все предыдущее форматирование, и после добавления строки восстанавливать его - долго и неинтересно. А просто синих Ивановых Андреевых недостаточно?
Тогда придется запоминать все предыдущее форматирование, и после добавления строки восстанавливать его - долго и неинтересно. А просто синих Ивановых Андреевых недостаточно?nilem
Было б достаточно - не заморачивался которую неделю этим вопросом и Вас не беспокоил бы
Кстати, может, как-то возможно обрабатывать форматирование только добавленной строки, чтобы всё остальное не трогать? Типа разграничить предыдущее Value и добавленную из переменной строку. Ну это так, лишь додумки, сам-то я...
Было б достаточно - не заморачивался которую неделю этим вопросом и Вас не беспокоил бы
Кстати, может, как-то возможно обрабатывать форматирование только добавленной строки, чтобы всё остальное не трогать? Типа разграничить предыдущее Value и добавленную из переменной строку. Ну это так, лишь додумки, сам-то я... Venique
А сколько строк может быть у вас в "примечании"? Используете 2003-й Ексель? Там ведь ограничение длины строки в ячейке, кажется, 255 символов? и какое именно форматирование применяете: цвет, р-р шрифта, что-то еще?
А сколько строк может быть у вас в "примечании"? Используете 2003-й Ексель? Там ведь ограничение длины строки в ячейке, кажется, 255 символов? и какое именно форматирование применяете: цвет, р-р шрифта, что-то еще?nilem
Яндекс.Деньги 4100159601573
Сообщение отредактировал nilem - Понедельник, 17.11.2014, 18:07
Да, используется 2003 Ексель. По строкам точно не скажу, по крайней мере, ни на какое ограничение не натыкался. Сейчас попробовал пробежаться по примечаниям - в среднем, количество символов в ячейке - около 2500, количество строк - 15. Ну, это среднее... Значит, либо ограничения нет, либо оно иное.
В качестве форматирование применяется цвет, р-р шрифта, начертание (болд). Остальное (по центру\по краю, курсив, подчеркнуто и т.п,) не используется.
Да, используется 2003 Ексель. По строкам точно не скажу, по крайней мере, ни на какое ограничение не натыкался. Сейчас попробовал пробежаться по примечаниям - в среднем, количество символов в ячейке - около 2500, количество строк - 15. Ну, это среднее... Значит, либо ограничения нет, либо оно иное.
В качестве форматирование применяется цвет, р-р шрифта, начертание (болд). Остальное (по центру\по краю, курсив, подчеркнуто и т.п,) не используется.Venique
тогда пробуйте так (предполагается, что каждая строка отформатирована целиком) [vba]
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Intersect(Target, Range("K4:K5000")) Is Nothing Then Exit Sub Dim Nm$, L&, s$, i&, sp, t() 't(40, 2) With Application Nm = .UserName: .ScreenUpdating = False End With L = 1: s = "Иванов А.: Андреев П.:" With Target sp = Split(.Value, vbLf): ReDim t(UBound(sp), 2)
For i = 0 To UBound(sp) With .Characters(L, Len(sp(i))).Font t(i, 0) = .Bold: t(i, 1) = .Size: t(i, 2) = .Color End With L = L + Len(sp(i)) + 1 Next
.Value = .Value & IIf(Len(.Value), vbLf, vbNullString) & Now & " " & Nm & ": " L = 1 For i = 0 To UBound(sp) With .Characters(L, Len(sp(i))).Font .Bold = t(i, 0): .Size = t(i, 1): .Color = t(i, 2) End With L = L + Len(sp(i)) + 1 Next .Characters(L).Font.Color = IIf(InStr(s, Nm), vbBlue, vbBlack) End With Application.ScreenUpdating = False End Sub
[/vba]
тогда пробуйте так (предполагается, что каждая строка отформатирована целиком) [vba]
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Intersect(Target, Range("K4:K5000")) Is Nothing Then Exit Sub Dim Nm$, L&, s$, i&, sp, t() 't(40, 2) With Application Nm = .UserName: .ScreenUpdating = False End With L = 1: s = "Иванов А.: Андреев П.:" With Target sp = Split(.Value, vbLf): ReDim t(UBound(sp), 2)
For i = 0 To UBound(sp) With .Characters(L, Len(sp(i))).Font t(i, 0) = .Bold: t(i, 1) = .Size: t(i, 2) = .Color End With L = L + Len(sp(i)) + 1 Next
.Value = .Value & IIf(Len(.Value), vbLf, vbNullString) & Now & " " & Nm & ": " L = 1 For i = 0 To UBound(sp) With .Characters(L, Len(sp(i))).Font .Bold = t(i, 0): .Size = t(i, 1): .Color = t(i, 2) End With L = L + Len(sp(i)) + 1 Next .Characters(L).Font.Color = IIf(InStr(s, Nm), vbBlue, vbBlack) End With Application.ScreenUpdating = False End Sub
Попытался, сразу выдал ошибку "9: Subscript out of range" касательно этой строки:
[vba]
Код
sp = Split(.Value, vbLf): ReDim t(UBound(sp), 2)
[/vba]
Там получается t(UBound(sp), 2) = <Subscript out of range>, UBound(sp) получился =-1.
Макрос вставил на чистый лист, выдает ошибку при клике на любую ячейку в указанном диапазоне.
---
Ну и не совсем понял, что понималось под "каждая строка отформатирована целиком". В ячейке может не быть текста, а может и уже быть напечатан какой-то текст, часть из которого может быть выделена жирным или более крупным. По сути получается некая система ведения инцидента, где каждый пользователь от себя добавляет комментарий, может его болдом выделить, чтобы заметнее было и т.п.
Попытался, сразу выдал ошибку "9: Subscript out of range" касательно этой строки:
[vba]
Код
sp = Split(.Value, vbLf): ReDim t(UBound(sp), 2)
[/vba]
Там получается t(UBound(sp), 2) = <Subscript out of range>, UBound(sp) получился =-1.
Макрос вставил на чистый лист, выдает ошибку при клике на любую ячейку в указанном диапазоне.
---
Ну и не совсем понял, что понималось под "каждая строка отформатирована целиком". В ячейке может не быть текста, а может и уже быть напечатан какой-то текст, часть из которого может быть выделена жирным или более крупным. По сути получается некая система ведения инцидента, где каждый пользователь от себя добавляет комментарий, может его болдом выделить, чтобы заметнее было и т.п.Venique
Сообщение отредактировал Venique - Вторник, 18.11.2014, 14:26
На этот случай была закоммнтированная часть. Попробуйте еще раз [vba]
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Intersect(Target, Range("K4:K5000")) Is Nothing Then Exit Sub Dim Nm$, L&, s$, i&, sp, t(40, 2) ' t(40, 2) - не более 41 строки! With Application Nm = .UserName: .ScreenUpdating = False End With L = 1: s = "Иванов А.: Андреев П.:" With Target sp = Split(.Value, vbLf)
For i = 0 To UBound(sp) With .Characters(L, Len(sp(i))).Font t(i, 0) = .Bold: t(i, 1) = .Size: t(i, 2) = .Color End With L = L + Len(sp(i)) + 1 Next
.Value = .Value & IIf(Len(.Value), vbLf, vbNullString) & Now & " " & Nm & ": " L = 1 For i = 0 To UBound(sp) With .Characters(L, Len(sp(i))).Font .Bold = t(i, 0): .Size = t(i, 1): .Color = t(i, 2) End With L = L + Len(sp(i)) + 1 Next .Characters(L).Font.Color = IIf(InStr(s, Nm), vbBlue, vbBlack) End With Application.ScreenUpdating = False End Sub
[/vba] По поводу "каждая строка отформатирована целиком". Есть несколько строк в вашей ячейке, и каждая строка м.б. отформатирована по-разному, но только целиком. Т.е. не предусмотрено разное форматир-е для отдельных символов внутри такой строки.
На этот случай была закоммнтированная часть. Попробуйте еще раз [vba]
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Intersect(Target, Range("K4:K5000")) Is Nothing Then Exit Sub Dim Nm$, L&, s$, i&, sp, t(40, 2) ' t(40, 2) - не более 41 строки! With Application Nm = .UserName: .ScreenUpdating = False End With L = 1: s = "Иванов А.: Андреев П.:" With Target sp = Split(.Value, vbLf)
For i = 0 To UBound(sp) With .Characters(L, Len(sp(i))).Font t(i, 0) = .Bold: t(i, 1) = .Size: t(i, 2) = .Color End With L = L + Len(sp(i)) + 1 Next
.Value = .Value & IIf(Len(.Value), vbLf, vbNullString) & Now & " " & Nm & ": " L = 1 For i = 0 To UBound(sp) With .Characters(L, Len(sp(i))).Font .Bold = t(i, 0): .Size = t(i, 1): .Color = t(i, 2) End With L = L + Len(sp(i)) + 1 Next .Characters(L).Font.Color = IIf(InStr(s, Nm), vbBlue, vbBlack) End With Application.ScreenUpdating = False End Sub
[/vba] По поводу "каждая строка отформатирована целиком". Есть несколько строк в вашей ячейке, и каждая строка м.б. отформатирована по-разному, но только целиком. Т.е. не предусмотрено разное форматир-е для отдельных символов внутри такой строки.nilem