Was muss man in Excel eingeben, damit das Datum nicht aktualisiert wird?

5 Antworten

Ja, du musst beim ersten Speichern und bei jedem Öffnen bestätigen, dass du Makros zulassen willst.

Das beste wäre wohl, den Wert in Spalte H einzutragen, wenn Spalte G geändert wird.

Dazu:

Codeseite der betreffenden Tabelle öffnen (z. B. Doppelklick auf die Tabelle im linken Teilfenster der Excel-VBA-Entwicklungsumgebung)

In der linken Dropdown-Liste am oberen Rand (hier sollte "Allgemein" stehen) "Worksheet" auswählen

In der rechten Dropdown-Liste am oberen Rand "Change" wählen

Prüfen, ob Target (der aktuell geänderte Bereich) eine Zelle aus Spalte "G" enthält:

    If (Target.Column <= 7) And (7 <= Target.Column + Target.Columns.Count - 1) Then
' Code für die Auswertung von Spalte G
End If

Darin alle Zeilen von Spalte G durchgehen:

        Dim zeile As Long
For zeile = Target.Row To Target.Row + Target.Rows - 1
'Prüfe, ob Spalte G auf "erledigt" steht und ob Spalte H noch nicht ausgefüllt worden ist
If (Me.Cells(zeile, 7) = "erledigt") And (Me.Cells(zeile, 7).Value = "") Then
Me.Cells(zeile, 8) = Int(Now()) 'Int auf einen Zeitpunkt angewendet ergibt den Tag ohne Uhrzeit
End If
Next

Es gibt natürlich noch weitere Verfeinerungen, insbesondere für den Fall, dass Target aus mehreren nichtzusammenhängenden Zellblöcken besteht (kriegt man mit Strg + Maus über Tabelle ziehen hin)


Iamiam  24.02.2017, 23:19

"Verfeinerungen" auch das:

  • Sub ZeitausdrückeVBA()
  • Debug.Print "Date: " & Date
  • Debug.Print "Timer(=Tagessekunden,00): " & Timer
  • Debug.Print "Now: " & Now()
  • Debug.Print "Time: " & Time
  • End Sub

anstatt Int(Now()) also kürzer Date

Aber das Me hab ich noch nicht ganz gefressen...Muss ich rumprobieren!

2
PWolff  24.02.2017, 23:31
@Iamiam

"Me" ist die VB(A)-Entsprechung von "this" in C-Flavored Programmiersprachen. Bezieht sich in VB(A) bis Version 6 (also vor .NET) immer auf das Element, dem die Datei / die Quelltextseite zugeordnet ist. Bei Excel ist das normalerweise die Tabelle.

1

Hallo du :),

falls es dich interessiert:

in LibreOffice Calc gibt es eine elegante Lösung ein generiertes Datum zu fixieren :) Excel sagt da leider gleich "Achtung Zirkelbezug"

Ich würde es trotzdem gerne erklären :p

Du benötigst dafür eine Hilfsspalte:

In B2 schreibst du jetzt mal folgende Formel:

=WENN(A2="";"";WENN(ZELLE("TYPE";B2)="v";B2;HEUTE()))

So, in A2 schreibst du jetzt das hier:

=WENN(A4="erledigt";"x";"")

Fertig =)

Wenn du jetzt in A4 "erledigt" eintippst, wird das aktuelle Datum angezeigt, welches sich auch beim Umstellen vom Datum nicht verändert :)

Das kannst du testen, indem du einmal in C2 folgende Formel schreibst:

=HEUTE()

und jetzt das Datum des Computers einmal einen Tag vor oder zurück stellst und das Dokument aktualisiert :)

Vll hat auch einer der Experten (Suboptimierer Oubyi ...) eine Idee wie man das in Excel umsetzen kann?:p

Liebe Grüße,

iMPerFekTioN

Woher ich das weiß:Berufserfahrung – Eigenständiges lernen während und nach meiner Ausbildung

Iamiam  24.02.2017, 18:13

Das geht in xl nur, wenn Berechnen: iterative Berechnung eingestellt ist. Da aber das eine Anwendungs- und keine Datei-Option ist (obwohl es unter Datei-Optionen steht) lässt sich das nicht auf  Dauer durchhalten. (ausserdem hat Type = "v" in xl einen anderen Buchstaben, weiß aber ohne Nachschlagen nicht mehr, welchen)

1
dkilli  24.02.2017, 19:06

Hallo IMPerFekTioN,

deine Formeln funktionieren auch in allen Excelversionen (2003, 2010, 2016) Nur müssen die Zellen als Datum formatiert werden!

Leider habe ich deine Formel

=WENN(A2="";"";WENN(ZELLE("TYPE";B2)="v";B2;HEUTE()))

