collapse

* Benutzer Info

 
 
Willkommen Gast. Bitte einloggen oder registrieren. Haben Sie Ihre Aktivierungs E-Mail übersehen?

* Wer ist Online

  • Punkt Gäste: 25
  • Punkt Versteckte: 0
  • Punkt Mitglieder: 0

Es sind keine Mitglieder online.

* Forenstatistik

  • stats Mitglieder insgesamt: 13811
  • stats Beiträge insgesamt: 64313
  • stats Themen insgesamt: 8696
  • stats Kategorien insgesamt: 5
  • stats Boards insgesamt: 16
  • stats Am meisten online: 415

Autor Thema: VBA - Schleifen  (Gelesen 1566 mal)

Offline Toni2

  • Newbie
  • Beiträge: 3
VBA - Schleifen
« am: Mai 05, 2016, 20:18:26 »
Hallo,

ich suche eine Erweiterung für meinen bisher erstellten VBA-Code (siehe Anhang).
Mit dem Code soll die Hauptphase in Tabelle 1 für jede Id eingetragen werden.
Wenn die Hauptphase in Tabelle 2 den Wert 1 hat , ist diejenige Phase als Hauptphase einzutragen, die das früheste Von-Datum hat.
Das funktioniert auch soweit bis auf einen Fall:
Wenn bei einer Id die Von-Daten übereinstimmen und die Phasen nicht übereinstimmen (wie bei Id1), soll bei Hauptphase für die entsprechende Id "keine Zuordnung
möglich" eingetragen werden.

Hat jemand eine Idee, was ich noch einbauen muss, damit dieser Fall abgedeckt wird?

Vielen Dank.
 

Offline Toni2

  • Newbie
  • Beiträge: 3
Re: VBA - Schleifen
« Antwort #1 am: Mai 06, 2016, 18:07:55 »
Hat wirklich niemand eine Lösung?
 

Offline MzKlMu

  • Moderator
  • Access-Oberguru
  • *****
  • Beiträge: 7033
Re: VBA - Schleifen
« Antwort #2 am: Mai 06, 2016, 18:57:56 »
Hallo,
das Problem scheint eher zu sein, dass niemand Dein Vorhaben/Problem versteht.
Das trifft wohl auch im anderen Forum zu.
http://www.office-loesung.de/p/viewtopic.php?f=167&t=717382

Deine DB kann ich mir nicht ansehen, da ich kein neueres Access (ACCDB) habe.
Gruß
Klaus
 

Offline Toni2

  • Newbie
  • Beiträge: 3
Re: VBA - Schleifen
« Antwort #3 am: Mai 06, 2016, 20:11:10 »
Oh, wenn man die nicht öffnen kann, ist es auch nicht zu verstehen. Sorry.
Ich habe folgende Tabelle gegegeben:
Hauptphase = 0 heißt, dass es keine Hauptphase ist.
Hauptphase = 1 heißt, dass es die Hauptphase ist.

Id   Hauptphase   von             bis                   Phase
1   1                   01/08/2014   01/08/2015   Phase 1
1   1                   01/08/2014   01/08/2015   Phase 2
1   1                   01/08/2015   01/08/2016   Phase 1
1   1                   01/08/2015   01/08/2016   Phase 2
2   1                   01/08/2015   01/08/2016   Phase 3
2   0                   01/08/2015   01/08/2016   Phase 4
3   1                   01/08/2015   01/08/2016   Phase 1
3   1                   01/10/2015   01/08/2016   Phase 2
4   1                   01/10/2015   02/08/2016   Phase 4
4   1                   01/10/2015   03/08/2017   Phase 4
5   0                   01/10/2013   01/07/2014   Phase 3

Ich möchte jetzt für jede Id die Hauptphase bestimmen:
Gibt es für eine Id nur eine Zeile mit Hauptphase = 1, kann die
entsprechende Phase übernommen werden (z.B. Id 2).
Gibt es für eine Id mehrere Zeilen mit Hauptphase = 1 (z.B. Id 3),
soll die Id mit dem frühesten Von-Datum als Hauptphase ausgewählt werden.
Ist das Von-Datum allerdings für mehrere Zeilen identisch und die Phasen jedoch unterschiedlich (z.B. Id 1), soll "keine Zuordnung möglich" angezeigt werden.

