Letzter Wert einer Zeile

Hallo,

ich habe 2 Probleme:

  1. Wie kann ich in einer Zeile ermitteln, welches der letzte Wert der Zeile ist, der grösser Null ist?

  2. Da ich keine Lösung gefunden habe, habe ich das Problem per Makro(VBA) gelöst.

Funktioniert auch (siehe Code).

Beim Ausführen des Makros sieht man jedoch, wird immer wieder die Bildschirmanzeige aktualisiert wird.
Kann man dies per Befehl abschalten?

Der Code:

Sub Makro1()

’ Was macht dieses Makro?
’ Zunächst positioniert sich das Makro auf die Zelle B1
’ Dann geht wird 2 Zeilen nach unten und 0 Zeilen nach rechts positioniert
’ aktuelle Zelle ist demnach B3 (dies kann in der Zeile ActiveCell.Offset(2, 0).Select)
’ angepasst werden.

’ Dann durchläuft das Makro 1000 Zeilen nach unten
’ In jeder Zeile werden 100 Spalten nach rechts durchlaufen und der letzte
’ Wert ermittelt, der größer als Null ist.
’ Dann springt das Makro wieder 100 Spalten zurück und trägt den gefundenen
’ Wert in der jeweiligen Spalte B ein.
’ Nach Bearbeitung springt das Makro in die Zelle A2

’ Bei Anpassungen müssen die folgenden Zeilen berücksichtigt werden
’ For J = 1 To 1000
’ For I = 1 To 100
’ ActiveCell.Offset(0, -100).Select

’ Version 1: 6.6.2004 Peter Desch

Dim I, J As Integer
Dim Wert As Single

Range(„B1“).Select
ActiveCell.Offset(2, 0).Select
For J = 1 To 1000
Wert = 0
For I = 1 To 100
ActiveCell.Offset(0, 1).Select
If ActiveCell.Value > 0 Then Wert = ActiveCell.Value
Next I
ActiveCell.Offset(0, -100).Select
ActiveCell.Value = Wert
ActiveCell.Offset(1, 0).Select
Next J
Range(„A2“).Select
End Sub

Danke für jeden Hinweis

Peter

Hallo Peter,
am Anfang des Makros schreibe Application.ScreenUpdating = False
Und am Ende des Makros gehört die Zeile Application.ScreenUpdating = True

Ich hoffe das es dir weiter hilft

MfG Günter

vielleicht hilft Dir das Beispiel von Unten
da wurde mit =ANZAHL(A:A) gearbeitet…
Ist halt doof wenn Du leere Zellen dazwischen hast…

Hi Peter

  1. Wie kann ich in einer Zeile ermitteln, welches der letzte
    Wert der Zeile ist, der grösser Null ist?

Z.B. mittels einer Matrixformel(also mit Strg+Shift+Enter eingeben):
=INDIREKT(ADRESSE(3;MAX((3:3>0)*SPALTE(3:3))))
Hier wird der Inhalt der letzte Zelle der >0 ist, in Zeile 3 ermittelt. Die Formel kann überall nur nicht in der Zeile 3 selbst (Zirkelbezug) benutzt werden. Also für deine Problematik nixht brauchbar.

Beim Ausführen des Makros sieht man jedoch, wird immer wieder
die Bildschirmanzeige aktualisiert wird.
Kann man dies per Befehl abschalten?

ja, wurde dir ja schon geschrieben wie.

Folgendes zu deinem Code, versuch select zu vermeiden, ist zu 99% unnötig.
Ich habe deinen Code mal gekürzt, siehe nachfolgende Codes und auch eine andere (schnellere) Variante erstellt.
In der VBA-Hilfe benutzt microsoft Dim falsch. Mit deinem
Dim I, J As Integer
hast du nur J als Integer festgelegt, I ist als Variabel festgelegt.
Korrekt ist
Dim I as Integer, J as Integer
Wenn du Code postest setze davor ein

