Vba excel checkbox в ячейке

Элемент управления пользовательской формы CheckBox для выбора или невыбора его пользователем и передачи результата в VBA Excel. Свойства «Флажка», примеры кода.

UserForm.CheckBox – это элемент управления пользовательской формы, предназначенный для передачи в код VBA информации о выборе или невыборе его пользователем и возвращающий одно из двух значений: False (галочки нет) или True (галочка установлена).

Элемент управления CheckBox на пользовательской форме

Элемент управления CheckBox состоит из флажка и надписи. В VBA Excel флажок имеет квадратную форму, надпись расположена справа от него. Надпись реагирует на нажатие мышью так же, как и флажок.

По тексту статьи значение слова «Флажок» в кавычках равно значению слова CheckBox, флажок без кавычек обозначает квадрат с галочкой или без нее.

Кроме состояний «выбран» или «не выбран», существует и третье состояние флажка: серая галочка на сером фоне. Получить такое состояние на пользовательской форме можно путем присвоения свойству CheckBox.Value значения Null.

Три состояния элемента управления CheckBox

Надписи флажков выведены с помощью следующего кода VBA Excel:

Private Sub UserForm_Initialize()

CheckBox1.Value = False

CheckBox1.Caption = «CheckBox1.Value = « _

& CheckBox1.Value

CheckBox2.Value = Null

CheckBox2.Caption = «CheckBox2.Value = « _

& CheckBox2.Value

CheckBox3.Value = True

CheckBox3.Caption = «CheckBox3.Value = « _

& CheckBox3.Value

End Sub

Интересно было посмотреть, какое значение отобразится в надписи элемента управления CheckBox2. Обратите внимание на то, что если строку CheckBox2.Caption = "CheckBox2.Value = " & CheckBox2.Value заменить на CheckBox2.Caption = CheckBox2.Value, будет сгенерирована ошибка, так как в VBA не существует текстового отображения значения Null.

Эксперименты показали, что отобразить «Флажок» в третьем состоянии можно также с помощью присвоения свойству CheckBox.Value значения «пустая строка».

Элемент управления CheckBox может использоваться на пользовательской форме для

  • выбора или отмены каких-либо параметров и условий,
  • отображения или скрытия других элементов управления,
  • изменение доступности других элементов управления для взаимодействия с пользователем.

Если требуется выбор только одной опции из группы предложенных, для этой цели в VBA Excel используется набор элементов управления OptionButton.

Свойства элемента «Флажок»

Свойство Описание
AutoSize Автоподбор размера «Флажка». True – размер автоматически подстраивается под длину набираемой строки. False – размер элемента управления определяется свойствами Width и Height.
ControlSource Ссылка на источник данных для свойства Value.
ControlTipText Текст всплывающей подсказки при наведении курсора на CheckBox.
Enabled Возможность взаимодействия пользователя с элементом управления. True – взаимодействие включено, False – отключено (цвет флажка и надписи становится серым).
Font Шрифт, начертание и размер текста надписи.
Height Высота элемента управления.
Left Расстояние от левого края внутренней границы пользовательской формы до левого края элемента управления.
Picture Добавление изображения вместо текста надписи или дополнительно к нему.
PicturePosition Выравнивание изображения и текста в поле надписи.
TabIndex Определяет позицию элемента управления в очереди на получение фокуса при табуляции, вызываемой нажатием клавиш «Tab», «Enter». Отсчет начинается с 0.
TextAlign* Выравнивание текста надписи: 1 (fmTextAlignLeft) – по левому краю, 2 (fmTextAlignCenter) – по центру, 3 (fmTextAlignRight) – по правому краю.
Top Расстояние от верхнего края внутренней границы пользовательской формы до верхнего края элемента управления.
TripleState Определяет, может ли пользователь делать выбор между двумя состояниями «Флажка» или между тремя, включая серую галочку на сером квадрате. True – доступны три состояния, False – доступны два состояния.
Value Значение «Флажка»: True – галочка установлена, False – галочка не установлена, Null – серая галочка на сером квадрате.
Visible Видимость элемента CheckBox. True – элемент отображается на пользовательской форме, False – скрыт.
Width Ширина элемента управления.
WordWrap Перенос текста надписи на новую строку при достижении границы ее поля. True – перенос включен, False – перенос выключен.

