Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
844to848
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
844to848
844to848
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

geht's auch einfacher

geht's auch einfacher
09.02.2007 05:39:21
sonja.ausHH
Hallo liebe Excel Gemeinde,
ich bin absoluter Neuling im VBA-Bereich, kämpfe mich aber durch ein neues Projekt und lerne viel dabei.
Hier nochmals Dank an "Peter Feustel" auf dessen Programm-Code mein Projekt basiert.
Ich habe mir folgen Code gebastelt, (mühsam erarbeitet).
Meine Frage ist, wie kann ich die zweite Schleife überspringen, wenn "Cells(8, i)" leer ist, ohne die zweite Schleife anzufangen? Oder geht das nicht?
Gibt es evtl. eine schnellere Lösung, da der Durchlauf, bei mir, ca. 2 sek dauert. Wobei die Tabelle sogar leer ist (beim Testlauf, sonst natürlich nicht).
Ich hoffe auf Eure Hilfe und sage schon einmal,
besten Dank
sonja.ausHH

Sub testlauf()
Dim i As Integer
Dim j As Integer
Dim a As Integer
For i = 4 To 203
'If Cells(8, i) = "" Then Next i               ' funktioniert ja nicht, oder ?
For j = 11 To 376
If Cells(8, i) = "" Then Exit For          ' dann hab ich das eben so gemacht
If Cells(j, i) = "H" Then a = a + 1
If Cells(j, 3) >= Now Then
Cells(9, i) = a
a = 0
Exit For
End If
Next j
Next i
End Sub

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: geht's auch einfacher
09.02.2007 05:51:21
Hans
Hallo Sonja,
ich bin mir nicht sicher, ob die gewünschte Struktur beibehalten wurde, aber als Ansatz:

Sub testlauf()
Dim i As Integer
Dim j As Integer
Dim a As Integer
For i = 4 To 203
If Cells(8, i) <> "" Then
For j = 11 To 376
If Cells(j, i) = "H" Then
a = a + 1
Else
If Cells(j, 3) >= Now Then
Cells(9, i) = a
a = 0
Exit For
End If
End If
Next j
End If
Next i
End Sub

gruss hans
AW: geht's auch einfacher
09.02.2007 10:39:32
ingoG
Hallo zusammen,
wenn ich das Prog richtig verstanden habe sollte es auch so gehen:

Sub testlauf()
Dim i As Integer
Dim zeile As Integer
For zeile = 11 To 376
If Cells(zeile, 3) >= Now Then Exit For
Next zeile
For i = 4 To 203
If Cells(8, i) <> "" Then Cells(9, i) = _
Application.WorksheetFunction.CountIf(Range(Cells(11, i), Cells(zeile, i)), "H")
Next i
End Sub

