Я только что создал новый файл и поместил данные (строки от A1 до A10), и я хотел бы знать, как получать данные из ячейки каждый раз, когда вы нажимаете на ячейку A, если она не пуста (пример: когда я нажимаю на третья строка столбца 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
Возможно, worksheet_change даже относится к рабочей книге, отличной от рабочей книги с кодом. Однако для этого потребуется, чтобы код знал, что такое вновь созданный wb. Вам нужно будет открыть второй WB, который содержит код
мой лист создается при запуске моего макроса, поэтому я не могу вставить код, пока мой лист еще не существует. Я уже видел вашу ссылку, но я хочу, чтобы она была общей для моей функции, чтобы она не вставлялась при каждом создании листа.
@mordiop, так это новый WS или новый WB, который вы создаете каждый раз?
Я создаю новый лист в своем wb, как указано в моем примере «sheet.add». Метод тестирования создает новый лист каждый раз, когда я его использую.
Событие 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
РЕДАКТИРОВАТЬ
Если вы хотите указать диапазон, в котором событие должно срабатывать
'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
Я взял ваш код, и он работает. Но здесь каждое изменение ячейки запускает метод, и я хочу, чтобы он был только в столбце B. Если я нажму на ячейку в столбце B, он запустится. Спасибо. Спасибо.
Я добавил код, с помощью которого вы можете указать диапазон @mordiop
Вы запрашиваете код VBA, поэтому его нужно поместить в рабочую книгу, которую вы создаете. Для чего вам нужно получить значение в выбранной ячейке? Если это для более поздней процедуры, вы можете получить ее для чего-то еще, но вам все равно нужен код.