* При загруженной в поле надписи картинке свойство TextAlign не работает, следует использовать свойство PicturePosition.

Свойство по умолчанию для элемента CheckBox – Value, основное событие – Click.

В таблице перечислены только основные, часто используемые свойства «Флажка». Все доступные свойства отображены в окне Properties элемента управления CheckBox.

Примеры использования CheckBox

Пример 1
Отображение элемента управления CheckBox на пользовательской форме с параметрами, заданными в коде VBA Excel:

Private Sub UserForm_Initialize()

  With CheckBox1

    .Caption = «Нажмите на меня»

    .ControlSource = «A1»

    .Value = False

    .Left = 12

    .Top = 12

  End With

End Sub

Элемент управления CheckBox, привязанный к ячейке

Размещается данная процедура в модуле пользовательской формы.

Если несколько элементов управления CheckBox привязать к одной ячейке, то при клике на одном из них, менять свое состояние будут и все остальные.

Пример 2
Смена надписи «Флажка» в зависимости от его состояния:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

‘Устанавливаем первоначальные

‘значения свойств «Флажка»

Private Sub UserForm_Initialize()

  With CheckBox1

    .Caption = «Поставьте галочку»

    .Value = False

    .TripleState = False

  End With

End Sub

‘Меняем надпись «Флажка» при

‘смене параметра CheckBox1.Value

Private Sub CheckBox1_Change()

  If CheckBox1.Value Then

    CheckBox1.Caption = «Снимите галочку»

  Else

    CheckBox1.Caption = «Поставьте галочку»

  End If

End Sub

Пример 3
Скрытие и отображение, изменение доступности других элементов управления с помощью «Флажка».

Для реализации этого примера необходимо создать пользовательскую форму с четырьмя элементами управления: CheckBox1, TextBox1, TextBox2 и CommandButton1. А в модуле формы разместить следующий код:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

‘Устанавливаем первоначальные

‘значения свойств элементов управления

Private Sub UserForm_Initialize()

  With CheckBox1

    .Caption = «Хочу сложить два числа»

    .Value = False

    .TripleState = False

  End With

  With TextBox1

    .Enabled = False

    .Text = «Слагаемое 1»

  End With

  With TextBox2

    .Enabled = False

    .Text = «Слагаемое 2»

  End With

  With CommandButton1

    .Caption = «Сложить»

    .Visible = False

  End With

End Sub

‘Меняем свойства других элементов

‘управления при смене состояния «Флажка»

Private Sub CheckBox1_Change()

  If CheckBox1.Value Then

    TextBox1.Enabled = True

    TextBox2.Enabled = True

    CommandButton1.Visible = True

  Else

    TextBox1.Enabled = False

    TextBox2.Enabled = False

    CommandButton1.Visible = False

  End If

End Sub

‘Складываем два числа

Private Sub CommandButton1_Click()

  If IsNumeric(TextBox1) And IsNumeric(TextBox2) Then

    MsgBox TextBox1 & » + « & TextBox2 & » = « _

    & CDbl(TextBox1) + CDbl(TextBox2)

  End If

End Sub

Форма открывается с недоступными для пользователя текстовыми полями и скрытой кнопкой «Сложить»:

После установки галочки на флажке текстовые поля становятся доступными для редактирования, и отображается кнопка «Сложить»:


This simple line allows you to add CheckBox to cell A1 and set width and height accordingly:

ActiveSheet.OLEObjects.Add "Forms.CheckBox.1", Left:=Range("A1").Left, Top:=Range("A1").Top, Width:=Range("A1").Width, Height:=Range("A1").Height

You can easily add it to CommandButton this way:

Private Sub CommandButton1_Click()

    ActiveSheet.OLEObjects.Add "Forms.CheckBox.1", Left:=Range("A1").Left, Top:=Range("A1").Top, Width:=Range("A1").Width, Height:=Range("A1").Height

End Sub

Edit Your code improved…

You simply need to add loop to insert checkboxes into several cells:

