Office: Monatszahlenzuordnung

Helfe beim Thema Monatszahlenzuordnung in Microsoft Excel Hilfe um das Problem gemeinsam zu lösen; Hallöchen, Ich hätte ein kleines und wahrscheinlich banales Problem. Ich hab einen Code der Zahlen aus Monatsarbeitsblättern in eine Tabelle einer... Dieses Thema im Forum "Microsoft Excel Hilfe" wurde erstellt von Christine, 7. August 2008.

  1. Christine Erfahrener User

    Monatszahlenzuordnung


    Hallöchen,

    Ich hätte ein kleines und wahrscheinlich banales Problem.
    Ich hab einen Code der Zahlen aus Monatsarbeitsblättern in eine Tabelle einer anderen Arbeitsmappe einfügt. Es ist ganz deutlich programmirt dass wenn das Tabellenblatt 1 ist, also Januar, dass er dann in der dazugehörigen Tabelle diese Zahl in die Zeile einer Zelle einfügt die auch eine 1 enthält. Aber irgendwie klappt es nicht. Ich hoffe ich habe es irgendwie verständlich erklärt.
    Könnt ihr mir sagen wo der Fehler liegt?

    Danke schon im Vorraus.

    Code:
    Sub AddKstToJahresdiagramm(ByVal kst As Integer, ByVal wert As Integer, ByVal month As Integer)
        ' Finden des Projekts zu der Kostenstelle
        Dim projektName As String
        
        If wert = 0 Then
            Exit Sub
        End If
        
        With Tabelle3
            ' finde das projekt zu der kst
            Dim currZeile As Integer
            currZeile = 7
            Do While (.Cells(currZeile, 4).Value <> "" Or .Cells(currZeile, 5).Value <> "" Or .Cells(currZeile, 6).Value <> "")
                If .Cells(currZeile, 4).Value = kst Then
                    projektName = .Cells(currZeile, 8).Value
                    Exit Do
                End If
                currZeile = currZeile + 1
            Loop
            
            If projektName = "" Then
                MsgBox "Kein Projektname für Kostenstelle " & kst & " gefunden"
                Exit Sub
            End If
            
            ' Finden der Tabelle für dieses Projekt in der Jahresübersicht
            currZeile = jahresdiagrammZeile
            Do While (.Cells(currZeile, 1).Value <> "ENDE DER TABELLE")
                If .Cells(currZeile, 1).Value = projektName Then
                    ' Suche den passenden monat
                    Dim i As Integer
                    
                    For i = 1 To 24
                        If .Cells(currZeile + i, 1).Value = month Then
                            ' Finden der Kostenstelle-Spalte
                            Dim j As Integer
                            j = 1
                            Do While (.Cells(jahresdiagrammZeile, j).Value <> "")
                                If .Cells(jahresdiagrammZeile, j).Value = kst Then
                                    ' Gibt es bereits einen Wert für diese Konstelation?
                                    Dim neuerWert As Integer
                                    If .Cells(currZeile + i, j).Value <> "" Then
                                        neuerWert = .Cells(currZeile + i, j).Value + wert
                                    Else
                                        neuerWert = wert
                                    End If
                                    
                                    ' den neuen Wert eintragen
                                    .Cells(currZeile + i, j).Value = neuerWert
                                End If
                                j = j + 1
                            Loop
                        End If
                    Next i
                End If
                currZeile = currZeile + 1
            Loop
            
        End With
    End Sub
     
    Christine, 7. August 2008
    #1
  2. schatzi Super-Moderator
    Hallo!

    Ich bin zwar VBA-Anwender im Anfangs-Stadium, aber jetzt wird's schwierig...
    1. Keiner außer dir kennt hier die übergebenen Variablen kst, wert und month.
    2. Die Variable jahresdiagrammZeile kennen wir auch nicht. (oder habe ich etwas übersehen?)
    3.
    In diesem Fall ist "Deutlichkeit" äußerst subjektiv, denn eine solche Abfrage kann ich nicht entdecken... (Hilf mir auf die Sprünge, bitte!)

    Daher erstmal nur dieser Hinweis:
    Die Excel-Formel =MONAT(0) ergibt auch 1.
    Solltest du also Nullwerte in deiner Tabelle haben, dann könnte hier der Fehler liegen.
     
    schatzi, 7. August 2008
    #2
  3. miriki Erfahrener User
    Hmmm... Also... Ich hab den Source mal durchgeguckt und etwas umformatiert. Vor allem:
    * Ich mag keine GOTOs und versuche aus gleichem Grund, auch EXITs zu vermeiden. Deswegen sehen die IF-Konstrukte in meiner Version etwas anders aus.
    * Einrückungen im Source machen diesen bedeutend leichter lesbar. Das kann aber auch nur deswegen verloren gegangen sein, weil die <code> Formatierung in Deinem Posting nicht funktionierte.

    2 der Variablen kann man nur erraten:
    * jahresdiagrammZeile - sieht nach Konstante aus, die nur eine Startzeile angibt. Das scheint dann unkritisch.
    * Tabelle3 - Refenz auf ein Tabellenblatt, unkritisch.

    Die 3 Übergabewerte kst, wert und month sind im Prinzip auch unkritisch. Aber: "month" als Variablenname ist sehr unglücklich, da es auch eine gleichlautende Funktion gibt. Ähnlich wie z.B. auch "name" sollte man solche Variablennamen vermeiden. Ich glaub's zwar nicht, aber vielleicht löst das Ändern dieses Namens schon Dein Problem?

    Code:
    Option Explicit
    
    Sub AddKstToJahresdiagramm(ByVal kst As Integer, ByVal wert As Integer, ByVal month As Integer)
    
    Dim projektName As String
    Dim currZeile As Integer
    Dim i As Integer
    Dim j As Integer
    Dim neuerWert As Integer
    Dim jahresdiagrammZeile As Long
    Dim Tabelle3 As Worksheet
    
        Set Tabelle3 = Worksheets(1)
        jahresdiagrammZeile = 1
    
        If wert <> 0 Then
            With Tabelle3
    
                ' finde das projekt zu der kst
                projektName = "": currZeile = 7
                Do While (projektName = "") And (.Cells(currZeile, 4).Value <> "" Or .Cells(currZeile, 5).Value <> "" Or .Cells(currZeile, 6).Value <> "")
                    If .Cells(currZeile, 4).Value = kst Then
                        projektName = .Cells(currZeile, 8).Value
                    End If
                    currZeile = currZeile + 1
                Loop
    
                If projektName <> "" Then
    
                    ' Finden der Tabelle für dieses Projekt in der Jahresübersicht
                    currZeile = jahresdiagrammZeile
                    Do While (.Cells(currZeile, 1).Value <> "ENDE DER TABELLE")
                        If .Cells(currZeile, 1).Value = projektName Then
                            ' Suche den passenden monat
                            For i = 1 To 24
                                If .Cells(currZeile + i, 1).Value = month Then
                                    ' Finden der Kostenstelle-Spalte
                                    j = 1
                                    Do While (.Cells(jahresdiagrammZeile, j).Value <> "")
                                        If .Cells(jahresdiagrammZeile, j).Value = kst Then
                                            ' Gibt es bereits einen Wert für diese Konstelation?
                                            If .Cells(currZeile + i, j).Value <> "" Then
                                                neuerWert = .Cells(currZeile + i, j).Value + wert
                                              Else
                                                neuerWert = wert
                                            End If
                                            ' den neuen Wert eintragen
                                            .Cells(currZeile + i, j).Value = neuerWert
                                        End If
                                        j = j + 1
                                    Loop
                                End If
                            Next i
                        End If
                        currZeile = currZeile + 1
                    Loop
    
                  Else
                    MsgBox "Kein Projektname für Kostenstelle " & kst & " gefunden"
                End If
            End With
        End If
    End Sub
    Den ganzen Block
    Code:
                                            If .Cells(currZeile + i, j).Value <> "" Then 
                                                neuerWert = .Cells(currZeile + i, j).Value + wert 
                                              Else 
                                                neuerWert = wert 
                                            End If 
                                            ' den neuen Wert eintragen 
                                            .Cells(currZeile + i, j).Value = neuerWert
    kannst Du auch bedeutend kürzer als
    Code:
                                            ' den neuen Wert eintragen 
                                            .Cells(currZeile + i, j).Value = .Cells(currZeile + i, j).Value + neuerWert
    schreiben. Denn: Ist die Zeile leer, wird der Wert als "0" interpretiert und hat somit keinen Einfluß. Das DIM für neuerWert kann entsprechend entfallen.

    Die DIM für currZeile, i und j würde ich persönlich übrigens auch eher auf "long" setzen, aber das hat hier wahrscheinlich keinen Einfluß.

    Deine Aussage
    ist ja nun aber auch etwas... ähm... unspezifisch... ;-) Was genau klappt denn nicht? Findet er den Projektnamen schon nicht? Oder findet er bei gefundenem Projektnamen nicht die zugehörige Tabelle? Oder den passenden Monat?

    Wenn das Ding irgendwas tut, was es nicht sollte, dafür aber etwas nicht tut, was man erwartet, dann sind ja normalerweise immer irgendwelche IF-Konstrukte dafür, also für vermeintlich falsche Wege, verantwortlich. Setz ruhig mal den einen oder anderen Breakpoint auf die IF-Zeilen und laß Dir bei Erreichen der Zeilen im Überwachungsfenster mal die relevanten Variablen anzeigen. Meist bringt das schon Licht ins Dunkel. ;-)

    Gruß, Michael
     
    miriki, 8. August 2008
    #3
Thema:

Monatszahlenzuordnung

  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden