Кнопка Добавить / Вычесть Excel VBA
Вот пример моего проекта на этой картинке
Мне нравится коллекционировать, поэтому я делаю инвентаризацию в Excel.
Я хочу сделать так, чтобы я мог нажать кнопку, и это влияет на следующую или предыдущую ячейку
Например:
В ячейке C3 будет кнопка " Добавить", в ячейке D3 будет количество копий этого элемента, а в ячейке E3 будет кнопка " Вычесть". Нажав кнопку в C3, он добавит еще один к номеру в ячейке D3. Если вы нажмете кнопку в С1, она будет вычтена из ячейки D3. Кажется, довольно прямо.
Вот условия, хотя:
У меня есть около 200 предметов на листе, как на 20 листах (не в примере). Мне бы хотелось, чтобы я мог добавить макросы ко всем кнопкам, не создавая новый макрос для каждой кнопки. Я также не хочу, чтобы он работал с выбранной ячейкой. Он должен воздействовать на ячейку справа для кнопки добавления и ячейку слева для кнопки вычитания.
Я искал ответ везде, и я подошел довольно близко к решению.
Это самое близкое, что я мог найти, но это не то, что я не то, к чему я стремлюсь:
Sub AddOne()
ActiveCell.Value = ActiveCell.Value + 1
End Sub
Sub SubtractOne()
ActiveCell.Value = ActiveCell.Value - 1
End Sub
Я надеюсь, что это имеет смысл, и спасибо всем за ваше время.
1 ответ
Причина, по которой ваше решение не работает, заключается в том, что 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
Разбивая это:
- Application.Caller дает вам имя звонящего, в данном случае имя кнопки
- Мы берем имя целевой ячейки с конца, пропуская первые четыре символа
- Мы выясняем, добавляем ли мы или вычитаем на основе первых трех символов
- Мы используем имя целевой ячейки для обновления ячейки листа
Затем создайте свои кнопки; добавьте кнопки управления формой в таблицу для каждой нужной вам кнопки + и -.
Для каждого присвойте ему систематическое имя на основе ячейки, на которую оно должно ориентироваться, как описано выше. Например, на скриншоте выше вы можете назвать первые две кнопки 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
Тот же код должен работать - и в этом случае будет работать на каждом листе в вашей книге.
Пример таблицы, показывающей оба примера здесь.