Sub YourCode_Improvment()

    Dim i
    '
    For i = 1 To 10 'cells from 1st to 10th

    ActiveSheet.CheckBoxes.Add(Cells(i, "A").Left, _
                                Cells(i, "A").Top, _
                                72, 17.25).Select
    With Selection
        .Caption = ""
        .Value = xlOff '
        .LinkedCell = "C" & i
        .Display3DShading = False
    End With
    Next
End Sub

Change this code accordingly, if needed.

 

prostor

Пользователь

Сообщений: 69
Регистрация: 04.06.2017

Здравствуйте,

Может ли кто помочь с такой не хитрой задачей: из модуля хочу добавить на лист (с привязкой к ячейке) чек-бокс и далее читать его состояние (true/false) и сохранять в массив.
И что лучше выбрать Формы или ActiveX тоже не понимаю, хоть и гуглил. Не доходит до меня…

Демо-файлик прикрепил.
Заранее, благодарю.

 

tolstak

Пользователь

Сообщений: 471
Регистрация: 01.08.2017

#2

11.08.2017 17:58:09

prostor,

Код
'Добавить чек-бокс
Sub ActiveAdd()
    Dim chBox As Object
    For Each el In Range([A2], [A2].End(xlDown))
        Set chBox = ActiveSheet.CheckBoxes.Add(el.Offset(0, 2).Left, el.Offset(0, 2).Top, el.Offset(0, 2).Width, el.Offset(0, 2).Height)
        chBox.LinkedCell = el.Offset(0, 3).Address(True, True)
    Next el
End Sub
' Удалить чек-бокс
Sub ActiveDelete()
    Dim chBox As Object
    For Each el In ActiveSheet.CheckBoxes
        el.Delete
    Next el
End Sub

'Снять показания чек-боксов и записать в массив
    Sub ActiveRead()
        Dim myArray As Variant
        myArray = Application.Transpose(Range([D2], [D2].End(xlDown)).Value)        
        For i = 1 To UBound(myArray)
            MsgBox i & " = " & myArray(i)
        Next i
    End Sub

In GoTo we trust

 

prostor

Пользователь

Сообщений: 69
Регистрация: 04.06.2017

#3

11.08.2017 19:14:21

tolstak, спасибо, все сработало.

Маленький нюансик остался — как снимать показания именно с чек-бокса, без участия колонки D ? Ну и добавлять в нее тоже ничего не надо, соответственно :)

Разобрался только, что эта строка добавляет показание чек-бокса — закоментировал ее…

Код
chBox.LinkedCell = el.Offset(0, 3).Address(True, True)

А вот как теперь снять показание с самого чек-бокса — разобраться не могу….

Изменено: prostor11.08.2017 19:34:35

 

tolstak

Пользователь

Сообщений: 471
Регистрация: 01.08.2017

#4

11.08.2017 20:16:40

prostor, тогда чуть усложняем словарем и такой-то матерью)

Код
Public chkBoxDic As Object

'Добавить чек-бокс
Sub ActiveAdd()
    ActiveDelete
    Set chkBoxDic = CreateObject("Scripting.Dictionary")
    Dim chBox As Object
    For Each el In Range([A2], [A2].End(xlDown))
        Set chBox = ActiveSheet.CheckBoxes.Add(el.Offset(0, 2).Left, el.Offset(0, 2).Top, el.Offset(0, 2).Width, el.Offset(0, 2).Height)
        'chBox.LinkedCell = el.Offset(0, 3).Address(True, True)
        chBox.Caption = el.Value
        chBox.Name = el.Value
        Set chkBoxDic(chBox.Name) = chBox
    Next el
End Sub
' Удалить чек-боксы
Sub ActiveDelete()
    Dim chBox As Object
    If Not chkBoxDic Is Nothing Then Set chkBoxDic = Nothing
        For Each el In ActiveSheet.CheckBoxes
            el.Delete
        Next el
End Sub
 
' Снять показания чек-бокса без обращения к ячейкам
Sub readDictionary()
    If chkBoxDic Is Nothing Then Exit Sub
    Dim el As Object
    For i = 0 To chkBoxDic.Count - 1
        Set el = chkBoxDic.Items()(i)
        MsgBox i & ": " & chkBoxDic.Keys()(i) & " = " & IIf(el.Value = -4146, False, True)
    Next i