und nach dem Code ein


    
    dann gehen deine Codeeinrückungen nicht flöten und man kann den Code lesen
    Gruß
    Reinhard
    
        
        Sub Makro1()
        Dim I As Integer, J As Integer
        Application.ScreenUpdating = False
        For J = 0 To 999
         For I = 1 To 100
         If Range("B3").Offset(J, I).Value \> 0 Then \_
         ActiveCell.Offset(J, 0).Value = ActiveCell.Offset(J, I).Value
         Next I
        Next J
        Range("A2").Select
        Application.ScreenUpdating = True
        End Sub
        
        Sub grössernull()
        Dim liSpalte As Integer ' Spaltenindex
        Dim n As Integer 'schleifenzaehler
        Dim sz As Long 'Startzeile
        Application.ScreenUpdating = False
        sz = Range("B3").Row
        For n = 0 To 999
         liSpalte = Cells(sz + n, 256).End(xlToLeft).Column 'letze nicht leere Zelle
         While liSpalte \> 1 And Cells(sz + n, liSpalte) 1 Then
         Cells(sz + n, 2) = Cells(sz + n, liSpalte) 'gefundenen Wert eintragen
         Else
         Cells(sz + n, 2) = 0 'in der zeile gabs nix mit \>0
         End If
        Next n
        Range("A2").Select
        Application.ScreenUpdating = True
        End Sub
        
        Sub grössernull2()
        Application.ScreenUpdating = False
        sz = Range("B3").Row
        Set sp = Range("iv1")
        For n = 0 To 999
         sp.FormulaArray = "=MAX((" & sz + n & ":" & sz + n & "\>0)\*column(" & sz + n & ":" & sz + n & "))"
         If sp.Value \> 0 Then Cells(sz + n, 2) = Cells(sz + n, sp.Value)
        Next n
        sp.Clear
        Set sp = Nothing
        Application.ScreenUpdating = True
        End Sub
    
    
    
    
    
    
    > Der Code:  
    >   
    > Sub Makro1()  
    > '  
    > ' Was macht dieses Makro?  
    > ' Zunächst positioniert sich das Makro auf die Zelle B1  
    > ' Dann geht wird 2 Zeilen nach unten und 0 Zeilen nach rechts  
    > positioniert  
    > ' aktuelle Zelle ist demnach B3 (dies kann in der Zeile  
    > ActiveCell.Offset(2, 0).Select)  
    > ' angepasst werden.  
    >   
    > ' Dann durchläuft das Makro 1000 Zeilen nach unten  
    > ' In jeder Zeile werden 100 Spalten nach rechts durchlaufen  
    > und der letzte  
    > ' Wert ermittelt, der größer als Null ist.  
    > ' Dann springt das Makro wieder 100 Spalten zurück und trägt  
    > den gefundenen  
    > ' Wert in der jeweiligen Spalte B ein.  
    > ' Nach Bearbeitung springt das Makro in die Zelle A2  
    >   
    > ' Bei Anpassungen müssen die folgenden Zeilen berücksichtigt  
    > werden  
    > ' For J = 1 To 1000  
    > ' For I = 1 To 100  
    > ' ActiveCell.Offset(0, -100).Select  
    >   
    > ' Version 1: 6.6.2004 Peter Desch  
    >   
    > Dim I, J As Integer  
    > Dim Wert As Single  
    >   
    > Range("B1").Select  
    > ActiveCell.Offset(2, 0).Select  
    > For J = 1 To 1000  
    > Wert = 0  
    > For I = 1 To 100  
    > ActiveCell.Offset(0, 1).Select  
    > If ActiveCell.Value \> 0 Then Wert = ActiveCell.Value  
    > Next I  
    > ActiveCell.Offset(0, -100).Select  
    > ActiveCell.Value = Wert  
    > ActiveCell.Offset(1, 0).Select  
    > Next J  
    > Range("A2").Select  
    > End Sub  
    >   
    > Danke für jeden Hinweis  
    >   
    > Peter

Danke
Vielen Dank für die Hilfe,

Application… hat schon viel gebracht,

aber das Beispiel von Reinhard ist ein Geschwindigkeitsrausch. Danke viel anhand des Codes gelernt.

Eine Frage noch:
Ich programmiere viel in Access, ist es dort eigentlich auch so, dass Dim I,J as Integer dazu führt, dass J als Variabel definiert wird?

Nochmals Dank für die schnelle und kompetente Hilfe.

Peter