die von Hans vorgeschlagene Lösung liefert übrigens nicht das selbe Ergebnis wie die Ursprungslösung, da durch den else-zweig das Datum in Spalte 3 nur überprüft wird, wenn in der untersuchten Zelle kein "H" steht. bei der Ursprungsvariante wird bei "H" erst der Zähler hochgesetzt und dann geschaut, ob am Zeilenanfang das Datum >=Now ist.
Now ist für einen Datumsvergleich übrigens kritisch, da der Zeitanteil dazu führt, dass zB heute 09.02.2007 Ich hoffe, das hilft Euch weiter.
Gruß Ingo
PS eine Rückmeldung wäre nett...
Anzeige
AW: geht's auch einfacher
09.02.2007 13:14:49
sonja.ausHH
Hallo Ingo,
danke dass Du mir helfen willst, Deine Lösung sieht sehr gut aus aber klappt nicht.
Die Lösung von Hans funktioniert auch nicht.
An dieser Stelle auch ein Danke an Hans.
Vorweg, was hast Du damit gemeint,
" Now ist für einen Datumsvergleich übrigens kritisch, da der Zeitanteil dazu führt, dass zB heute 09.02.2007" ?
Hast Du da zu früh aufgehört zu schreiben, oder bin ich total blöd?
Vielleicht hätte ich mal sofort die Aufgabe beschrieben.
Also:
In Zeile 8 D-GU (4-203) stehen die Mitarbeiter. Wobei nicht alle Spalten belegt sind.
In Spalte C 11-376 stehen die Tagesdaten (Datum: C11=1.1.,C12=2.1.,C13=3.1. usw. )
1. es soll Zeile 8 von 4 - 203 auf einen Mitarbeiter gepüft werden.
2. wenn Mitarbeiter dann soll der Spalte von 11-376 die Einträge "H" bis zum aktuellen Datum (Heute) gezählt werden und in Zeile,9 geschrieben werden.
Wenn kein Mitarbeiter in Zeile, dann nächte Zeile auf Mitarbeiter prüfen (schnellerer Durchlauf der Prüfung).
Es soll also für jeden Mitarbeiter festgestellt werden wieviel mal ("H"), bis zum aktuellen Datum (also Heute), in "seiner" Zeile steht.
Ergebnis soll sein: Der Mitarbeiter hat bis heute x mal halbtags gearbeitet.
Nochmals, wobei zu beachten ist, dass nicht in jeder Spalte (8 D-GU (4-203)) ein Mitarbeiter steht.
Ich hoffe ich habe mich verständlich ausgedrückt und Du kannst mir weiterhelfen.
gruss
sonja.ausHH
Anzeige
AW: geht's auch einfacher
09.02.2007 14:30:34
ingoG
HAllo Sonja,
der Satz sollte eigentlich lauten:
Now ist für einen Datumsvergleich übrigens kritisch, da der Zeitanteil dazu führt, dass zB heute 09.02.2007<Now ist, da Now=39122,59 und Dein Datum von Heute = 39122
Ich glaube, ich habe Dein Problem auch richtig verstanden, bei mir hatte es auch gefunzt.
vielleicht erklärst Du mal, was genau nicht geklappt hat...
Gruß Ingo
Hier nocheinmal der Code (mit kleinen Änderungen zB für Now)

Sub testlauf()
Dim i As Integer
Dim zeile As Integer
Range("D9:GU9").ClearContents
For zeile = 11 To 376
If Cells(zeile, 3) >= Int(Now) Then Exit For
Next zeile
For i = 4 To 203
If Cells(8, i) <> "" Then Cells(9, i) = _
Application.WorksheetFunction.CountIf(Range(Cells(11, i), Cells(zeile, i)), "H")
Next i
End Sub

Anzeige
AW: geht's auch einfacher
09.02.2007 15:09:55
sonja.ausHH
Hi Ingo,
danke für Deine weitere Hilfe.
Also dieser neue Code klappt auch nicht.
Zellen D9:GU9 werden gelöscht, ist ok.
In den übersprungenen Zeilen wird nichts eingetragen, ist auch ok.
Dann wird aber in jede Zelle in der die Ergebnisse stehen sollte eine "unsichtbare 0" eingetragen.
Die "unsichtbare 0" kann ich auch NUR in der Bearbeitungsleiste erkennen.
In der Zelle ist die "0" auch durch ändern der Zell.- oder Schriftfarbe nicht sichtbar zu machen. Löschen kann ich diese Nullen aber.
Jetzt hab ich nochmal Deinen ersten Code durchlaufen lassen, das gleiche Ergebnis "unsichtbare 0)
Das hatte ich beim ersten Test nicht erkannt (eben unsichtbar, außer in Bearbeitungsleiste.)
hast Du eine Lösung dafür ?
schönen Tag
sonja.ausHH
Anzeige
AW: geht's auch einfacher
09.02.2007 15:45:25
Peter
Hallo Sonja,
nun wird das Ergebis in die Zelle 9, x ausgegeben.