End Sub

'Снять показания чек-боксов и записать в массив
Sub ActiveRead()
    myArray = Application.Transpose(Range([D2], [D2].End(xlDown)).Value)
    For i = 1 To UBound(myArray)
        MsgBox i & " = " & myArray(i)
    Next i
End Sub

Я не понимаю почему, но значение при отмеченной галке — 1, а при не выбранной — -4146 , но преобразование типа  

Код
IIf(a.Value = -4146, False, True)

работает.

Тут вот

тот же вопрос проскакивал.
Может, более опытные товарищи подскажут почему так.

In GoTo we trust

 

prostor

Пользователь

Сообщений: 69
Регистрация: 04.06.2017

tolstak, огромное спасибо! все работает.

По поводу -4146, думаю не проблема. это значение вроде как постоянное, значит с ним можно работать. верно понимаю?:)

 

tolstak

Пользователь

Сообщений: 471
Регистрация: 01.08.2017

prostor, да, так и есть. Просто непонятная какая-то константа… :)

 

prostor

Пользователь

Сообщений: 69
Регистрация: 04.06.2017

#7

16.08.2017 19:09:35

tolstak, Приветствую:)

Допиливаю ваш пример под себя и столкнулся с такой сложностью: хочу использовать ActiveAdd как процедуру с параметрами, вызывать из другого модуля, но не могу сообразить как правильно организовать вызов, с использованием цикла

Код
For Each el In Range([A2], [A2].End(xlDown)) ...

Прошу вашей помощи по этому поводу:) Файл приложил…

Заранее, благодарю.

Прикрепленные файлы

  • vba_chkBox_sub_param.xlsm (22.12 КБ)

 

tolstak

Пользователь

Сообщений: 471
Регистрация: 01.08.2017

prostor,  посмотрите в файле. Вероятно, что i и j — строка и столбец, изменил процедуру соответствующим образом. Работает,но сложилось ощущение, что вставляется не совсем так как Вами задумывалось :)

Изменено: tolstak16.08.2017 20:19:47

 

prostor

Пользователь

Сообщений: 69
Регистрация: 04.06.2017

tolstak, спасибо, все как надо, чуток подправил под себя

По ходу дела, возникла такая ситуация, что после закрытия файла и повторного открытия — считать показания чек-боксов нельзя. При этом сам excel сохраняет галочки на чек-боксах, а значит оно в прицепи где-то есть в самом файле excel, на диске…

Я понимаю, что идет чтение из словаря, пока он живой. Но интересно, как то ведь можно снимать показания с чек-боксов после «закрыл-открыл файл»?

Прикладываю файлик..

 

tolstak

Пользователь

Сообщений: 471
Регистрация: 01.08.2017

#10

16.08.2017 23:23:58

prostor, у Вас красивая логика присвоения имен чек-боксам.
Можно просто обратиться к ним по этим красивым именам.
Можно даже и без словаря обойтись в таком случае, ну да пусть будет :)

Код
Sub readDictionary()
    If chkBoxDic Is Nothing Then
        ' Еще побарахтаемся!
        'Exit Sub
        
        Dim j As Long, i As Long, cbClient As String, cbCaption As String, dicItem As String
        Set chkBoxDic = CreateObject("Scripting.Dictionary")
        'Перейти на новую строку
        For j = 2 To 18 'Цикл шага вниз, не менять. В рабочей версии - шаг динамический.
            cbClient = Cells(j, 1)
            For i = 5 To 7
                
                Select Case i
                Case 5
                cbCaption = "Да"
                Case 6
                cbCaption = "Нет"
                Case 7
                cbCaption = "Неизвестно"
                End Select
                
                dicItem = cbClient & ":" & cbCaption
                chkBoxDic.Add Key:=dicItem, Item:=ActiveSheet.CheckBoxes(dicItem)
            Next i
            j = j + 3
        Next j
    End If
    
    
    Dim el As Object
    
    
    For i = 0 To chkBoxDic.Count - 1
        Set el = chkBoxDic.Items()(i)
        MsgBox chkBoxDic.Keys()(i) & ":" & IIf(el.Value = -4146, False, True)
    Next i
End Sub

Прикрепленные файлы

  • vba_chkBox_sub_param (1).xlsm (31.24 КБ)

In GoTo we trust

 

prostor

Пользователь

Сообщений: 69
Регистрация: 04.06.2017

#11

17.08.2017 15:14:50

tolstak, спасибо:) стараюсь, учусь…

В этом варианте все срабатывает в идеале. Только не могу понять что происходит в этой строке

Код
chkBoxDic.Add Key:=dicItem, Item:=ActiveSheet.CheckBoxes(dicItem)
 

tolstak

Пользователь

Сообщений: 471
Регистрация: 01.08.2017

prostor,  в словарь chkBoxDic добавить элемент с ключом dicItem (Ваше название а-ля (Михаил.Нет.0)) и содержанием

элементом чек-бокс активного листа с именем dicItem (Ваше название а-ля (Михаил.Нет.0))

 

prostor

Пользователь

Сообщений: 69
Регистрация: 04.06.2017

tolstak, верно понимаю, что IF срабатывает когда в памяти нет словаря (после закрыл-открыл файл) — далее создается нужный словарь и в него снимается текущее состояние чек-боксов?

Сорри за дотошность, не очень хорошо еще разбираюсь в коде, хочу все-все понять…:)

 

Nordheim

Пользователь

Сообщений: 3154
Регистрация: 18.04.2017

#14

17.08.2017 15:45:47

Вот тут

Код
For i = 0 To chkBoxDic.Count - 1
        Set el = chkBoxDic.Items()(i)
        MsgBox chkBoxDic.Keys()(i) & ":" & IIf(el.Value = -4146, False, True)
Next i

я обычно использую такой код

Код
For Each ikey In  chkBoxDic.Keys
    Set el =  chkBoxDic.Item(ikey) 
    MsgBox ikey & ":" & IIf(el.Value = -4146, False, True)
next ikey

вроде как быстрей считается    

«Все гениальное просто, а все простое гениально!!!»

 

tolstak

Пользователь

Сообщений: 471
Регистрация: 01.08.2017

Nordheim, хм, действительно, выглядит изящней :)
prostor, да, так и есть. if VAR is nothing then определяет, что переменной VAR не присвоено значение. Далее мы в нее запихиваем то что есть на листе, правила наименования мы знаем.
В случае, если что-то переменной уже присвоено — подразумеваем, что именно то, что нам нужно, и с этим работаем.

 

prostor

Пользователь

Сообщений: 69
Регистрация: 04.06.2017

tolstak, Nordheim, спасибо за вашу помощь! :)

Начинаю чуток лучше разбираться в коде, мне это нравится..:)

 

prostor

Пользователь

Сообщений: 69
Регистрация: 04.06.2017

Уже было подумал, что все интересное позади, но не тут то было:) Веселье продолжается…

Такая вот ситуация: 3 колонки * 1000 строк = 3000 чекбоксов…
Итог: excel подвисает, минуты на две при добавлении чекбоксов на лист и выдает ошибку при попытке удаления чекбоксов макросом. Ну и еще притормаживает (самую малость) при скроле листа.
Вопрос: что в таких ситуация обычно делают профи? :))))

Все, на что хватило моих знаний, — отключить всякую активность excel при старте модуля и включить на финише…
Дальше пропасть. Прошу вашей помощи! Файлик с демо-данными приложил.

 

tolstak

Пользователь

Сообщений: 471
Регистрация: 01.08.2017

#18

19.08.2017 13:04:34

prostor, ну, на мой взгляд, нужно понимать ограничения программы :) Все же не рассчитана она на такое… Возможно, имеет смысл динамически — для редактируемой колонки создавать три чекбокса, с привязкой к ячейкам. Для остальных — удалять чекбоксы и хранить только значение.
По удалению попробуйте так:

Код
         For i = ActiveSheet.CheckBoxes.Count To 1 Step -1
            ActiveSheet.CheckBoxes(i).Delete
         Next i
'        For Each el In ActiveSheet.CheckBoxes
'            el.Delete
'        Next el

In GoTo we trust

 

Nordheim

Пользователь

