Microsoft Excel

Herbers Excel/VBA-Archiv

Makro erweiterung | Herbers Excel-Forum


Betrifft: Makro erweiterung von: Jochen Bode
Geschrieben am: 20.08.2012 14:26:51

Hallo Excel-Freund, habe folgendes Makro das wenn ich in dem Bereich E9:BX38 einen Wert eintrage wird das Ergebnis in Spalte C bzw. D aus gegeben:

Public Function Monate()
    Const Monat_Max = 48
    jahr = Cells(1, 83)
    Debug.Print monat
    Debug.Print jahr

    For j = 9 To 38
        monat = Cells(1, 82)
        If Cells(1, 84) = "hinten" Then
            monat = monat + 12
        End If
        summe = 0
        summeESS = 0
        For i = 1 To 6
            summe = summe + Cells(j, (monat + (monat - 1) + 4) + monat - 1)
            summeESS = summeESS + Cells(j, (monat + (monat - 1) + 6) + monat - 1)
            monat = monat + 1
        Next
        Monate = summe
        Debug.Print summe
        Debug.Print summeESS
        Cells(j, 3) = Monate
        Cells(j, 4) = summeESS
        
    Next
End Function
Nun mein Problem: Es wird immer der ganze Bereich neu berechnet. Besteht die Möglichkeit das nur die Zeile in der ich einen Wert ändere berechnet wird.

Danke im Voraus.

Gruß
Jochen

  

Betrifft: AW: Makro erweiterung von: Rudi Maintaire
Geschrieben am: 20.08.2012 14:48:51

Hallo,
wie wird die Funktion denn aufgerufen?
Per Worksheet_Change-Event? Dann übergib die Zeile der geänderten Zelle an die Funktion.

Public Function Monate(j as long)
    Const Monat_Max = 48
    jahr = Cells(1, 83)
    Debug.Print monat
    Debug.Print jahr

        monat = Cells(1, 82)
        If Cells(1, 84) = "hinten" Then
            monat = monat + 12
        End If
        summe = 0
        summeESS = 0
        For i = 1 To 6
            summe = summe + Cells(j, (monat + (monat - 1) + 4) + monat - 1)
            summeESS = summeESS + Cells(j, (monat + (monat - 1) + 6) + monat - 1)
            monat = monat + 1
        Next
        Monate = summe
        Debug.Print summe
        Debug.Print summeESS
        Cells(j, 3) = Monate
        Cells(j, 4) = summeESS
        
End Function

btw: Funktionen sollten ausschließlich Werte zurück geben und nie irgendwelche Aktionen ausführen.

Gruß
Rudi


  

Betrifft: AW: Makro erweiterung von: Jochen Bode
Geschrieben am: 20.08.2012 15:08:24

Hiermit wird das ganze ausgelöst:

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, Range("E9:BX38")) Is Nothing Then
  Call Monate

End If
End Sub
Gruß
Jochen


  

Betrifft: AW: Makro erweiterung von: Rudi Maintaire
Geschrieben am: 20.08.2012 16:30:02

Hallo,

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, Range("E9:BX38")) Is Nothing Then
  Call Monate target.Row
End If
End Sub

Public SubMonate(j as long)
    Const Monat_Max = 48
    jahr = Cells(1, 83)
    Debug.Print monat
    Debug.Print jahr

        monat = Cells(1, 82)
        If Cells(1, 84) = "hinten" Then
            monat = monat + 12
        End If
        summe = 0
        summeESS = 0
        For i = 1 To 6
            summe = summe + Cells(j, (monat + (monat - 1) + 4) + monat - 1)
            summeESS = summeESS + Cells(j, (monat + (monat - 1) + 6) + monat - 1)
            monat = monat + 1
        Next
        Monate = summe
        Debug.Print summe
        Debug.Print summeESS
        Cells(j, 3) = Monate
        Cells(j, 4) = summeESS
        
End Sub

Mit Call werden Subs aufgerufen!

Gruß
Rudi


  

Betrifft: AW: Makro erweiterung von: Jochen Bode
Geschrieben am: 20.08.2012 16:48:10

Hallo Rudi,

diese beiden Zeilen sind Rot geschrieben:

Call Monate target.Row

Public SubMonate(j as long)

Hast Du dafür eine Antwort???

Gruß
Jochen


  

Betrifft: AW: Makro Erweiterung von: Rudi Maintaire
Geschrieben am: 20.08.2012 19:57:33

Hallo,
Hast Du dafür eine Antwort???
Sicher. Das kommt davon, wenn man direkt im Forum programmiert und nicht im VBA-Editor. ;-)

Call Monate (Target.Row)
Public Sub Monate(j as long)

Könnte man aber auch selbst drauf kommen.

Gruß
Rudi


  

Betrifft: AW: Makro Erweiterung von: Jochen Bode
Geschrieben am: 21.08.2012 07:19:44

Guten Morgen Rudi,
danke für die Antwort, aber der Hinweis "Könnte man aber auch selbst drauf kommen" war nicht i.O.
Wenn Du mal schaust ich habe VBA bescheiden angegeben!

Nun einen schönen und sonnigen Tag,

Gruß
Jochen


  

Betrifft: VBA bescheiden von: Rudi Maintaire
Geschrieben am: 21.08.2012 10:56:19

Hallo,
dass zwischen Sub und den Namen der Prozedur ein Leerzeichen gehört, ist doch wohl klar.
Und dass bei einer Call-Anweisung die Argumente der aufgerufenen Prozedur in () stehen müssen, kannst du in der Hilfe lesen.

Gruß
Rudi