2

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

Этот код ниже тот, который у меня есть, но он относится только к одной строке, для которой он написан:

Sub CopyValue()

    ActiveSheet.Range("O7").Value = ActiveSheet.Range("K7")
    ActiveSheet.Range("R7").Value = ActiveSheet.Range("N7")

End Sub

и копирует содержимое ячейки K7 содержимое ячейки O7 и т. д.

Если я скопирую кнопку в следующую строку, она не будет работать для этой строки, если я не зайду и не изменю код, что означает добавление новой кнопки или имени макроса и кода для этого.

Я хочу просто скопировать и добавить строку ниже снова и снова, и она будет работать в этой строке. Формулы ячеек работают таким образом, но как вызвать формулу ячейки одним нажатием кнопки в той же строке?

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

У меня Excel 2007.

2 ответа2

0

Вы можете использовать следующий код VBA, чтобы достичь своей цели гораздо проще, чем генерировать код для отдельных кнопок ActiveX или Form Control.

Следующий VBA позволяет пользователю дважды щелкнуть ячейку в указанном столбце ("столбец кнопки"), и код скопирует значения в той же строке, которую пользователь дважды щелкнул, из указанного в столбцах источника и назначения. Этот код работает со всеми строками на рабочем листе, не требуя изменения кода.

Не поддавайтесь повторным ссылкам кода на ячейки в строке 1 (например, O1 и K1). В каждом из этих случаев .Column используется, потому что нас интересует только рассматриваемый столбец . Строка, которой будут манипулировать, всегда та же самая строка, которую пользователь дважды щелкает

В редакторе Excel VBA (нажмите Alt+F11, чтобы открыть) перейдите к модулю рабочей таблицы и вставьте следующий код:

Private Sub
Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
On Error GoTo Quit
'Copy values between columns on same row that user double-clicks

'Quit if Target range includes more than one cell
If Target.Count > 1 Then Exit Sub

With ActiveSheet

    'Here, specify the worksheet column the user can double-click to activate this
    'routine.  For the "B" column, in the Range method specify cell "B1" (all cells
    'in column will be used, not just that on row 1).
    If Target.Column = .Range("B1").Column Then
        .Cells(Target.Row, .Range("O1").Column) = .Cells(Target.Row, .Range("K1").Column)
        .Cells(Target.Row, .Range("R1").Column) = .Cells(Target.Row, .Range("N1").Column)

        Cancel = True   'Cancel the double-click
    End If

    'Here you can specify a second "button column" with its own set of copy actions.
    If Target.Column = .Range("C1").Column Then
        .Cells(Target.Row, .Range("E1").Column) = .Cells(Target.Row, .Range("F1").Column)
        .Cells(Target.Row, .Range("G1").Column) = .Cells(Target.Row, .Range("H1").Column)

        Cancel = True   'Cancel the double-click
    End If

End With

Quit:
End Sub

Как написано, код будет запущен, когда пользователь дважды щелкнет любую ячейку в столбце B Чтобы изменить это, измените эту строку кода так, чтобы она указала на столбец, который вы хотите использовать в качестве "столбца кнопки":

If Target.Column <> .Range("B1").Column Then Exit Sub

Остальная часть кода должна быть понятна, но задавайте любые вопросы, которые у вас есть.

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

-2

Я бы предложил метод « ячейка как кнопка», использующий двойной щелчок на ячейке в столбце Z для запуска макроса события листа Worksheet_BeforeDoubleClick .

Щелкните правой кнопкой мыши на вкладке имени листа и выберите « View Code . Когда VBE откроется, вставьте следующее в лист под названием что-то вроде Book1 - Sheet1 (Код) . Обратите внимание, что это не лист модуля, как тот, который содержит ваш предыдущий код, использованный в качестве примера.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Not Intersect(Target, Range("Z:Z")) Is Nothing Then
        If LCase(Target.Value) = "xfer vals" Then
            Cancel = True
            Me.Range("O" & Target.Row) = Me.Range("K" & Target.Row).Value
            Me.Range("R" & Target.Row) = Me.Range("N" & Target.Row).Value
        End If
    End If
End Sub

Вставив это в кодовую таблицу рабочего листа, настройте диапазон Z:Z на любой столбец, который вы хотите использовать в качестве псевдокнопок. Я также добавил условие, что ячейки должны содержать некоторую форму значений xfer в виде текстового значения, поэтому измените его, если хотите. После завершения изменений нажмите Alt+Q, чтобы вернуться к рабочему листу.

В столбце Z введите xfer vals (или то, на что вы его изменили), в ячейку, содержащую значения, которые вы хотите передать. Дайте ячейке фоновую заливку и / или границу, если хотите. Двойной щелчок по нему передаст значения.

Вы должны быть в состоянии скопировать эту строку формулы (ов)/ значения (ей)/ псевдокнопки в любую новую строку и заставить кнопку работать в соответствии с новой строкой.

Обратите внимание, что я изменил .Values от места назначения до источника. Если вы собираетесь использовать его только на одной стороне строки кода, источник является подходящим местом для его использования.

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