Сообщений: 3154
Регистрация: 18.04.2017

#19

19.08.2017 13:20:04

prostor, CheckBox нужно все удалить одновременно? Если все то можно так.

Код
Sub test()
ActiveSheet.CheckBoxes.Delete
End Sub

Изменено: Nordheim19.08.2017 13:21:47

«Все гениальное просто, а все простое гениально!!!»

 

prostor

Пользователь

Сообщений: 69
Регистрация: 04.06.2017

tolstak, Nordheim, а можно как-то сделать, что бы сама ячейка реагировала на клик (событие) и красилась в цвет, без чекбоксов… ну и дальше снимать с ячейки цвет…? как вариант…:)

Или как вариант 2: поместить на лист три кнопки (Да, Нет, Неизвестно) и нажатие на кнопку добавляло значение в ячейку ряда, а выделение ряда менялось бы динамически вниз, после нажатия одной из кнопки… Только кнопки должны быть плавающие — менять положение следом за скролом:)

Изменено: prostor19.08.2017 15:14:31

 

tolstak

Пользователь

Сообщений: 471
Регистрация: 01.08.2017

#21

19.08.2017 15:33:47

prostor, можно, но к

Цитата
VBA добавить чек-бокс на лист и сохранить его значение в массив

отношения это уже явно не имеет, должна быть отдельная тема ;-)

In GoTo we trust

 

Nordheim

Пользователь

Сообщений: 3154
Регистрация: 18.04.2017

#22

19.08.2017 20:01:08

Попробуйте, может так скорость возрастет и тормоза пропадут, но не факт.

Код
Option Explicit

Sub test()
Dim dic1 As Object, i%, ikey, cell As Range
Set dic1 = CreateObject("Scripting.Dictionary")
For i = 1 To 3000
    dic1.Add CheckBoxes, 0
Next i
Set cell = Range("a1"): i = 1
Application.ScreenUpdating = False
For Each ikey In dic1.keys
    i = i +1
    cell(i, 1) = ikey.Add(cell(i, 1).Left, cell(i, 1).Top, cell(i, 1).Width, cell(i, 1).Height)
Next ikey
Columns(1).ClearContents
Application.ScreenUpdating = True
End Sub
Код
Sub test1()
ActiveSheet.CheckBoxes.Delete
End Sub

«Все гениальное просто, а все простое гениально!!!»

 

prostor

Пользователь

Сообщений: 69
Регистрация: 04.06.2017

Nordheim, что то вообще не заводится… выдает ошибку на строке dic1.Add CheckBoxes, 0. Что то про ассоциации…((

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

А может вместо настоящих ЧекБоксов использовать псевдо-чекбоксы? Не упростится задача? )
Шрифт Marlett — латинская «а»

 

prostor

Пользователь

Сообщений: 69
Регистрация: 04.06.2017

Думал об этом тоже… Но тогда возникает еще такой вопрос:
Возможно ли как то прикрутить к этому псевдо-чекбоксу, такие же свойства реагирования на события, как у настоящего. А именно: клик левой кнопкой мыши, кнопка пробел на клавиатуре?

 

Nordheim

Пользователь

Сообщений: 3154
Регистрация: 18.04.2017

#26

21.08.2017 08:24:20

Цитата
prostor написал:
Nordheim , что то вообще не заводится… выдает ошибку на строке dic1.Add CheckBoxes, 0. Что то про ассоциации…((
Код
Sub test()
Dim dic1 As Object, i%, ikey, cell As Range
With ActiveSheet
    Set dic1 = CreateObject("Scripting.Dictionary")
    For i = 1 To 3000
        dic1.Add .CheckBoxes, 0
    Next i
    Set cell = .Range("a1"): i = 1
    Application.ScreenUpdating = False
    For Each ikey In dic1.keys
        i = i + 1
        cell(i, 1) = ikey.Add(cell(i, 1).Left, cell(i, 1).Top, cell(i, 1).Width, cell(i, 1).Height)
    Next ikey
    .Columns(1).ClearContents
End With
Application.ScreenUpdating = True
End Sub

Изменено: Nordheim21.08.2017 08:26:18

«Все гениальное просто, а все простое гениально!!!»

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

#27

21.08.2017 13:23:54

Цитата
prostor написал:
Возможно ли как то прикрутить к этому псевдо-чекбоксу, такие же свойства реагирования на события

Ввод указанного символа — уже событие.  

 

prostor

Пользователь

Сообщений: 69
Регистрация: 04.06.2017

#28

21.08.2017 18:12:16

Цитата
Юрий М написал:
Ввод указанного символа — уже событие.  

Вввод символа это понятно. но всетаки хочется полный аналог чек-бокса, но без «этих тяжелых элементов». Типа, левыый клик по ячейке — отрисовалась галочка…

В случае, если вариант только ввода символа с клавиатуры, — принципиальной разницы нет, что вводить, на мой взгляд, хоть букву Ё :)

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

#29

21.08.2017 18:58:07

Вы же сами говорили, что не хотите пользоваться мышкой ))