'
'   hat der Mitarbeiter bis zum heutigen Tag halbtags gearbeitet ?
'
Public Sub Halbtags()
Dim lZeile       As Long     ' For/Next Index der Zeilen
Dim lLetzte      As Long     ' letzte belegte Zeile in Spalte C
Dim iSpalte      As Integer  ' For/Next Index der Spalten
Dim lSpalte      As Integer  ' letzte Belegte Spalte in Zeile 8
Dim iLfdTag      As Integer  ' der aktuell laufende Tag im Jahr
Dim iAnzHalbtag  As Integer  ' Anzahl der mit H gekennzeichneten Tage
'
'   den aktuell laufenden Tag aus dem Tagesdatum ermitteln
'
   iLfdTag = CDate(Date) - DateSerial(Year(CDate(Date)), 1, 0)
'
'   im Tabellenblatt Urlaub die Tage je Mitarbeiter zählen, die mit
'   einem "H" gekennzeichnet sind - und zwar bis zum lfd Tag des Jahres
'
   With Worksheets("Urlaub")                     ' im Tabellenblatt "Urlaub"
      lLetzte = IIf(.Range("C65536") <> "", 65536, .Range("C65536").End(xlUp).Row)
      lSpalte = IIf(.Cells(8, 256) <> "", 256, .Cells(8, 256).End(xlToLeft).Column)
      For iSpalte = 4 To lSpalte                 ' ab Spalte C bis Ende
         iAnzHalbtag = 0                         ' Zähler löschen
         If Cells(8, iSpalte).Value <> "" Then   ' ist ein MA eingetragen ?
            For lZeile = 11 To iLfdTag + 11      ' ab Zeile 11 bis lfd Tag
               If UCase(Cells(lZeile, iSpalte).Value) = "H" Then ' ein großes "H"
                  iAnzHalbtag = iAnzHalbtag + 1  ' Zähler aufaddieren
               End If
            Next lZeile                          ' nächste Zeile
         End If
         If iAnzHalbtag > 0 Then                 ' gab es Halbtagsarbeit ?
            .Cells(9, iSpalte).Value = iAnzHalbtag
          Else
            .Cells(9, iSpalte).Value = ""
         End If
      Next iSpalte                               ' nächster Mitarbeiter
   End With
End Sub 


Viele Grüße Peter
Eine kurze Nachricht, ob es läuft, wäre nett - danke.
Anzeige
AW: geht's auch einfacher
09.02.2007 16:36:58
sonja.ausHH
Hallo Peter,
schön dass Du mir noch weiter hilfst.
Danke auch für die Zeilenkommentare, sehr hilfreich.
Ich habe schon sehr viel daraus gelernt, aber noch immer unwisssender Anfänger.
Dein Code läuft nach Anpassung am schnellsten.
Mußte aus "For iSpalte = 4 To lSpalte" , "For iSpalte = 4 To 203" machen, da es einen Fehler mit Ucase kam.
Die Tabelle ist in Spalte 203 (GU) zu ende und danach kommen noch Zahlen.
Kann ich einen "Timer" bei solchen Routinen laufen lassen, um festzustellen was die schnellste Lösung ist? (Anfängerfrage).
schönen Tag
sonja.ausHH
Anzeige
AW: geht's auch einfacher
09.02.2007 18:02:18
Peter
Hallo Sonja,
ich habe den Timer noch nie verwendet, da mich Laufzeiten bisher nicht sonderlich interessiert haben. Unter Google kannst du mit Timer site: Herber.de bestimmt Beispiele finden.
ein schönes Wochenende.
Viele Grüße Peter
AW: geht's auch einfacher
09.02.2007 15:23:11
Peter
Hallo Sonja,
meintest du es so?


