Home Office-Hilfe.com - Wir lösen Ihr Problem mit Microsoft Excel, Word, Outlook, PowerPoint, Access gratis Forum Impressum

  Makro in einer bestimmten Zelle ausführen?!
Neues Thema eröffnenNeue Antwort erstellen
Autor Nachricht
UK23
Newbie
Newbie


Anmeldedatum: 25.07.2008
Beiträge: 14

BeitragVerfasst am: 25.07.2008, 19:16 Nach oben

Hallo liebe Forumsgemeinde!

Bei all den kompetenten Antworten, die ich bisher gelesen habe, bin ich mir sicher, dass auch mir geholfen werden kann :)
Folgendes Problem: Für eine Arbeitszeiterfassung würde ich gerne eine Exceltabelle anlegen, wobei sich jeder Mitarbeiter durch einen Mausklick an und abmelden können soll. Hierfür habe ich auch schon folgendes VBA-"Skript" im Netz gefunden.

Sub AKTUELLEZEIT()
Dim zeit As String
zeit = Right(Now(), 8)

ActiveCell.FormulaR1C1 = zeit
Selection.NumberFormat = "hh:mm:ss"
End Sub

Allerdings stört mich daran, dass die Zeit in der ausgewählten Zelle (--> ActiveCell) ausgewiesen wird. Ich würde gerne fest bestimmen, in welcher Zelle die Zeit festgehalten werden soll, um dann daraufhin die Arbeitszeit berechnen zu können. (=Einloggzeit-Ausloggzeit)Ich will also zum Beispiel festlegen, dass die "Einstempelzeit" in Zelle C6 festgehalten wird. Kann mir jemand erklären, wie ich das hinbekomme? Ich muss eben nur wissen, was ich anstelle von "ActiveCell" schreiben muss...

Ich hoffe ich habe mein Problem verständlich geschildert!

MfG
Uli
Benutzer-Profile anzeigenPrivate Nachricht senden
maninweb
Newbie
Newbie


Anmeldedatum: 03.05.2008
Beiträge: 26
Wohnort: Herzogenrath

BeitragVerfasst am: 26.07.2008, 13:08 Nach oben

Hi UK23...

kannst statt ActiveCell auch folgendes verwenden...

ThisWorkbook.Worksheets("DeineTabelle").Range("C6")....

oder alternativ...

ThisWorkbook.Worksheets("DeineTabelle").Cells(6,3)....

Gruß
Benutzer-Profile anzeigenPrivate Nachricht sendenWebsite dieses Benutzers besuchen
UK23
Newbie
Newbie


Anmeldedatum: 25.07.2008
Beiträge: 14

BeitragVerfasst am: 26.07.2008, 16:48 Nach oben

Hey maninweb!

Super genauso hab ichs mir vorgestellt, läuft wie geschmiert :) Vielen Danke für die schnelle Hilfe!

Gruß
Uli
Benutzer-Profile anzeigenPrivate Nachricht senden
UK23
Newbie
Newbie


Anmeldedatum: 25.07.2008
Beiträge: 14

BeitragVerfasst am: 26.07.2008, 19:00 Nach oben

Danke soweit,

ich hätte nun eine anschließende Frage: Ist es möglich, das von maninweb erstellte VBA-Modul so umzuschreiben, dass man lediglich ein Mal den Button für die Anmeldezeit drücken kann, also nicht ausversehen ein zweites Mal drückt und somit die eigentliche Anmeldezeit löscht/mit einer neuen überschreibt?!

Das wäre die Krönung Very Happy


Außerdem habe ich noch ein weiteres Problemchen: Wie folgt habe ich eine laufende Uhr per Makro eingebunden:

Option Explicit
Public DaEt As Date

Sub Zeitmakro()
ThisWorkbook.Worksheets("Tabelle1").Range("A1") = Format(Time, "hh:mm:ss")
DaEt = Now + TimeValue("00:00:01")
Application.OnTime DaEt, "Zeitmakro"
End Sub

Funktioniert auch soweit, wenn ich das Makro ausführe. Leider läuft die Uhr bei erneutem öffnen der Arbeitsmappe nicht weiter, erst wenn ich das makro erneut ausführe. (Was ja nicht Sinn und Zweck der Sache ist) Wie bekomme ich es hin, dass die Uhr beim Öffnen der Mappe startet?!


Gruß
Uli
Benutzer-Profile anzeigenPrivate Nachricht senden
maninweb
Newbie
Newbie


Anmeldedatum: 03.05.2008
Beiträge: 26
Wohnort: Herzogenrath

BeitragVerfasst am: 27.07.2008, 10:14 Nach oben

Hi UK23...