Цитата
prostor написал:
ипа, левыый клик по ячейке — отрисовалась галочка…

Можно: событие Worksheet_SelectionChange, но тогда возможны непреднамеренные срабатывания (при ошибочном выделении ячейки мышкой или клавишами управления курсором).
Предпочтительнее использовать Worksheet_BeforeDoubleClick или Worksheet_BeforeRightClick.

 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

#30

21.08.2017 19:18:28

Код
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target(1).Address(0, 0) = "A1" Then
        Application.EnableEvents = False
        If Len(Target(1)) Then
            If Right(Target(1), 1) = " " Then
                Target(1).Value = Empty
            Else
                Target(1).Font.Name = "Wingdings"
                Target(1).Value = "ю"
            End If
        End If
        Application.EnableEvents = True
    End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target(1).Address(0, 0) = "A1" Then
        If Len(Target(1)) Then
            Target(1).Value = Empty
        Else
            Target(1).Font.Name = "Wingdings"
            Target(1).Value = "ю"
        End If
    End If
End Sub

Изменено: RAN21.08.2017 19:45:25

Следующий код, помещённый в VBA редакторе на соответствующий лист, позволяет двойным кликом левой кнопки мыши по ячейке в первом столбце устанавливать в ней попеременном галочку, либо крестик.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
 With Target
     If .Column = 1 Then
         Select Case .Value
                Case Is = "a"
                     .Font.Name = "Marlett"
                     .Value = "r"
                 Case Is = "r"
                     .Font.Name = "Marlett"
                     .Value = "a"
                 Case Else
                     .Font.Name = "Marlett"
                     .Value = "a"
         End Select
     Cancel = True
     End If
 End With
End Sub

Результат работы макроса выглядит следующим образом:

Excel_CheckBox
Источник

Комментировать

CheckBox в ячейках Excel

Следующий код, помещённый в VBA редакторе на соответствующий лист, позволяет двойным кликом левой кнопки мыши по ячейке в первом столбце устанавливать в ней попеременном галочку, либо крестик.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

With Target

If .Column = 1 Then

Select Case .Value

Case Is = «a»

.Font.Name = «Marlett»

.Value = «r»

Case Is = «r»

.Font.Name = «Marlett»

.Value = «a»

Case Else

.Font.Name = «Marlett»

.Value = «a»

End Select

Cancel = True

End If

End With

End Sub

Результат работы макроса выглядит следующим образом:

Return to VBA Code Examples

In VBA, you can create a CheckBox where a user can check or uncheck the option. Checkboxes are often used in UserForms, but can also be used in a Worksheet. In this tutorial, you will learn how to create a Checkbox (in both VBA and in Excel Worksheets), get a user choice in VBA and use it in code.

If you want to learn how to create a Listbox, click here: VBA Listbox

If you want to learn how to create a Combobox, click here: VBA Combobox

Create a Checkbox

In order to insert a Checkbox in the Worksheet, you need to go to the Developer tab, click Insert and under ActiveX Controls choose Check Box:

Vba Insert Checkbox

When you select the Checkbox which you inserted, you can click on Properties under the Developer tab:

Vba Checkbox Properties

Here you can set different properties of the Checkbox. First, we changed the attribute Name to cmbCheckbox. Next, we can use the Checkbox with this name in VBA code.

