причина, по которой ваше решение не работает, заключается в том, что рабочий лист ActiveCell
значение не изменяется, когда пользователь нажимает на кнопку-они нажимают на кнопку, а не на ячейку.
есть несколько способов решения этой. Либо вы можете создать много кнопок и иметь один общий sub для выполнения работы, либо вы можете перехватить событие изменения ячейки и ответить на него. Первый будет намного приятнее для пользователя, но больше работы для первоначальной настройки.
способ 1: кнопки
этот метод использует имя кнопки для выполнения соответствующего действия в соответствующей ячейке. В качестве обзора создайте все свои кнопки и каждый вызовите один и тот же общий VBA sub, который, в свою очередь, выяснит, какая кнопка вызвала его, и выполните соответствующую операцию.
предположим, вы будете называть ваши кнопки вещи, как 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
Breaking it down:
- приложение.Caller дает вам имя вызывающего абонента, в этом случае имя кнопки
- мы берем имя целевой ячейки с конца, пропуская первые четыре символа
- мы выясняем, складываем или вычитаем, основываясь на первых трех символах
- мы используем имя целевой ячейки для обновления листа cell
далее создайте свои кнопки; добавьте кнопки управления формой в электронную таблицу для каждого из + и - кнопки, которые вам нужны.
для каждой ячейки присвойте ей систематическое имя, основанное на ячейке, на которую она должна быть нацелена, как описано выше. Например, на скриншоте выше вы можете назвать первые две кнопки ADD_D3
и SUB_D3
.
Чтобы переименовать кнопку, щелкните ее правой кнопкой мыши и выберите поле адреса в левом верхнем углу листа замените имя (например, кнопка 1) новым именем:
наконец, вышеизложенное должно работать и для нескольких листов, так как sub использует 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
Breaking it down:
- имя подводной лодки важно-он говорит Excel для того чтобы побежать ваше суб всякий раз, когда пользователь нажимает на любую ячейку
- на
Target
параметр-это ячейка, на которую нажал пользователь, но это также может быть выделение перетаскиванием. Сначала мы проверяем, что размер равен 1, и выходим, если это не так.
- Далее мы проверяем его значение для
+
или -
значение. Обратите внимание, что нам не нужно проверять кавычки.
- затем мы используем
Offset
команду, чтобы найти ячейку влево или вправо, в зависимости от того, имеем ли мы дело с +
или -
начальную ячейку
- после того, как у нас есть номер ячейки, мы выбираем его первым, а затем изменить его значение вверх или вниз
причина, по которой мы выбираем номер ячейки является то, что он перемещает выделение off+
или -
ячейки, так что вы можете нажать ее снова. Если вы когда-нибудь захотите работать с этими ячейками, вам нужно временно отключить эту подменю, например, введя Exit Sub
строка сверху.
небольшое замечание: Worksheet_SelectionChange
это то, что если бы вы работали в лист макро:
если вы работаете в ThisWorkbook
модуль, вы хотите использовать глобальное изменение выбора sub:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
'Code goes in here
End Sub
один и тот же код должен работать и в этом случае будет работать на каждом листе в книге.
пример таблицы, показывающей оба примера здесь.