Worksheet_Changed 代码生成工作表的方法
Worksheet_Changed Method for code generated Worksheet
我正在通过代码创建作品sheet 并增加一些价值。
现在我想检查一下 C 列中的值是否已更改,并且也想更改 D 列的值。
我找到了 sub Worksheet_Change 来做到这一点。但是这个方法不适用于我创建的作品sheet,它适用于我来自的sheet。
有人可以帮我吗?
我正在使用 ws.activate 将 Worksheet 设置为活动状态,但它并没有像我希望的那样工作。
Sub Test()
Dim monat As Integer
Dim jahr As Integer
Dim tag As Integer
Dim anzahlTage As Integer
Dim ws As Worksheet
Dim kalenderTag As Date
On Error GoTo Fehler
jahr = Worksheets("Kalender erstellen").Cells(2, 2).Value
monat = Worksheets("Kalender erstellen").Cells(2, 1).Value
anzahlTage = DateSerial(jahr, monat + 1, 1) _
- DateSerial(jahr, monat, 1)
Set ws = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
ws.Name = MonthName(monat) + " " + CStr(jahr)
ws.Cells(1, 1) = "Datum"
ws.Cells(1, 2) = "Wochentag"
ws.Cells(1, 3) = "Beginn"
ws.Cells(1, 4) = "Ende"
ws.Cells(1, 5) = "Stunden"
ws.Cells(1, 6) = "Über-/Unterstunden"
ws.Cells(1, 8) = "Stunden gesamt"
ws.Cells(1, 9) = "Urlaub gesamt"
ws.range("A1", "I33").HorizontalAlignment = xlCenter
ws.range("A1", "I1").Font.FontStyle = "Bold"
ws.Columns("B").ColumnWidth = 20
ws.Columns("F").ColumnWidth = 20
ws.Columns("H").ColumnWidth = 25
ws.Columns("I").ColumnWidth = 25
ws.range("A2", "I2").MergeCells = True
ws.Activate
For tag = 1 To anzahlTage
kalenderTag = DateSerial(jahr, monat, tag)
ws.Cells(tag + 2, 1) = kalenderTag
ws.Cells(tag + 2, 2) = Format$(kalenderTag, "dddd")
Next tag
'Dim rng As range
'Set rng = ActiveSheet.range("A1", "F1")
'With rng.Borders
'.LineStyle = xlContinous
'.Color = vbBlack
'.Weight = xlThin
'End With
'MsgBox (anzahlTage)
Exit Sub
Fehler:
MsgBox "FehlerNr.: " & Err.Number & vbNewLine & vbNewLine _
& "Beschreibung: " & Err.Description _
, vbCritical, "Fehler"
End Sub
Private Sub Worksheet_Change(ByVal Target As range)
If Not Application.Intersect(Target, range("C3", "C33")) Is Nothing Then
MsgBox ("TEST")
End If
End Sub
要使代码在新创建的作品sheet中工作,必须将其插入到新sheet的作品sheet代码中。
.Copy
已经安装了宏的现有作品sheet 比 .Add
新作品sheet.
您获得的额外好处是 .Copied
作品 sheet 可以有 pre-formatted 列、行、headers 等
您应该使用此作品的 VBE.VBCOMPONENTsheet 并将您的代码添加(作为字符串)到其 sheet 模块中。 worksheet_change 仅在保存代码的 sheet... 中有效。
另一种方法,虽然我仍然会说使用@Gary 的学生回答,但使用 Workbook_SheetChange
事件。
将此代码添加到任何普通模块:
Option Explicit
Public SheetCodeName As String
Sub CreateSheet()
Dim wrkSht As Worksheet
'Add the worksheet and remember the codename for it.
Set wrkSht = ThisWorkbook.Worksheets.Add
SheetCodeName = wrkSht.CodeName
End Sub
在ThisWorkBook
模块中:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Sh.CodeName = SheetCodeName Then
If Not Application.Intersect(Target, Range("C3", "C33")) Is Nothing Then
MsgBox ("TEST")
End If
End If
End Sub
正如我所说 - Garys 的回答更好,因为如果您添加大量 sheets(模板 sheet 就可以工作),这将很快变得复杂。
我正在通过代码创建作品sheet 并增加一些价值。 现在我想检查一下 C 列中的值是否已更改,并且也想更改 D 列的值。 我找到了 sub Worksheet_Change 来做到这一点。但是这个方法不适用于我创建的作品sheet,它适用于我来自的sheet。 有人可以帮我吗?
我正在使用 ws.activate 将 Worksheet 设置为活动状态,但它并没有像我希望的那样工作。
Sub Test()
Dim monat As Integer
Dim jahr As Integer
Dim tag As Integer
Dim anzahlTage As Integer
Dim ws As Worksheet
Dim kalenderTag As Date
On Error GoTo Fehler
jahr = Worksheets("Kalender erstellen").Cells(2, 2).Value
monat = Worksheets("Kalender erstellen").Cells(2, 1).Value
anzahlTage = DateSerial(jahr, monat + 1, 1) _
- DateSerial(jahr, monat, 1)
Set ws = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
ws.Name = MonthName(monat) + " " + CStr(jahr)
ws.Cells(1, 1) = "Datum"
ws.Cells(1, 2) = "Wochentag"
ws.Cells(1, 3) = "Beginn"
ws.Cells(1, 4) = "Ende"
ws.Cells(1, 5) = "Stunden"
ws.Cells(1, 6) = "Über-/Unterstunden"
ws.Cells(1, 8) = "Stunden gesamt"
ws.Cells(1, 9) = "Urlaub gesamt"
ws.range("A1", "I33").HorizontalAlignment = xlCenter
ws.range("A1", "I1").Font.FontStyle = "Bold"
ws.Columns("B").ColumnWidth = 20
ws.Columns("F").ColumnWidth = 20
ws.Columns("H").ColumnWidth = 25
ws.Columns("I").ColumnWidth = 25
ws.range("A2", "I2").MergeCells = True
ws.Activate
For tag = 1 To anzahlTage
kalenderTag = DateSerial(jahr, monat, tag)
ws.Cells(tag + 2, 1) = kalenderTag
ws.Cells(tag + 2, 2) = Format$(kalenderTag, "dddd")
Next tag
'Dim rng As range
'Set rng = ActiveSheet.range("A1", "F1")
'With rng.Borders
'.LineStyle = xlContinous
'.Color = vbBlack
'.Weight = xlThin
'End With
'MsgBox (anzahlTage)
Exit Sub
Fehler:
MsgBox "FehlerNr.: " & Err.Number & vbNewLine & vbNewLine _
& "Beschreibung: " & Err.Description _
, vbCritical, "Fehler"
End Sub
Private Sub Worksheet_Change(ByVal Target As range)
If Not Application.Intersect(Target, range("C3", "C33")) Is Nothing Then
MsgBox ("TEST")
End If
End Sub
要使代码在新创建的作品sheet中工作,必须将其插入到新sheet的作品sheet代码中。.Copy
已经安装了宏的现有作品sheet 比 .Add
新作品sheet.
您获得的额外好处是 .Copied
作品 sheet 可以有 pre-formatted 列、行、headers 等
您应该使用此作品的 VBE.VBCOMPONENTsheet 并将您的代码添加(作为字符串)到其 sheet 模块中。 worksheet_change 仅在保存代码的 sheet... 中有效。
另一种方法,虽然我仍然会说使用@Gary 的学生回答,但使用 Workbook_SheetChange
事件。
将此代码添加到任何普通模块:
Option Explicit
Public SheetCodeName As String
Sub CreateSheet()
Dim wrkSht As Worksheet
'Add the worksheet and remember the codename for it.
Set wrkSht = ThisWorkbook.Worksheets.Add
SheetCodeName = wrkSht.CodeName
End Sub
在ThisWorkBook
模块中:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Sh.CodeName = SheetCodeName Then
If Not Application.Intersect(Target, Range("C3", "C33")) Is Nothing Then
MsgBox ("TEST")
End If
End If
End Sub
正如我所说 - Garys 的回答更好,因为如果您添加大量 sheets(模板 sheet 就可以工作),这将很快变得复杂。