Worksheet_Changed生成代码的方法工作表

问题描述:

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

我将工作表设置为使用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 

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


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

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

+0

对我很好,我能够减少VBA代码,谢谢。 这是它如何为我工作: 'SHEETNAME = MONTHNAME(monat)+ “” + CStr的(雅尔) 工作表( “模板”)复制后:=工作表(Worksheets.Count) ActiveSheet.Name = sheetName' –

+1

@PhilippRosengart **干得好!** –

您应该使用VBE.VBCOMPONENT此工作表,并添加(作为字符串)你的代码其片材模块。 worksheet_change只在包含代码的工作表中起作用。

另一种方式,虽然我仍然说使用@加里的学生回答,是使用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的回答是,因为这更好的开始变得复杂非常快,如果你”重新添加大量工作表(模板工作表将会正常工作)。