Одним из способов добиться этого было бы использование текстового поля ActiveX, которое связано с ячейкой, а не с ячейкой напрямую (подход с использованием только ячейки см. в конце).
Вот демонстрация того, как это может выглядеть:
Вот код, который у меня был в модуле кода Worsheet:
Const PLACEHOLDER_TEXT = "My placeholder text"
Private Sub TextBox1_GotFocus()
'Clear text content
With TextBox1
If .Text = PLACEHOLDER_TEXT Then
.Text = ""
.ForeColor = vbBlack
End If
End With
End Sub
Private Sub TextBox1_LostFocus()
'Add the placeholder text if user exits without filling the field
With TextBox1
If .Text = vbNullString Or .Text = PLACEHOLDER_TEXT Then
.Text = PLACEHOLDER_TEXT
.ForeColor = vbGrayText
End If
End With
End Sub
Чтобы добавить связанную ячейку, вы можете войти в режим разработки, щелкнуть правой кнопкой мыши текстовое поле > Свойства > Изменить запись связанной ячейки, используя стандартный формат адреса Excel:
Для подхода с ячейкой и использованием Worksheet_SelectionChange
, как предлагает BigBen, вы можете использовать что-то вроде этого внутри модуля рабочего листа:
Option Explicit
Const TARGET_CELL_ADDRESS As String = "C2"
Const PLACEHOLDER_TEXT As String = "My placeholder text"
Const GREY_COLOR = 10921637
Const BLACK_COLOR = 0
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Replace(Target.AddressLocal, "$", "") = TARGET_CELL_ADDRESS Then
'Clear text content
With Target
If .Value2 = PLACEHOLDER_TEXT Then
.Value2 = ""
.Font.Color = BLACK_COLOR
End If
End With
Else
'Restore placeholder text if needed
Dim Rng As Range
Set Rng = Me.Range(TARGET_CELL_ADDRESS)
With Rng
If .Value2 = vbNullString Then
.Value2 = PLACEHOLDER_TEXT
.Font.Color = GREY_COLOR
ElseIf .Value2 = PLACEHOLDER_TEXT Then
If .Font.Color <> GREY_COLOR Then
.Font.Color = GREY_COLOR
End If
End If
End With
End If
End Sub
Есть ли способ без использования текстового поля ActiveX, потому что с помощью этого метода не так уж много возможностей форматирования макета? И мне бы хотелось, чтобы оно было в клетке?
@ClaraMonspiette - я отредактировал свой ответ, добавив еще один метод, используя также простую ячейку.
Как мы можем применить код к нескольким ячейкам?
@ClaraMonspiette - С разными текстами-заполнителями для каждой ячейки?
Да, я хотел бы дать разные инструкции для каждой ячейки.
@ClaraMonspiette - Посмотрите здесь: stackoverflow.com/a/78703204/5958842
К сожалению, ваше решение работает только наполовину, поскольку текст в конце все еще серый.
Меня устраивает. Вы можете проверить это, поместив код на Лист 1 новой книги.
Для простоты я изменил цветовые константы, чтобы использовать неотрицательные числа.
Возможно, используя событие
Worksheet_SelectionChange
.