Кнопка Добавить / Вычесть 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

Разбивая это:

  1. Application.Caller дает вам имя звонящего, в данном случае имя кнопки
  2. Мы берем имя целевой ячейки с конца, пропуская первые четыре символа
  3. Мы выясняем, добавляем ли мы или вычитаем на основе первых трех символов
  4. Мы используем имя целевой ячейки для обновления ячейки листа

Затем создайте свои кнопки; добавьте кнопки управления формой в таблицу для каждой нужной вам кнопки + и -.

Для каждого присвойте ему систематическое имя на основе ячейки, на которую оно должно ориентироваться, как описано выше. Например, на скриншоте выше вы можете назвать первые две кнопки 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

Разбивая это:

  1. Имя подпрограммы важно - оно говорит Excel запускать подпрограмму всякий раз, когда пользователь нажимает на любую ячейку
  2. Target Параметр - это ячейка, по которой щелкнул пользователь, но это также может быть перетаскивание. Сначала мы проверяем, что размер равен ровно 1, и завершаем работу, если это не так.
  3. Затем мы проверяем его значение либо + или же - значение. Обратите внимание, что нам не нужно проверять кавычки.
  4. Затем мы используем Offset Команда, чтобы найти ячейку слева или справа, в зависимости от того, имеем ли мы дело с + или же - стартовая ячейка
  5. Как только у нас появится числовая ячейка, мы сначала ее выбираем, затем меняем ее значение вверх или вниз

Причина, по которой мы выбираем числовую ячейку, заключается в том, что она перемещает выделение из + или же - ячейка, так что вы можете нажать на нее еще раз. Если вы когда-нибудь захотите поработать с этими ячейками, вам нужно временно отключить эту сабвуфер, например, вставив Exit Sub линия наверху.

Небольшая заметка: Worksheet_SelectionChange это то, что вы использовали бы, если бы вы работали в макросе листа:введите описание здесь

Если вы работаете в ThisWorkbook модуль, вы захотите использовать подпункт изменения глобального выбора:

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    'Code goes in here
End Sub

Тот же код должен работать - и в этом случае будет работать на каждом листе в вашей книге.


Пример таблицы, показывающей оба примера здесь.