zur ersten Frage, Du kannst eine Zelle vorsehen, in der Du, sobald einmal gedrückt wurde, eine 1 hineingeschrieben wird.
Dieses Feld fragst Du dann ab und verhinderst so ein zweites Drücken. Beispiel...

Code:

Sub AKTUELLEZEIT()

' Prüfen, ich nehme mal Zelle A1...
 
  If CLng(ThisWorkbook.Worksheets("Tabelle1").Cells(1, 1).Value) < 1 Then
 
'   Da Du einen Wert schreibst, brauchst Du keine Formel, also statt FormulaRC eher Value
   
    ThisWorkbook.Worksheets("Tabelle1").Cells(1, 1).Value = 1
    ThisWorkbook.Worksheets("Tabelle1").Cells(3, 6).Value = Right(Now(), 8)
    ThisWorkbook.Worksheets("Tabelle1").Cells(3, 6).NumberFormat = "hh:mm:ss"
 
  Else
 
    MsgBox "Bereits eingetragen"
   
  End If
 
End Sub


Wenn Du eine Prozedur automatisch beim Öffen der Datei ausführen möchtest, kannst Du dies im entsprechenden Ereignis tun.
Öffne das Codemodul zu "DieseArbeitsmappe" und kopieren den Code hier darein...
Code:

Private Sub Workbook_Open()

  Zeitmakro

End Sub


Gruß
Benutzer-Profile anzeigenPrivate Nachricht sendenWebsite dieses Benutzers besuchen
UK23
Newbie
Newbie


Anmeldedatum: 25.07.2008
Beiträge: 14

BeitragVerfasst am: 27.07.2008, 13:09 Nach oben

Ich bin begeistert Very Happy Vielen, vielen Dank maninweb, ich glaub ich muss ab sofort VBA lernen, es ist faszinierend, was man alles machen kann Shocked
Danke auch für deine gute Beschreibung, hat alles (fast) auf Anhieb funktioniert!
Benutzer-Profile anzeigenPrivate Nachricht senden
UK23
Newbie
Newbie


Anmeldedatum: 25.07.2008
Beiträge: 14

BeitragVerfasst am: 28.07.2008, 10:54 Nach oben

ich hätte da noch eine (hoffentlich) letzte, abshcließende Frage Rolling Eyes :
Kann ich in den von maninweb beschriebenen Code (Sub AKTUELLEZEIT()) zusätzlich mit einbauen, dass bei einem Klick auf den Button die Datei gespeichert wird und zwar mit dem aktuellen Datum als Dateinamen?
Alternativ möglich wäre auch noch, dass ein extra Button erstellt wird, mit dem dann die gewünschte Speicherfunktion ausgeführt werden kann (eben mit aktuellem Datum als Dateiname)

Ich hoffe, ich belaste euch nicht übermäßig Confused

Gruß
Uli
Benutzer-Profile anzeigenPrivate Nachricht senden
maninweb
Newbie
Newbie


Anmeldedatum: 03.05.2008
Beiträge: 26
Wohnort: Herzogenrath

BeitragVerfasst am: 28.07.2008, 13:18 Nach oben

Hi nochmal...

hmm, wer nicht fragt, bleibt dumm. Insofern ist's keine Belastung, zumindestens für mich nicht. Hier ein Beispielcode...
Code:

Public Sub Beispiel()

  ThisWorkbook.SaveCopyAs ThisWorkbook.Path & "\" & Format(Date + Time, "DD.MM.YYYY-hh.mm.ss") & ".xls"
 
End Sub


Der Code hängt die Uhrzeit noch dran. Macht das Leben einfacher, so dass Du nicht prüfen musst, ob's die Datei schon gibt.

Gruß
Benutzer-Profile anzeigenPrivate Nachricht sendenWebsite dieses Benutzers besuchen
miriki
Schlauberger
Schlauberger


Anmeldedatum: 05.03.2007
Beiträge: 294
Wohnort: Kiel

BeitragVerfasst am: 28.07.2008, 15:40 Nach oben

maninweb hat Folgendes geschrieben:
Code:
SaveCopyAs ... Format(Date + Time, "DD.MM.YYYY-hh.mm.ss")

Nur mal so als Tip, da ich genau das da auch öfters benutze: Es ist durchaus empfehlenswert, das Datum nicht nach deutschem, sondern nach amerikanischem Format zusammenzustellen.

Durch die Anordnung Jahr-Monat-Tag läßt sich später eine bestimmte Datei in einem Wust von Dateien im Verzeichnis bedeutend leichter wiederfinden.

Gruß, Michael
Benutzer-Profile anzeigenPrivate Nachricht sendenICQ-Nummer
maninweb
Newbie
Newbie


Anmeldedatum: 03.05.2008
Beiträge: 26
Wohnort: Herzogenrath

BeitragVerfasst am: 28.07.2008, 17:55 Nach oben

