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 就可以工作),这将很快变得复杂。