Hallo,
ich habe 2 Probleme:
-
Wie kann ich in einer Zeile ermitteln, welches der letzte Wert der Zeile ist, der grösser Null ist?
-
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
- 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