Hi miriki - stimmt Smile Gruß
Benutzer-Profile anzeigenPrivate Nachricht sendenWebsite dieses Benutzers besuchen
UK23
Newbie
Newbie


Anmeldedatum: 25.07.2008
Beiträge: 14

BeitragVerfasst am: 29.07.2008, 17:59 Nach oben

Danke, auch das funktioniert bestens :)
Benutzer-Profile anzeigenPrivate Nachricht senden
UK23
Newbie
Newbie


Anmeldedatum: 25.07.2008
Beiträge: 14

BeitragVerfasst am: 30.07.2008, 08:58 Nach oben

ich bins nochmals... Rolling Eyes



Zitat:
Sub AKTUELLEZEIT()

' Prüfen, ich nehme mal Zelle A1...

If CLng(ThisWorkbook.Worksheets("Tabelle1").Cells(1, 1).Value) < 1 Then

' Da Du einen Wert schreibst, brauchst Du keine Formel, also statt FormulaRC eher Value

ThisWorkbook.Worksheets("Tabelle1").Cells(1, 1).Value = 1
ThisWorkbook.Worksheets("Tabelle1").Cells(3, 6).Value = Right(Now(), 8)
ThisWorkbook.Worksheets("Tabelle1").Cells(3, 6).NumberFormat = "hh:mm:ss"

Else

MsgBox "Bereits eingetragen"

End If

End Sub


Dieses Skript funktioniert genauso, wie ich es haben möchte, allerdings würde ich es gerne etwas allgemeiner gestalten. Anstatt "Tabelle1" soll sich das Skript (wenn möglich) auf das aktuelle Tabellenblatt beziehen. Gibt es hierfür einen Code? (so in die richtung "ActiveSheet" anstatt "Tabelle1" o.Ä.?)

Gruß
Uli
Benutzer-Profile anzeigenPrivate Nachricht senden
miriki
Schlauberger
Schlauberger


Anmeldedatum: 05.03.2007
Beiträge: 294
Wohnort: Kiel

BeitragVerfasst am: 30.07.2008, 09:37 Nach oben

UK23 hat Folgendes geschrieben:
sich das Skript (wenn möglich) auf das aktuelle Tabellenblatt beziehen.


Ja, das geht, mehr oder weniger flexibel.

Ändere
Code:
Sub AKTUELLEZEIT()

in
Code:
Sub AKTUELLEZEIT(wkb$,sht$)


Füge am Anfang der Prozedur
Code:
dim w as workbook
dim s as worksheet
set w = workbooks(wkb)
set s = w.worksheets(sht)

ein. Das ist nicht unbedingt notwendig, erspart in der Folge aber etwas Tipparbeit und vermeidet dadurch auch Tippfehler. Und wenn Du nur im aktuellen Workbook arbeitest, kannst Du das Geraffel um wkb und w auch weglassen.

Der Aufruf von
Code:
aktuellezeit

ändert sich dann in z.B.
Code:
aktuellezeit thisworkbook.name, activesheet.name

Damit wird dann der Name des Workbooks und des Worksheets an die Routine übergeben und kann dort verwendet werden.

Eine ähnliche Methode wäre, es mit "with workbooks(wkb)" bzw. "with workbooks(wkb).worksheets(sht)" zu kapseln. Aber ich persönlich bin kein großer Freund von WITH.

Dann ändere Zeilen wie
Code:
ThisWorkbook.Worksheets("Tabelle1").Cells(1, 1).Value = 1

in
Code:
s.Cells(1, 1).Value = 1


Bei der Gelegenheit:
Code:
ThisWorkbook.Worksheets("Tabelle1").Cells(3, 6).Value = Right(Now(), 8)

Das läßt sich auch "stilvoller" als
Code:
ThisWorkbook.Worksheets("Tabelle1").Cells(3, 6).Value = Now() - Int(Now())

schreiben. Ich bevorzuge dies, weil: Datums- und Zeit-Informationen sind numerische Werte. Deine Methode umgeht das, indem der Zeit-String genommen wird, aus dem der Datums-Teil abgeschnitten wird. Beim Einsetzen des Zeit-Strings in die Zelle ist Excel "intelligent" genug, den String wieder in das numerische Format zurück umzuwandeln. Aber dieses ganze Hin und Her ist unschön und kann ggf. auch mal schiefgehen.

Just my $ 0,02... Wink

Gruß, Michael
Benutzer-Profile anzeigenPrivate Nachricht sendenICQ-Nummer
UK23
Newbie
Newbie


Anmeldedatum: 25.07.2008
Beiträge: 14

BeitragVerfasst am: 30.07.2008, 11:15 Nach oben

Hi Michael,



Zitat:
Der Aufruf von
Code:
aktuellezeit

ändert sich dann in z.B.
Code:
aktuellezeit thisworkbook.name, activesheet.name

