Microsoft Excel

Herbers Excel/VBA-Archiv

Änderungsprotokoll! Aber NICHT für alle Blätter? | Herbers Excel-Forum


Betrifft: Änderungsprotokoll! Aber NICHT für alle Blätter? von: Gero
Geschrieben am: 18.11.2009 10:56:54

Hallo liebe Profis,
kurze Frage:

Ich will Änderungen meiner Arbeitsmappe / Tabellenblätter protokollieren.

Die tue ich durch:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim rng As Range
  
  For Each rng In Target
    watchChanges Sh.Name, rng.Address(0, 0), rng.Value
  Next
End Sub


Sub watchChanges(sSheet As String, sCell As String, vValue As Variant)
Dim strFile As String, strUser As String, strDateTime As String
Dim strMsg As String, strSep As String

strUser = Application.UserName
strDateTime = Format(Now, "dd.MM.yy - hh:mm:ss")
strSep = ";"
strFile = "C:\test.txt"

strMsg = strDateTime & strSep & strUser & NeuerBearbeiter & strSep & sSheet & _
strSep & sCell & strSep & CStr(vValue)

Open strFile For Append Shared As #1
Print #1, strMsg
Close #1
End Sub
Jezt meine Frage: Gibt es die Möglichkeit, Tabellenblätter von diesem Protokoll auszunehmen ?
Oder sogar nur ein Tabellenblatt mit dieser Methode zu protokollieren ?

Vielen Dank schon einmal !

LG

Gero

  

Betrifft: AW: Änderungsprotokoll! Aber NICHT für alle Blätter? von: Oberschlumpf
Geschrieben am: 18.11.2009 11:10:43

Hi Gero

Versuch mal (ungetestet):

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim rng As Range, lShBlatt As Sheets
 
For Each lShBlatt In ThisWorkbook
    If lShBlatt.Name = "Name1" Or lShBlatt.Name = "Name2" Or lShBlatt.Name = "Name3" Or  _
lShBlatt.Name = "usw" Then
         For Each rng In Target
              watchChanges Sh.Name, rng.Address(0, 0), rng.Value
         Next
End If
Next
End Sub
So wird die Protokollierung nur für die Tabellenblätter mit den Namen Name1, Name2, Name3, usw. gestartet.

Wenn nur für eine Tabelle, dann löschst du in der If-Zeile alle anderen Namen.

Hilfts?

Ciao
Thorsten


  

Betrifft: Makro nicht für alle Blätter von: Erich G.
Geschrieben am: 18.11.2009 11:16:40

Hi Gero,
was ist die Variable "NeuerBearbeiter"?

Probier mal die Varianten:

Option Explicit

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
   Dim rng As Range

   If Sh.Name = "BlattA" Then
'   If Sh.Name <> "BlattA" Then
'   If Sh.Name = "BlattA" Or Sh.Name = "Blatt X" Then
      For Each rng In Target
         watchChanges Sh.Name, rng.Address(0, 0), rng.Value
      Next
   End If
End Sub
'
' ODER:
'
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
   Dim rng As Range

   Select Case Sh.Name           ' nur die Blätter "BlattA", "Blatt X", "Blatt xyz"
      Case "BlattA", "Blatt X"
      Case "Blatt xyz"
      Case Else                  ' sonst keine
         Exit Sub
   End Select
   For Each rng In Target
      watchChanges Sh.Name, rng.Address(0, 0), rng.Value
   Next
End Sub

Sub watchChanges(sSheet As String, sCell As String, vValue As Variant)
   Dim strFile As String, strUser As String, strDateTime As String
   Dim strMsg As String, strSep As String
   Dim NeuerBearbeiter As String '???

   strUser = Application.UserName
   strDateTime = Format(Now, "dd.MM.yy - hh:mm:ss")
   strSep = ";"
   strFile = "C:\test.txt"

   strMsg = strDateTime & strSep & strUser & NeuerBearbeiter & strSep & sSheet & _
      strSep & sCell & strSep & CStr(vValue)

   Open strFile For Append Shared As #1
   Print #1, strMsg
   Close #1
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort


  

Betrifft: AW: Makro nicht für alle Blätter von: Gero
Geschrieben am: 20.11.2009 14:10:31

Wenni ch diese Variante benutze, wie kann ich es ermöglichen das nur alle Tabellenbläter welche mit jahreszahlen anfangen berücksichtigt werden.

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
   Dim rng As Range

   Select Case Sh.Name
      Case "2009*"
      Case "2010*"
      Case "2011*"
      Case Else
         Exit Sub
   End Select
   For Each rng In Target
      watchChanges Sh.Name, rng.Address(0, 0), rng.Value
   Next
