Worksheet_Changed方法用于生成工作表的代码



我正在通过代码创建一个工作表并添加一些值。现在我想检查一下C列的值是否改变了,也想改变D列的值。我找到了子Worksheet_Change来做到这一点。但这个方法不适用于我创建的工作表,它适用于我来自的工作表。有人能帮帮我吗?

我正在使用ws将工作表设置为活动状态。激活了,但是它没有像我希望的那样工作。

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

要使代码在新创建的工作表中工作,必须将其插入到新工作表的工作表代码中。


将已安装宏的现有工作表.Copy比将新工作表.Add更容易。

你得到额外的好处,.Copied工作表可以有预格式化的列,行,标题等

您应该使用VBE。这个工作表的VBCOMPONENT组件,并将你的代码(作为字符串)添加到它的工作表模块中。worksheet_change只在工作表中起作用…

另一种方法,虽然我仍然说使用@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的答案是更好的,因为如果你添加了很多表格(一个模板表格就可以了),这将很快变得复杂。

最新更新