Damit wird dann der Name des Workbooks und des Worksheets an die Routine übergeben und kann dort verwendet werden.


Was genau muss ich da in meinem Skript ändern? Im Moment habe ich es wie folgt verändert:

Code:

Sub AKTUELLEZEIT(wkb$, sht$)

Dim w As Workbook
Dim s As Worksheet
Set w = Workbooks(wkb)
Set s = w.Worksheets(sht)
 
  If CLng(s.Cells(20, 1).Value) < 1 Then
 

   s.Cells(20, 1).Value = 1
   s.Cells(8, 8).Value = Now() - Int(Now())
   s.Cells(8, 8).NumberFormat = "hh:mm:ss"
   
 
  Else
 
    MsgBox "Bereits eingetragen!"
   
  End If
 
End Sub


Leider bekomme ich nach dieser Eingabe die Fehlermeldung: "Argument ist nicht optional!"

Gruß
Uli
Benutzer-Profile anzeigenPrivate Nachricht senden
miriki
Schlauberger
Schlauberger


Anmeldedatum: 05.03.2007
Beiträge: 294
Wohnort: Kiel

BeitragVerfasst am: 30.07.2008, 11:56 Nach oben

UK23 hat Folgendes geschrieben:
Leider bekomme ich nach dieser Eingabe die Fehlermeldung: "Argument ist nicht optional!"

Irgendwo rufst Du ja die Routine "aktuellezeit" auf. Dort müßte es nach den Anpassungen auch zum Fehler kommen. Die Anpassungen selbst sehen, so auf den ersten Blick, ja völlig ok aus.

Aber ich schrieb ja:
Zitat:
Der Aufruf von
Code:
aktuellezeit

ändert sich dann in z.B.
Code:
aktuellezeit thisworkbook.name, activesheet.name

Damit wird dann der Name des Workbooks und des Worksheets an die Routine übergeben und kann dort verwendet werden.


Diese Änderung muß also noch gemacht werden.

Ich gehe mal davon aus, daß die Routine "aktuellezeit" sich in einem Extra-Modul ("modul1" oder wie auch immer) befindet und der Aufruf aus einem Worksheet ("tabelle1" z.B.) heraus passiert.

Nachdem Du die Routine in "modul1" angepaßt hast, mußt du jetzt noch den Aufruf im Source der "tabelle1" anpassen.

Ähm, in der Hoffnung, jetzt nicht zu viel Verwirrung zu stiften, aber Du könntest ev. noch (totally untested):
Code:
Sub AKTUELLEZEIT(wkb$, sht$)

ändern in
Code:
sub AKTUELLEZEIT(sht$, optional wkb$=thisworkbook.name)


Der Aufruf der Routine müßte als 1. Parameter dann natürlich jetzt den Sheet-Namen bekommen. Als 2. kann, muß aber nicht, der Book-Name folgen. Wird der weggelassen, wird das aktuelle Book genommen. Leider geht das optional-Konstrukt nicht für den Sheet-Namen, wenn die Routine sich nicht auch innerhalb des Sheets befindet.

Gruß, Michael
Benutzer-Profile anzeigenPrivate Nachricht sendenICQ-Nummer
Beiträge der letzten Zeit anzeigen:      
Neues Thema eröffnenNeue Antwort erstellen


Ähnliche Beiträge
Thema Autor Forum Antworten Verfasst am
Keine neuen Beiträge Makro soll relativen Bereich mit Date... Frederic Microsoft Excel Hilfe 1 29.08.2008, 16:12 Letzten Beitrag anzeigen
Keine neuen Beiträge Probleme beim ausführen eines Makros ... Gomorra Microsoft Excel Hilfe 26 28.08.2008, 14:09 Letzten Beitrag anzeigen
Keine neuen Beiträge Druck des Kommentars einer Zelle htumm Microsoft Excel Hilfe 2 28.08.2008, 14:04 Letzten Beitrag anzeigen
Keine neuen Beiträge Zelle löschen aber nicht die Formel Paraneuros Microsoft Excel Hilfe 1 27.08.2008, 15:18 Letzten Beitrag anzeigen
Keine neuen Beiträge Hilfe beim erstellen einer Importdatei dobby110 Microsoft Excel Hilfe 5 26.08.2008, 12:36 Letzten Beitrag anzeigen


 Gehe zu:   



Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen

Haftungsausschluss/Disclaimer


SMS kostenlos versenden | Battle-Dream | Tuning Forum | Join the YoungGeneration | krankenversicherungsvergleich | Kalorienarme Rezepte!
Versicherungsvergleich | Bürobedarf | Papier | Betten

Ranking-Hits



Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme :: Alle Zeiten sind GMT + 1 Stunde
Deutsche Übersetzung von phpBB.de