Ячейка клика по событию - PullRequest
1 голос
/ 10 апреля 2019

Я только что создал новый файл и поместил данные (строки от А1 до А10), и я хотел бы знать, как получать данные из ячейки каждый раз, когда вы нажимаете на ячейку А, если она не пуста (пример: когда Я нажимаю на третью строку столбца A, чтобы иметь его значение). Я видел метод «Worksheet_SelectionChange», но он не может работать с моим примером, потому что мы должны открыть код файла и поместить в него функцию, и я хочу сделать это непосредственно при создании файла. Это мой пример

sub test(name as string)
  sheet.add

  ActiveSheet.name=name
  i=2

  while i < 10 
    cells(i,1)=i
    i=i+i
  Wend
end sub

1 Ответ

1 голос
/ 10 апреля 2019
Событие

A Worksheet_SelectionChange не обязательно должно находиться в модуле, специфичном для листа. Например, он также может находиться в class module и, что важно для этого экземпляра, в модуле ThisWorkbook (хотя там он называется событием Workbook_SheetSelectionChange).

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

'place in the ThisWorkbook module
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

'Do stuff

MsgBox "Changes were made in worksheet: " & Sh.Name, vbInformation

End Sub

Если вы хотите запустить событие только на последней сделанной WS

1) Вы можете быть уверены, что последний сделанный WS всегда будет последним в WB

'In a regular module
Sub addnwsheet()
Dim shtname As String

With ThisWorkbook

shtname = "temp" & .Sheets.Count
'add a sheet at the end
.Sheets.Add(after:=.Sheets(.Sheets.Count)).Name = shtname

End With

End Sub

'place in the ThisWorkbook module
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

If Sh.Index = ThisWorkbook.Sheets.Count Then
    'Do stuff

    MsgBox "Selection changed in worksheet: " & Sh.Name, vbInformation
End If

End Sub

2) Более безопасный способ - объявить вновь созданный лист как переменную Global. Они постоянны и общедоступны.

'In a regular module
Global nwsht As Sheet

Sub addnwsheet()
Dim shtname As String

With ThisWorkbook

    shtname = "temp" & .Sheets.Count
    'add a sheet at the end
    .Sheets.Add(after:=.Sheets(.Sheets.Count)).Name = shtname
    Set nwsht = .Sheets(shtname)

End With

End Sub

'place in the ThisWorkbook module
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

If Sh = nwsht Then
    'Do stuff

    MsgBox "Selection changed in worksheet: " & Sh.Name, vbInformation
End If

End Sub

EDIT

Если вы хотите указать диапазон, событие должно сработать на

'place in the ThisWorkbook module
    Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    Dim r as Range
    Set r = Workbooks(REF).Sheets(REF).Range("D2:D100") 'event will only get triggered by this range

    If Not Intersect(Target, r) Is Nothing Then
        'Do stuff

        MsgBox "Selection changed in worksheet: " & Sh.Name, vbInformation
    End If

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