Причина, по которой ваше решение не работает, состоит в том, что значение ActiveCell
рабочего листа не изменяется, когда пользователь нажимает кнопку - они нажимают на кнопку, а не на ячейку.
Есть несколько способов справиться с этим. Либо вы можете создать множество кнопок и иметь один общий сабвуфер для выполнения работы, либо вы можете перехватить событие смены ячейки и ответить на него. Первый будет намного приятнее для пользователя, но это больше работы для первоначальной настройки.
Способ 1: кнопки
Этот метод использует имя кнопки для выполнения соответствующего действия в соответствующей ячейке. В качестве обзора создайте все свои кнопки и попросите каждую из них вызывать один и тот же универсальный сабвуфер VBA, который, в свою очередь, определит, какая кнопка вызывала его, и выполнит соответствующую операцию.
Предположим, вы будете называть ваши кнопки такими, как ADD_D3
и SUB_D3
, например, чтобы увеличить / уменьшить значение в D3.
Сначала создайте подпрограмму для работы в VBA:
Sub AdjustValue()
Dim btnName As String
Dim targetCell As String
Dim addAmount As Integer
btnName = Application.Caller
targetCell = Mid(btnName, 5, Len(btnName))
addAmount = IIf(Left(btnName, 3) = "ADD", 1, -1)
ActiveSheet.Range(targetCell).Value = _
ActiveSheet.Range(targetCell).Value + addAmount
End Sub
Разбивая это:
- Заявка.Звонящий дает вам имя звонящего, в данном случае название кнопки
- Мы берем имя целевой ячейки с конца, пропуская первые четыре символа
- Мы выясняем, добавляем мы или вычитаем на основе первых трех символов
- Мы используем имя целевой ячейки для обновления ячейки листа
Затем создайте свои кнопки; добавьте кнопки управления формой в таблицу для каждой нужной вам кнопки + и - .
Для каждого присвойте ему систематическое имя на основе ячейки, на которую оно должно ориентироваться, как описано выше. Например, на скриншоте выше вы можете назвать первые две кнопки ADD_D3
и SUB_D3
.
Чтобы переименовать кнопку, щелкните ее правой кнопкой мыши, чтобы выбрать ее, а затем в поле адреса в верхнем левом углу листа перезаписать имя (например, кнопку 1) новым именем:
Наконец, вышесказанное должно работать и для нескольких листов, так как подпрограмма использует ActiveSheet
для доступа к ячейке.
Способ 2: изменение выбора
Это намного проще в настройке, но немного хакерский. Во-первых, настройте свой лист с символами плюс и минус в каждой ячейке, раскрасив их так, как вы хотите, чтобы они выглядели как кнопки. Например:
Обратите внимание, что вы должны использовать одинарную кавычку ('), чтобы поместить символ в ячейку как текст, например '-
и '+
(это видно на панели формул в верхней части примера).
Затем создайте одну подпрограмму для ответа на одну из выбранных ячеек:
Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim numCell As Range
If Target.Count <> 1 Then Exit Sub
If Target.Value = "+" Then
Set numCell = Target.Offset(0, -1)
numCell.Select
numCell.Value = numCell.Value + 1
ElseIf Target.Value = "-" Then
Set numCell = Target.Offset(0, 1)
numCell.Select
numCell.Value = numCell.Value - 1
End If
End Sub
Разбивая это:
- Имя подпрограммы важно - оно говорит Excel запускать подпрограмму всякий раз, когда пользователь нажимает на любую ячейку
- Параметр
Target
- это ячейка, по которой щелкнул пользователь, но это также может быть перетаскивание. Сначала мы проверяем, что размер равен ровно 1, и завершаем работу, если это не так.
- Затем мы проверяем его значение на
+
или -
значение. Обратите внимание, что нам не нужно проверять кавычки.
- Затем мы используем команду «
Offset
чтобы найти ячейку слева или справа, в зависимости от того, имеем ли мы +
или -
начальную ячейку
- Как только у нас появится числовая ячейка, мы сначала ее выбираем, затем меняем ее значение вверх или вниз
Причина, по которой мы выбираем числовую ячейку, заключается в том, что она перемещает выделение из +
или -
, чтобы вы могли щелкнуть ее еще раз. Если вы когда-нибудь захотите поработать с этими ячейками, вам необходимо временно отключить эту подпрограмму, например, поместив строку « Exit Sub
выхода» вверху.
Небольшое примечание: Worksheet_SelectionChange
- это то, что вы использовали бы, если бы работали в макросе листа:
Если вы работаете в модуле ThisWorkbook
, вам нужно использовать подпункт глобального изменения выбора:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
'Code goes in here
End Sub
Тот же код должен работать - и в этом случае будет работать на каждом листе в вашей книге.
Пример таблица показывает как примеры здесь.