Макрос запуска автоматически при изменении значения ячейки | Excel | VBA | - PullRequest
0 голосов
/ 25 мая 2019

Лист 1 как ВВОДНОЕ ЗНАЧЕНИЕ

enter image description here

Лист 2 как МОЕ ЗНАЧЕНИЕ и ДАННЫЕ

enter image description here

Ссылка на значение листа из значения Sheet1 используется с помощью =Sheet1!E4

Я хочу избежать события onclick Button =>, как только значение на листе 1 изменится на 10, а затем значение My на листе 2 изменится.в 10 => затем, принимая значение, которое изменяется на листе 2, макросы должны автоматически обнаруживать изменение значения в том виде, в котором оно произошло, тогда печать данных должна происходить столько раз, сколько в столбце I

Модуль 1 мои макросы :

Sub mac()

Dim ws As Worksheet
Dim rDest As Range
Dim lCount As Long
Dim sValue As String

Set ws = ActiveWorkbook.ActiveSheet
Set rDest = ws.Range("I2")

With ws.Range(rDest, ws.Cells(ws.Rows.Count, rDest.Column).End(xlUp))
    If .Row >= rDest.Row Then .ClearContents
End With

lCount = Val(ws.Range("E4").Value)
sValue = ws.Range("E8").Value

If lCount > 0 Then rDest.Resize(lCount) = sValue

End Sub

Лист 2: Код

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Range("E4"), Range(Target.Address)) Is Nothing Then
Call mac
End Sub

Вывод: должно быть так, как показано ниже Вывод изображения : https://i.stack.imgur.com/voz7g.png

1 Ответ

2 голосов
/ 25 мая 2019

Мало вещей

  • Ваша Worksheet_Change процедура должна быть в Sheet1 коде вместо Sheet2 - наименьшее из того, как вы сформулировали свой вопрос.

  • Также будьте явными с вашими Worksheet декларациями (например, Sheets("Sheet1")) , вместо того, чтобы использовать такие вещи, как ActiveSheet

  • В вашем Intersect, запись Range(Target.Address) полностью избыточна, так как Target уже является Range объектом.

Ваш код в Sheet1 должен быть:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Sheets("Sheet1").Range("E4"), Target) Is Nothing Then
       Call mac
    End If
End Sub

И в Module

Private Sub mac()

Dim ws As Worksheet
Dim rDest As Range
Dim lCount As Long
Dim sValue As String

Set ws = ThisWorkbook.Sheets("Sheet2") ' note the explicit declaration
Set rDest = ws.Range("I2")

With ws.Range(rDest, ws.Cells(ws.Rows.Count, rDest.Column).End(xlUp))
    If .Row >= rDest.Row Then .ClearContents
End With

lCount = Val(ws.Range("E4").Value)
sValue = ws.Range("E8").Value

If lCount > 0 Then rDest.Resize(lCount) = sValue

End Sub

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

В качестве хорошего примера объяснения, проверьте этот вопрос / ответ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...