Also, we changed the text which appears next to the checkbox to Agree with Terms. To do this, you need to set the attribute Caption.

Get a Selected Item of a Checkbox in VBA

The purpose of a Checkbox is to get a user’s choice (checkbox checked or not). In order to retrieve a value that is selected by user, you need to use this code:

If Sheet1.cmbCheckBox.Value = True Then
    Sheet1.Range("C3") = "Agree"
Else
    Sheet1.Range("C3") = "Don't agree"
End If

We want to populate the cell C3 with Agree if the checkbox is checked and Don’t agree otherwise. The value of the checkbox is in the Value attribute of the object Sheet1.cmbCheckbox. The value of the checkbox can be true or false.

Vba Checkbox Get Value

As we checked the checkbox, the value of Sheet1.cmbCheckbox.Value is true, so the result in C3 is Agree.

Use a Checkbox in a UserForm

As we mentioned, Checkboxes are most often used in UserForms. To explain how you can do it, we will first insert an Userform. In the VBA Editor, right-click on Module name, click on Insert and choose UserForm:

Vba Checkbox Insert Userform

To display controls for inserting, you need to enable the Toolbox. To do this, click on the Toolbox icon in the toolbar. After that, you will get the windows with all the controls available. You can click on Checkbox to create it in the Userform:

Vba Checkbox in Userform Properties

In the properties window, we will change the name of the Checkbox to chbCheckBox and caption to Agree with Terms. When we run the Userform, we get the Checkbox in it.

Vba Checkbox in Userform

If you want to get selected value from the Checkbox, you need to use the same logic for the Checkbox in a Worksheet, which is explained earlier in the article.

VBA Coding Made Easy

Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
vba save as

Learn More!

В некоторых случаях вам может потребоваться связать или указать название заголовка флажка для ячейки. Что вы можете сделать для этого? В этой статье будет представлен метод решения этой проблемы.

Свяжите или укажите имя флажка в ячейке с кодом VBA


Свяжите или укажите имя флажка в ячейке с кодом VBA

Приведенный ниже код VBA поможет вам связать имя флажка с ячейкой в ​​Excel. Пожалуйста, сделайте следующее.

1. Установите и щелкните правой кнопкой мыши флажок, в котором необходимо указать имя заголовка для ячейки, затем щелкните Просмотреть код из контекстного меню. Смотрите скриншот:

2. в Microsoft Visual Basic для приложений окна, замените исходный код на приведенный ниже код VBA.

Код VBA: привязать имя флажка к ячейке

Private Sub CheckBox1_Click()
worksheets("Sheet1").Range("B2") = CheckBox1.Caption
End Sub

Внимание: В коде CheckBox1 — это имя флажка, на который вам нужно ссылаться, Sheet1 — это имя рабочего листа, содержащего флажок, а B2 — это ячейка назначения, с которой вы свяжете имя флажка. Пожалуйста, измените их по своему усмотрению.

3. нажмите другой + Q ключи вместе, чтобы закрыть Microsoft Visual Basic для приложений окно.

4. Выключите режим дизайна, нажав Застройщик > Режим проектирования как показано ниже.

Затем имя заголовка флажка связывается с указанной ячейкой после установки флажка, как показано ниже:


Статьи по теме:

  • Как фильтровать данные по флажку в Excel?
  • Как создать выпадающий список с несколькими флажками в Excel?
  • Как изменить указанное значение или цвет ячейки при установленном флажке в Excel?
  • Как выделить ячейку или строку с помощью флажка в Excel?
  • Как сделать прозрачный цвет фона флажка в Excel?

Лучшие инструменты для работы в офисе

Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%

  • Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
  • Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон
  • Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны
  • Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
  • Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
  • Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии
  • Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
  • Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF
  • Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.

вкладка kte 201905


Вкладка Office: интерфейс с вкладками в Office и упрощение работы

  • Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
  • Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
  • Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!

офисный дно

Комментарии (0)


Оценок пока нет. Оцените первым!

Понравилась статья? Поделить с друзьями:
  • Vba excel check if sheet exist
  • Vba excel cells формат
  • Vba excel cells строка столбец
  • Vba excel cells или range
  • Vba excel cells диапазон ячеек