End Sub
So hab ich gedacht würde es funktionieren... tut es aber nicht.

Einer eine Idee ?

LG

Gero


  

Betrifft: Makro nicht für alle Blätter von: Erich G.
Geschrieben am: 20.11.2009 18:46:45

Hi Gero,
vielleicht so:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
   Dim rng As Range

   Select Case Left(Sh.Name, 4)
      Case "2009"
      Case "2010"
      Case "2011"
      Case Else
         Exit Sub
   End Select
   For Each rng In Target
      watchChanges Sh.Name, rng.Address(0, 0), rng.Value
   Next
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort


  

Betrifft: AW: Änderungsprotokoll! Aber NICHT für alle Blätter? von: IngGi
Geschrieben am: 18.11.2009 11:17:19

Hallo Gero,

entweder so, wie es Thorsten beschrieben hat, oder du nimmst statt des Workbook_SheetChange-Ereignisses das Worksheet_Change-Ereignis. Dafür musst du den Code in das Modul des zu protokollierenden Tabellenblattes verschieben und die Kopfzeile ändern:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range
For Each rng In Target
  watchChanges Sh.Name, rng.Address(0, 0), rng.Value
Next
End Sub
Code eingefügt mit VBA in HTML 2.0.0.3

Gruß Ingolf


  

Betrifft: AW: Änderungsprotokoll! Aber NICHT für alle Blätter? von: Gero
Geschrieben am: 19.11.2009 11:35:26

Hi Ingolf,

ich denke deine Version ist die Praktischste. Ich habe nun aber ein Problem:

Sobald ich die WorkSheet_Change aFunktion in meine Tabelle ingefügt habe funktionieren
sämtliche anderen Aufforderungen nicht mehr, welche ich in anderen Blättern/Workbook auf dieses Blatt bezogen eingegeben hab.

Template ist das Blatt

zB.

Sheets("Template").Visible = True
Sheets("Template").Copy after:=Sheets("Start")
Sheets("Template").Visible = False


woran liegt das ?

LG


  

Betrifft: AW: Änderungsprotokoll! Aber NICHT für alle Blätter? von: IngGi
Geschrieben am: 19.11.2009 14:37:44

Hallo Gero,

ich denke mal das Problem ist, das du bei den Bezügen auf das Tabellenblatt die Datei nicht explizit angibst. Solange der Code im Modul der Arbeitsmappe steht (Modul "DieseArbeitsmappe") zielt der Bezug in diesem Fall auf diejenige Arbeitsmappe, in dessen Modul sich der Code befindet. Steht der Code dagegen in einem allgemeinen Modul oder im Modul eines Tabellenblattes, zielt der Bezug auf die gerade aktive Datei. Und das wird dann wohl die falsche sein, so dass er das Tabellenblatt Template nicht findet. Abhilfe kannst du schaffen, indem du die Datei im Bezug explizit angibst:

With Workbooks("Dateiname.xls").Sheets("Template")
  .Visible = True
  .Copy after:=Sheets("Start")
  .Visible = False
End With
Code eingefügt mit VBA in HTML 2.0.0.3

Gruß Ingolf


  

Betrifft: AW: Änderungsprotokoll! Aber NICHT für alle Blätter? von: Gero
Geschrieben am: 19.11.2009 17:26:10

hmmm ich weiss nicht.

Es funktionierte ja alles bis zu dem zeitpunkt wo ich den worksheet_change eintrag in das Microsoft Excel Objekt des tabellenblatts "Template" eingefügt habe. Seitdem funktioniert nichts mehr....


  

Betrifft: AW: Änderungsprotokoll! Aber NICHT für alle Blätter? von: Rudi Maintaire
Geschrieben am: 18.11.2009 11:17:39

Hallo,
du hast doch die Variable Sh.

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim rng As Range
  select Case Sh.Name
  Case "Tabelle1","Tabelle2"  'nur die beiden werden überwacht
  For Each rng In Target
    watchChanges Sh.Name, rng.Address(0, 0), rng.Value
  Next
 End Select
End Sub

Gruß
Rudi


  

Betrifft: jep, so is noch einfacher...owT von: Oberschlumpf
Geschrieben am: 18.11.2009 11:22:17




Beiträge aus den Excel-Beispielen zum Thema "Änderungsprotokoll! Aber NICHT für alle Blätter?"