Worksheet_Changed代码生成工作表的方法

时间:2016-10-10 12:22:00

标签: vba excel-vba worksheet excel

我按代码创建工作表并添加一些值。 现在我想检查列C中的值是否已更改,并且还要更改列D的值。 我找到了子Worksheet_Change来做到这一点。但是这种方法对我创建的工作表不起作用,它适用于我来自的工作表。 有人能帮帮我吗?

我使用ws.activate将工作表设置为活动状态,但它无法正常工作。

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

3 个答案:

答案 0 :(得分:1)

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

更容易.Copy现有工作表已安装宏的工作表,而不是.Add新工作表。

您可以获得额外的好处,即.Copied工作表可以预先格式化列,行,标题等。

答案 1 :(得分:0)

您应该使用此工作表的VBE.VBCOMPONENT并将您的代码添加(作为字符串)到其工作表模块中。 worksheet_change仅适用于保存代码的工作表....

答案 2 :(得分:0)

另一种方式,虽然我仍然说使用@ 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的回答更好,因为如果您要添加大量工作表(模板工作表可以正常工作),这会很快变得复杂。