AW: dann so: Datei anbei
24.11.2016 14:12:02
Michael
Hi Dirk,
ohne Beispieldatei ist das halt immer so eine Sache: wenn wir nicht *exakt* wissen, wie die aufgebaut ist, kann es zu genau solchen Komplikationen kommen.
Also nochmal von vorne.
1. Richtiges Modul?
Der Code in meiner Datei
Option Explicit
' nur zur Simulation der Function *************************
Dim xx#, yy#, dd&
Function GetGPSLogLastLine(ByRef x#, ByRef y#, ByRef d As Date) As Boolean
' nur zur Simulation des Originals
xx = xx + 1: x = xx
yy = yy + 1: y = yy
If dd = 0 Then dd = Date Else dd = dd + 1
d = dd
GetGPSLogLastLine = True
End Function
' nur zur Simulation der Function *************************
Private Sub Worksheet_Change(ByVal Target As Range)
Dim tr As Long, Cc&, Kc&(1 To 3), i& ' & = as long, comment,andere Spalten
Dim pW(1 To 3) ' die Werte
Dim keineFrage As Boolean
Dim dblLon As Double, dblLat As Double
Dim pGPSTime As Date
If Target.Count 1 Or Target(1).Text "1" Then Exit Sub
tr = Target.Row
If tr 205 Then Exit Sub
If tr Mod 2 = 0 Then Exit Sub
If Not GetGPSLogLastLine(dblLon, dblLat, pGPSTime) Then Exit Sub
Cc = Range("Comments").Column
Kc(1) = Range("X_Coord").Column
Kc(2) = Range("Y_Coord").Column
Kc(3) = Range("GPS_Time").Column
pW(1) = dblLon: pW(2) = dblLat: pW(3) = pGPSTime
' um die GetGPS-Function nicht ändern zu müssen
Cells(tr, Cc).Activate ' wozu?
keineFrage = True
For i = 1 To 3: keineFrage = keineFrage And Cells(tr, Kc(i)) = Empty: Next
If Not keineFrage Then
If Not MsgBox("Overwrite existing coordinates?" & vbCrLf & _
"(You typed '1')", vbYesNo + vbDefaultButton2 + _
vbMsgBoxSetForeground, ActiveWorkbook.Name) = vbYes Then Exit Sub
End If
' .Unprotect ? falls protect-ed, kann keine 1 eingegeben werden.
' evtl. eingangs noch eine Abfrage auf target.column?!
Application.EnableEvents = False
For i = 1 To 3: Cells(tr, Kc(i)) = pW(i): Next
Application.EnableEvents = True
' .Protect DrawingObjects:=False, Contents:=True, Scenarios:=False
End Sub
befindet sich zunächst im Modul des Tabellenblatts "Tabelle1":
In Deinem Originalcode war die Zeile
ActiveSheet.Name "Back_Sheet(s)"
die darauf hindeutet, daß der Code in das Modul vom Blatt "Back_Sheet(s)" reinmuß.
Ereignismakros funktionieren NUR in dem Blatt, in dessen Modul sie stehen!
(Deshalb ist auch das ganze "activesheet"... überflüssig, weil nur diese eine Blatt sowieso aktiv ist, wenn das Makro überhaupt auf ein Ereignis "anspringt")
2. Überflüssiges gelöscht?
Die Zeilen zwischen den Kommentaren mit den vielen *** müssen bei Dir raus - ich habe nur die (mir unbekannte) Funktion nachgebildet, damit Du es eben ohne Änderungen verwenden kannst (oder können solltest).
3. Allgemeines Vorgehen
Um zu sehen, ob das Ereignis überhaupt anspringt, setzt Du am besten mal ein "stop" ganz an den Anfang, also so:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim tr As Long, Cc&, Kc&(1 To 3), i& ' & = as long, comment,andere Spalten
Dim pW(1 To 3) ' die Werte
Dim keineFrage As Boolean
Dim dblLon As Double, dblLat As Double
Dim pGPSTime As Date
stop ' 1 Or Target(1).Text "1" Then Exit Sub
' usw.
Das "stop" sorgt dafür, daß das Makro an dieser Stelle stehenbleibt (ginge auch mit dem Setzen eines Haltepunktes mit F9); dann kannst Du es weiter zeilenweise mit F8 laufen lassen. Währenddessen siehst Du, wenn Du die Maus über eine Variable ziehst (ohne zu klicken), was die für einen Wert während der Laufzeit hat.
Auf die Art siehst Du
a) ob das Makro überhaupt anspringt (wenn es beim Stop nicht stehenbleibt, wurde es nicht aufgerufen)
b) an welcher Stelle das Makro vorzeitig endet und im besten Fall warum.
Spiel mal damit herum. Falls das alles nicht hilft, müßten wir die Originaldatei sehen - schlimmstenfalls dann halt per mail.
Schöne Grüße,
Michael