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

Вход

Регистрация

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

 

= Мир MS Excel/Аналог "примечания" в ячейке с текстом - Страница 2 - Мир MS Excel

Старая форма входа
  • Страница 2 из 2
  • «
  • 1
  • 2
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Аналог "примечания" в ячейке с текстом (Макросы/Sub)
Аналог "примечания" в ячейке с текстом
nilem Дата: Понедельник, 17.11.2014, 16:16 | Сообщение № 21
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
может, как-то вот так:
[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
[/vba]


Яндекс.Деньги 4100159601573
 
Ответить
Сообщениеможет, как-то вот так:
[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
[/vba]

Автор - nilem
Дата добавления - 17.11.2014 в 16:16
Venique Дата: Понедельник, 17.11.2014, 17:38 | Сообщение № 22
Группа: Пользователи
Ранг: Новичок
Сообщений: 38
Репутация: 0 ±
Замечаний: 20% ±

Excel 2003
Проблема в том, что он сбивает уже имеющееся форматирование в ячейке. Т.е. если в ячейке какой-то текст уже окрашен красным, например, или имеет другой размер, то после клика по ячейке (при условии, что моя фамилия Иванов А.) он сбивает всё форматирование к стандартному, окрашивая лишь последнюю строку в синий.

Хотелось бы, чтобы макрос:
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 - Понедельник, 17.11.2014, 17:39
 
Ответить
СообщениеПроблема в том, что он сбивает уже имеющееся форматирование в ячейке. Т.е. если в ячейке какой-то текст уже окрашен красным, например, или имеет другой размер, то после клика по ячейке (при условии, что моя фамилия Иванов А.) он сбивает всё форматирование к стандартному, окрашивая лишь последнюю строку в синий.

Хотелось бы, чтобы макрос:
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
Дата добавления - 17.11.2014 в 17:38
nilem Дата: Понедельник, 17.11.2014, 17:50 | Сообщение № 23
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
Тогда придется запоминать все предыдущее форматирование, и после добавления строки восстанавливать его - долго и неинтересно. А просто синих Ивановых Андреевых недостаточно?


Яндекс.Деньги 4100159601573
 
Ответить
СообщениеТогда придется запоминать все предыдущее форматирование, и после добавления строки восстанавливать его - долго и неинтересно. А просто синих Ивановых Андреевых недостаточно?

Автор - nilem
Дата добавления - 17.11.2014 в 17:50
Venique Дата: Понедельник, 17.11.2014, 17:54 | Сообщение № 24
Группа: Пользователи
Ранг: Новичок
Сообщений: 38
Репутация: 0 ±
Замечаний: 20% ±

Excel 2003
Было б достаточно - не заморачивался которую неделю этим вопросом и Вас не беспокоил бы :)

Кстати, может, как-то возможно обрабатывать форматирование только добавленной строки, чтобы всё остальное не трогать? Типа разграничить предыдущее Value и добавленную из переменной строку. Ну это так, лишь додумки, сам-то я... :D
 
Ответить
СообщениеБыло б достаточно - не заморачивался которую неделю этим вопросом и Вас не беспокоил бы :)

Кстати, может, как-то возможно обрабатывать форматирование только добавленной строки, чтобы всё остальное не трогать? Типа разграничить предыдущее Value и добавленную из переменной строку. Ну это так, лишь додумки, сам-то я... :D

Автор - Venique
Дата добавления - 17.11.2014 в 17:54
nilem Дата: Понедельник, 17.11.2014, 18:06 | Сообщение № 25
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
А сколько строк может быть у вас в "примечании"?
Используете 2003-й Ексель? Там ведь ограничение длины строки в ячейке, кажется, 255 символов?
и какое именно форматирование применяете: цвет, р-р шрифта, что-то еще?


Яндекс.Деньги 4100159601573

Сообщение отредактировал nilem - Понедельник, 17.11.2014, 18:07
 
Ответить
СообщениеА сколько строк может быть у вас в "примечании"?
Используете 2003-й Ексель? Там ведь ограничение длины строки в ячейке, кажется, 255 символов?
и какое именно форматирование применяете: цвет, р-р шрифта, что-то еще?

Автор - nilem
Дата добавления - 17.11.2014 в 18:06
Venique Дата: Вторник, 18.11.2014, 00:19 | Сообщение № 26
Группа: Пользователи
Ранг: Новичок
Сообщений: 38
Репутация: 0 ±
Замечаний: 20% ±

Excel 2003
Да, используется 2003 Ексель. По строкам точно не скажу, по крайней мере, ни на какое ограничение не натыкался. Сейчас попробовал пробежаться по примечаниям - в среднем, количество символов в ячейке - около 2500, количество строк - 15. Ну, это среднее... Значит, либо ограничения нет, либо оно иное.

В качестве форматирование применяется цвет, р-р шрифта, начертание (болд). Остальное (по центру\по краю, курсив, подчеркнуто и т.п,) не используется.
 
Ответить
СообщениеДа, используется 2003 Ексель. По строкам точно не скажу, по крайней мере, ни на какое ограничение не натыкался. Сейчас попробовал пробежаться по примечаниям - в среднем, количество символов в ячейке - около 2500, количество строк - 15. Ну, это среднее... Значит, либо ограничения нет, либо оно иное.

В качестве форматирование применяется цвет, р-р шрифта, начертание (болд). Остальное (по центру\по краю, курсив, подчеркнуто и т.п,) не используется.

Автор - Venique
Дата добавления - 18.11.2014 в 00:19
nilem Дата: Вторник, 18.11.2014, 08:08 | Сообщение № 27
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
тогда пробуйте так (предполагается, что каждая строка отформатирована целиком)
[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]


Яндекс.Деньги 4100159601573
 
Ответить
Сообщениетогда пробуйте так (предполагается, что каждая строка отформатирована целиком)
[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]

Автор - nilem
Дата добавления - 18.11.2014 в 08:08
Venique Дата: Вторник, 18.11.2014, 14:22 | Сообщение № 28
Группа: Пользователи
Ранг: Новичок
Сообщений: 38
Репутация: 0 ±
Замечаний: 20% ±

Excel 2003
Попытался, сразу выдал ошибку "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 - Вторник, 18.11.2014, 14:26
 
Ответить
СообщениеПопытался, сразу выдал ошибку "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
Дата добавления - 18.11.2014 в 14:22
nilem Дата: Вторник, 18.11.2014, 15:54 | Сообщение № 29
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
На этот случай была закоммнтированная часть. Попробуйте еще раз
[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]
По поводу "каждая строка отформатирована целиком". Есть несколько строк в вашей ячейке, и каждая строка м.б. отформатирована по-разному, но только целиком. Т.е. не предусмотрено разное форматир-е для отдельных символов внутри такой строки.


Яндекс.Деньги 4100159601573
 
Ответить
СообщениеНа этот случай была закоммнтированная часть. Попробуйте еще раз
[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
Дата добавления - 18.11.2014 в 15:54
Venique Дата: Вторник, 18.11.2014, 16:44 | Сообщение № 30
Группа: Пользователи
Ранг: Новичок
Сообщений: 38
Репутация: 0 ±
Замечаний: 20% ±

Excel 2003
Вот! Спасибо огромное за помощь!
 
Ответить
СообщениеВот! Спасибо огромное за помощь!

Автор - Venique
Дата добавления - 18.11.2014 в 16:44
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Аналог "примечания" в ячейке с текстом (Макросы/Sub)
  • Страница 2 из 2
  • «
  • 1
  • 2
Поиск:

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