nicht verstanden Vielleicht kannst du die erklären.

Danke

0
dkilli  24.02.2017, 20:55

Hallo iMPerFekTioN

Nach langen probieren habe ich deine Formel noch vereinfacht Ich weiß zwar nicht, wieso die funktioniert. Sie funktioniert bei LO und Excel

=WENN(A2="";"";WENN(ZELLE("TYP")="";"";HEUTE()))
0
Iamiam  24.02.2017, 22:50
@dkilli

ich hab die Methode in xl mal in  www.gutefrage.net/frage/excel-wert-durch-bedingung-unveraenderbar-machen

verwendet, ist mir aber zu mühsam, das nochmals nachzuvollziehen, weil man da eben ...-Berechnung-Iteration einstellen muss, was ich bei normalem Arbeiten nicht brauchen kann.

In OO/LO:  http://de.openoffice.info/viewtopic.php?f=25&t=56497

Übrigens ist zur Kontrolle die Jetzt() - Funktion besser geeignet als heute(), da braucht man kein Datum umstellen, die ändert sich von selbst schnell genug (oder eben nicht).

1
Iamiam  24.02.2017, 23:25
@Iamiam

automatisches Ein-Ausschalten der Iteration könnte erfolgen durch

  • Sub IterationBeimÖffnenEinSchließenAus() 'als Workbook_open()
  • Application.Iteration = True 'False als Sub Workbook_close()
  • End Sub

1

Wenn in einer Spalte das Datum abgeleitet von JETZT() oder HEUTE() steht, so klicke in diese Zelle. Drücke F2 + F9 + Enter oder Klicke doppelt in diese Zelle F9 + Enter

Machs andersrum: Das heutige Datum kannst Du mit Strg+. (Punkt) fix erzeugen (die Uhrzeit mit Strg+: (kann man auch -vorzugsweise mit Leerzeichen dazwischen- aneinanderhängen oder in beliebige Texte einfügen)

Dann bzw. vorher in die Zelle(n), wo erledigt stehen soll, die Formel:

=Wenn(zugehörigeDatumszelle>1;"erledigt":"noch offen") oder eine andere passende Funktion.

Geht ganz ohne Makro!


Iamiam  25.02.2017, 23:14

nochmals zur Präzisierung: die Wenn-Formel kannst Du für alle betroffenen Zellen schon mal vorlegen, sie zeigt erst dann erledigt, wenn ein Datum(oder eine Zahl) in der korrespondierenden Zelle gesetzt wird!

Mit einer kleinen Modifikation könnte dann auch ein Text in der Datumszelle stehen mit i'einem Hinweis, zB "bis 1.3. fertigzustellen".

=WENN(WENNFEHLER(--zugehörigeDatumszelle;0)>42736;"erledigt";"noch offen")

42736 ist =1*"1.1.17", so dass kleinere Zahlen/Datümer  sogar ignoriert würden (ob das noch Sinn macht, sei mal dahingestellt), in jedem Fall aber Texte.

0

EDIT: Muss ich nochmal anschauen, VBA is doch nicht so einfach (Programmzeilen folgen)


hankey  24.02.2017, 13:32

Hmmm:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 15 Then
        If Target.Value = "Erledigt" Or Target.Value = "erledigt" Then 
        Target.Offset(0, -2).Value = Date
    End If
End Sub

2
Oubyi, UserMod Light  24.02.2017, 13:51
@hankey

Fast!
So ist es imho besser:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 7 Then
If Target.Value = "erledigt" Then
Target.Offset(0, 1).Value = Date
End If
End If
End Sub
2
hankey  24.02.2017, 17:50
@Oubyi, UserMod Light

Puh, ok. Ich hoffe eine der angebotenen Varianten hat dem Fragesteller geholfen.

Klar, G ist Column 7 *facepalm*

1
Iamiam  24.02.2017, 22:56
@hankey

halte das Makro auch für besser als die ansonsten angesprochenen Formellösungen mit Klimmzügen.

Vllt noch: Das Makro (am besten das von Oubyi) gehört in das Modul des betroffenen Arbeitsblattes und funktioniert dann auch nur in diesem!

Der Nachteil ist eben, dass die Datei dann als .xlsm (oder altes .xls-Format) gespeichert werden m,uss und dann ständig nervige Warnungen kommen über die RIIIEEESENGEFAHREN von Makros!

1
ichbinunwissend 
Beitragsersteller
 27.02.2017, 21:00
@hankey

Hallo, also diesen Text:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 7 Then
If Target.Value = "erledigt" Then
Target.Offset(0, 1).Value = Date
End If
End If
End Sub

exakt so in den Code kopieren und als excel datei mit makros speichern? dann soll es funktionieren? oder soll ich noch was verändern? oder wirklich genau so lassen?

0