4

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

Мне нравится коллекционировать, поэтому я делаю инвентаризацию в 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 ответ1

4

Причина, по которой ваше решение не работает, состоит в том, что значение 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. Заявка.Звонящий дает вам имя звонящего, в данном случае название кнопки
  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

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


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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .