2016-10-13 7 views
0

Ich habe eine Tabelle mit einer kleinen Unterroutine, die drei Dinge tun sollte, wenn die Registerkarte für das Blatt "Vorlage" angeklickt wird: 1. Erstellen Sie eine Kopie der "Vorlage" Blatt und Platzieren Sie es vor dem ursprünglichen "Vorlagen" -Blatt 2. Ändern Sie den Namen des kopierten Blattes auf das heutige Datum (13.10.2016) 3. Ändern Sie den Inhalt der Zelle B1 auf das heutige Datum (Donnerstag, 13.10.2016)Excel VBA Worksheet_activate Methode funktioniert nicht richtig

Der unten aufgelistete Code macht diese Dinge irgendwie. Die zwei Dinge, auf die ich Hilfe brauche, sind: 1. Um das zu kopierende Blatt zu erhalten, muss ich auf ein anderes Blatt klicken und dann auf das Blatt "Vorlage" zurückklicken. Ich möchte in der Lage sein, einfach auf die Registerkarte "Vorlage" zu klicken und die Kopie erstellen zu lassen, auch wenn das Blatt "Vorlage" bereits das aktive Blatt ist. 2. Aus irgendeinem Grund verhindert der VBA-Code das Löschen der Registerkarte, die erstellt wird, wenn Sie auf die Registerkarte "Vorlage" klicken.

Ich weiß, dass dies wahrscheinlich sehr einfach ist, aber ich konnte nirgendwo einen Hinweis auf dieses Verhalten finden. Jede und jede Hilfe wird sehr geschätzt.

+2

es wahrscheinlich um Ihnen helfen würde [vermeiden, mit '.Select' /' .Activate'] (http://stackoverflow.com/questions/10714251/how Vermeiden Sie die Verwendung von Select-in-Excel-VBA-Makros vollständig, da dies zu unerwarteten Ergebnissen führen kann. – BruceWayne

Antwort

0

Sie würden nicht Worksheet_Activate() verwenden, da es zusammen mit den Arbeitsblättern Kopien kopiert werden würde, so kopiert haben Arbeitsblatt generieren andere Arbeitsblätter

so dass Sie wollen Workbook_SheetActivate() Ereignishandler

auch dann verwenden, müssen Sie sein Beachten Sie, dass beim Löschen eines Blattes unmittelbar vor "Vorlage" das aktive Blatt zu "Vorlage" (das nächste) wird, wodurch der Klonvorgang aktiviert wird und es so aussieht, als ob "VBA-Code verhindert" das Löschen der Registerkarte ""

dann diesen Code eingeben Thisworkbook Codebereich:

Option Explicit 

Dim nextShtName As String 

Private Sub Workbook_SheetActivate(ByVal Sh As Object) 
    Dim newName As String 

    If nextShtName = "Template" Then 
     nextShtName = "" 
    Else 
     If Sh.Name = "Template" Then 
      newName = Format(Date, "mm-dd-yyyy") 
      If GetSheet(newName) Is Nothing Then 
       Application.EnableEvents = False 
       On Error GoTo exitsub 

       Sh.Copy before:=Worksheets("Template") 
       With ActiveSheet 
        .Range("B2").FormulaR1C1 = Format(Date, "dddd, mmm d, yyyy") 

        .Name = newName 
       End With 
exitsub: 
       Application.EnableEvents = True 
      Else 
       MsgBox "sheet '" & newName & "' already in this workbook", vbInformation 
      End If 
     End If 
    End If 

End Sub 

Function GetSheet(shtName As String) As Worksheet 
    On Error Resume Next 
    Set GetSheet = Worksheets(shtName) 
End Function 

Private Sub Workbook_SheetBeforeDelete(ByVal Sh As Object) 
    Dim i As Long 
    For i = 1 To Worksheets.Count 
     If Worksheets(i).Name = Sh.Name Then Exit For 
    Next i 
    nextShtName = Worksheets(i + 1).Name 
End Sub 
Verwandte Themen