Кнопка добавления / вычитания Excel VBA

вот пример моего проекта на этой картинке

enter image description here

Мне нравится собирать, поэтому я делаю инвентаризационную ведомость в Excel.

Я хочу сделать так, чтобы я мог нажать кнопку, и это влияет на следующую или предыдущую ячейку

например:

ячейка C3 будет иметь добавить кнопка, ячейка D3 будет иметь количество копий этого элемента, а ячейка E3 будет иметь вычесть кнопка. Нажав на кнопку в C3, он добавит еще один номер в ячейку D3. Если вы нажмете кнопку в C1, она вычитается из ячейки D3. Выглядит довольно прямолинейно.

хотя вот условия:

У меня есть 200 элементов на листе на 20 листах (не в Примере). Я хотел бы каким-то образом добавить макросы ко всем кнопкам без необходимости создавать новый макрос для каждой кнопки. Я также не хочу, чтобы он работал с выбранной ячейкой. Это должно повлиять на ячейку справа для кнопки добавления и ячейку слева для кнопки вычитания.

Я везде искал ответ, и я подошел довольно близко к решению.

это самое близкое, что я мог бы найти, но его не то, что я не то, что я курю для:

 Sub AddOne()
 ActiveCell.Value = ActiveCell.Value + 1
 End Sub

 Sub SubtractOne()
 ActiveCell.Value = ActiveCell.Value - 1
 End Sub

Я надеюсь, что это имеет смысл, и спасибо всем за ваше время.

11
задан Keltari
20.04.2023 0:47 Количество просмотров материала 2634
Распечатать страницу

1 ответ

причина, по которой ваше решение не работает, заключается в том, что рабочий лист 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:

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

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

для каждой ячейки присвойте ей систематическое имя, основанное на ячейке, на которую она должна быть нацелена, как описано выше. Например, на скриншоте выше вы можете назвать первые две кнопки ADD_D3 и SUB_D3.

Чтобы переименовать кнопку, щелкните ее правой кнопкой мыши и выберите поле адреса в левом верхнем углу листа замените имя (например, кнопка 1) новым именем:

enter image description here

наконец, вышеизложенное должно работать и для нескольких листов, так как sub использует ActiveSheet для доступа к ячейке.


Способ 2: Изменение

это намного проще в настройке, но немного хаки. Сначала настройте лист с символами "плюс" и "минус" в каждой ячейке, раскрашивая их так, как вам нужно сделайте их более похожими на кнопки. Например: enter image description here

обратите внимание, что вы должны использовать одну кавычку ( ' ), чтобы поместить символ в ячейку в виде текста, например '- и '+ (это видно в строке формул в верхней части примера).

затем создайте одну процедуру для ответа на одну из выбранных ячеек:

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:

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

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

небольшое замечание: Worksheet_SelectionChange это то, что если бы вы работали в лист макро: enter image description here

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

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

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


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

4
отвечен Geoff 2023-04-21 08:35

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя

Похожие вопросы про тегам:

microsoft-excel
microsoft-excel-2007
microsoft-excel-2010
vba
worksheet-function
Вверх