Gibt es nur Zeilen mit Hauptphase = 0 (z.B. Id 5), soll auch "keine Zuordnung möglich" angezeigt werden.

Als Ergebnis soll sich Folgendes ergeben:
Id       Hauptphase
1        keine Zuordnung möglich
2        Phase 3
3        Phase 1
4        Phase 4
5        keine Zuordnung möglich

Ich hoffe, es ist nun ein wenig verständlicher. Ansonsten bitte nachfragen.
Danke.
 

Offline crystal

  • Access-Profi
  • **
  • Beiträge: 360
Re: VBA - Schleifen
« Antwort #4 am: Mai 15, 2016, 12:43:56 »
Hallo,
zunächst einmal möchte ich dir empfehlen, in VBA immer die "Option explicit" zu setzen und den Code sinnvoll zu strukturieren (einrücken).

Ich habe das mal gemacht:
Option Compare Database
Option Explicit  '#

Sub Test()

Dim db      As DAO.Database
Dim SQL     As String
Dim rstTab1 As DAO.Recordset
Dim tab2    As DAO.Recordset '#
Dim z       As Integer '#

Set db = CurrentDb
Set rstTab1 = db.OpenRecordset("Tabelle1")

If Not rstTab1.EOF = True And Not rstTab1.BOF = True Then rstTab1.MoveFirst '#m.E. unnötig

Do While rstTab1.EOF = False

    SQL = "SELECT Tabelle2.Id, Tabelle2.Hauptphase, Tabelle2.von, Tabelle2.bis, Tabelle2.Phase " & _
          "FROM Tabelle2 " & _
          "WHERE ((Tabelle2.Id) =" & rstTab1.Fields!Id & ") " & _
          "ORDER BY Tabelle2.Von;"
    Set tab2 = db.OpenRecordset(SQL)
    If Not tab2.EOF = True And Not tab2.BOF = True Then tab2.MoveFirst '#m.E. unnötig
    z = 0
    Do While tab2.EOF = False
        If tab2.Fields!Hauptphase = 1 Then
            z = 1
            rstTab1.Edit
            rstTab1.Fields!Hauptphase = tab2.Fields!Phase
            rstTab1.Update
            Exit Do
        End If
        tab2.MoveNext
    Loop
    If z = 0 Then
        rstTab1.Edit
        rstTab1.Fields!Hauptphase = "keine Zuordnung möglich"
        rstTab1.Update
    End If
    Set tab2 = Nothing
       
    rstTab1.MoveNext
Loop

'Set rstFoeB = Nothing '#???
Set rstTab1 = Nothing '#
Set db = Nothing

End Sub

So ist es doch etwas übersichtlicher...

Es fällt auf, dass du den Fall
Zitat
Ist das Von-Datum allerdings für mehrere Zeilen identisch und die Phasen jedoch unterschiedlich (z.B. Id 1), soll "keine Zuordnung möglich" angezeigt werden.

gar nicht überprüfst. Dazu müsstest du ja das Von-Datum vergleichen.

Nebenbei bemerkt:
Die Code-Zeilen "if not rs.eof = true and not rs.bof = true then rs.movefirst" könnte man auch so schreiben:
"if not rs.eof and not rs.bof then rs.movefirst".
Sie sind aber überflüssig, da der rs-Zeiger nach Öffnen sowieso auf bof steht. Und wenn es nur genau einen Datensatz gibt, ist eof auch true, glaube ich jedenfalls (oder wird eof erst gesetzt, wenn man den letzen vorhandenen Record mit movenext verlässt? Das weiß ich gerade nicht... Bitte selbst prüfen, da ich momentan leider keine Zeit habe.)

Bevor wir also weitermachen, schau dir deinen Code selbst noch einmal an und baue die Von-Datum-Logik ein.

Unklar ist noch, wann deine Sub "Test" überhaupt aufgerufen werden soll und warum sie dann jedesmal die gesamte Tabelle1 abscannen soll.

Frohe Pfingsten,

c
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!