Public Sub Halbtags()
Dim lZeile       As Long
Dim lLetzte      As Long
Dim iSpalte      As Integer
Dim lSpalte      As Integer
Dim iLfdTag      As Integer
Dim iAnzHalbtag  As Integer
   iLfdTag = CDate(Date) - DateSerial(Year(CDate(Date)), 1, 0)
   With Worksheets("Urlaub")
      lLetzte = IIf(.Range("C65536") <> "", 65536, .Range("C65536").End(xlUp).Row)
      lSpalte = IIf(.Cells(8, 256) <> "", 256, .Cells(8, 256).End(xlToLeft).Column)
      For iSpalte = 4 To lSpalte
         iAnzHalbtag = 0
         If Cells(8, iSpalte).Value <> "" Then
            For lZeile = 11 To iLfdTag + 11
               If UCase(Cells(lZeile, iSpalte).Value) = "H" Then
                  iAnzHalbtag = iAnzHalbtag + 1
               End If
            Next lZeile
         End If
         If iAnzHalbtag > 0 Then
            MsgBox "der Mitarbeiter  """ & Cells(8, iSpalte) & """  hat  " & _
               iAnzHalbtag & "  Tage halbtags gearbeitet.", _
               64, "   Hinweis für " & Application.UserName
         End If
      Next iSpalte
   End With
End Sub 


Viele Grüße Peter
Eine kurze Nachricht, ob es läuft, wäre nett - danke.
Anzeige
Bsp-Datei
09.02.2007 16:00:13
ingoG
Hallo Sonja,
kann es sein, dass Du eine bedingte Formatierung auf Zeile 9 hast?
ich habe Dir mal eine Testdatei hochgeladen:
https://www.herber.de/bbs/user/40284.xls
vielleicht solltest Du mal den Code im Debugger laufen lassen und dir die jeweiligen Feldinhalte anschauen (in Deiner Datei).
Ich vermute, dass er Deine Datumswerte nicht erkennt und aus diesem Grund beim Zählen der Zeilen gegen die Wand läuft...
Der String "25.01.2007" ist nämlich größer als int(Now)
Gruß Ingo
AW: Bsp-Datei
09.02.2007 16:47:37
sonja.ausHH
Hallo Ingo,
besten Dank für Deine Hilfe.
Muß mich bei Dir entschuldigen, Dein Code lief von Anfang an, hatte nur nen blööööööden Anfängerfehler gemacht. Möcht ich jetzt hier gar nicht Komentieren. (schäm)
Tschuldigung.
Zitat: "Der String "25.01.2007" ist nämlich größer als int(Now)"
Kommt es jetzt am 25.01.2007 zum Fehler? Oder auch noch bei anderen Daten?
Das mit dem Int(Now) verstehe ich noch nicht ganz, aber bin Anfänger und das lern ich sicher noch.
schönes Wochenende
sonja.ausHH
Anzeige
AW: Bsp-Datei
09.02.2007 17:25:49
ingoG
Hallo Sonja,
wenn Du anstatt Datumswerte Strings in Deiner Spalte stehen hast, dann arbeitet meine erste Schleife nicht. dh er gibt dort immer als Zeile=11 zurück.
entweder stellst Du sicher, dass die werte auch wirklich Datumswerte sind, oder die abfrage in der 1. Schleife muß lauten:
If DateValue(Cells(zeile, 3)) >= Int(Now) Then Exit For
bei Zeit/Datumswerten in Excel handelt es sich um einen Zahlenwert, der die Tage seit 01.01.1900 zählt.
so ist der 09.02.2007 der 39122. Tag nach diesem Ref-datum.
Zeitwerte werden als Teile von Tagen angesehen so dass zB 12:00 stunden =0,5 sind.
so ist also heute um 12:00 Uhr der Wert von Now =39122,5 gewesen.
mit int() erhälst Du den Ganzzahligen wert also das reine Datum.
Ich hoffe, das hilft Dir etwas weiter.
Gruß Ingo
PS läuft der Code dann mit der neuen Abfrage?
Anzeige
Danke Ingo, läuft perfekt
09.02.2007 19:43:55
sonja
Danke an alle
Gerne, Danke für die Rückmeldung oT
09.02.2007 19:59:48
IngoG
.
Mit Formel, ohne Makro
09.02.2007 16:00:14
mpb
Hallo Sonja,
schreibe in D9 folgende Matrixformel und kopiere sie bis GU9:
=WENN(ISTLEER(D8);"";SUMME(($C$11:$C$39<=HEUTE())*(D11:D39="H")))
Eingabe der Formel nicht mit RETURN, sondern mit SRTG-SHIFT-RETURN abschließen.
Vorteil der Formel gegenüber Makro: immer aktuell und muss nicht ständig neugestartet werde.
Gruß
Martin

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige