fitzin
Goto Top

VBA - minimalen Wert in Zeile suchen und Spaltenüberschrift ausgeben

Hallo,

ich bräuchte ein Makro, mit dem pro Zeile der geringste Wert (ev. zusätzlich auch der 2. und 3. geringste Wert) ermittelt wird und die Spaltenüberschrift ausgegeben wird. Kann mir da bitte jemand weiterhelfen?

lg fitzin

Content-Key: 183658

Url: https://administrator.de/contentid/183658

Printed on: April 25, 2024 at 19:04 o'clock

Member: NetWolf
NetWolf Apr 17, 2012 at 14:00:37 (UTC)
Goto Top
Moin Moin,

Zeilen haben keine Spaltenüberschriften! Das was du wünscht kann also nicht funktionieren.

btw benötigst du für einzelne Werte kein VBA, dass kann Excel i.d.R. auch ohne

Grüße aus Rostock
Wolfgang
(Netwolf)
Member: mak-xxl
mak-xxl Apr 17, 2012 at 14:25:43 (UTC)
Goto Top
Moin fitzin,

wenn Du z.B. in die Zelle 'A1' die Formel
=KKLEINSTE(A2:IV2;1)
schreibst, so wird aus der gesamten 2. Zeile der Tabelle der kleinste Wert gefunden. Die '1' in der Formel steht für die Rangfolge, also ergibt hier eine '2' den zweitkleinsten Wert.

Soll es komplett in einer Zeile bleiben, so muss in Zelle 'A2' die Formel
=KKLEINSTE(B2:IV2;1)
die dann die kleinste Zahl aus dem Rest der Zeile 2 findet.

Soll das Ganze pro Spalte funktionieren, so lautet die Formel
=KKLEINSTE(A2:A65536;1)
die, wie o.a., aber für die Spalte 'A' funktioniert.

Freundliche Grüße von der Insel - Mario
Member: fitzin
fitzin Apr 17, 2012 at 14:32:16 (UTC)
Goto Top
Dass eine Zeile keine Spaltenüberschrift haben kann, ist mir klar. Aber der geringste Wert einer Zeile, der z.B. in Spalte F steht, schon...

Meine Matrix besteht aus über 12.000 Zeilen und ca. 50 Spalten. Den geringsten Wert pro Zeile kann ich einfach mit der Min-Funktion ermitteln. Aber ich bräuchte eine Funktion oder eben ein Makro, das mir angibt, in welcher Spalte dieser Zeilen-Minimalwert steht.
Member: fitzin
fitzin Apr 17, 2012 at 14:41:02 (UTC)
Goto Top
Danke für deine Antwort, allerdings liegt mein Hauptproblem darin, wie ich die Spalte ermitteln kann, in der dieser Minimalwert steht. Mit WVerweis komm ich nicht weiter, weil der gesuchte Wert nicht in der ersten Zeile liegt, sondern eben in der 2., 3., 4. etc.
Member: mak-xxl
mak-xxl Apr 17, 2012 at 17:45:52 (UTC)
Goto Top
Moin fitzin,

nachfolgenden Quellcode auf das Modulblatt des betreffenden Tabellenblattes kopieren.
Sub ZeileMinimumAdresse()                       ' Suche Minimum von links beginnend  

Dim strRange As String                          ' Bereich Zeile von B bis IV  
Dim i As Long
Dim intMinNr As Integer
Dim objWks As Object                            ' Tabellenblatt mit Werten  

With Application
    
    Set objWks = .ThisWorkbook.Worksheets(1)    ' erstes Tabellenblatt  
    
    intMinNr = 1                                ' das wievielte Minimum (Rang)  
    
    For i = 1 To objWks.Range("B:B").End(xlUp).Row  
        
        On Error Resume Next                    ' eventuelle Leerzeilen erzeugen Fehler  
        
        strRange = "B" & i & ":IV" & i          ' Spalte A: Adresse des Minimums  
        
        objWks.Cells(i, 1) = objWks.Range(strRange).Find(.WorksheetFunction.Small(objWks.Range(strRange), intMinNr), LookAt:=xlWhole, LookIn:=xlValues).Address
    
    Next i
    
End With

On Error GoTo 0                                  ' Fehlerbehandlung wieder Standard  

End Sub

Die Routine geht davon aus, das Spalte 'A' frei ist, hier wird je Zeile die Zelladresse des ersten von links gefundenen Minimums des in der Variable 'intMinNr' festgelegten Ranges dieser Zeile eingetragen.

[Edit]
Achtung: Bitte Zeile 14 ersetzen durch:
For i = 1 To objWks.Range("B" & Rows.Count).End(xlUp).Row
@76109:
Dank für den Hinweis!
[/Edit]

Freundliche Grüße von der Insel - Mario
Member: NetWolf
NetWolf Apr 17, 2012 at 18:12:15 (UTC)
Goto Top
Moin Moin,

mal so am Rande, wäre es nicht einfacher für dich, das Ganze mit der bedingten Formatierung zu erledigen?

Grüße aus Rostock
Wolfgang
(Netwolf)
Mitglied: 76109
76109 Apr 17, 2012 at 18:20:27 (UTC)
Goto Top
Hallo Mario!

Sorry, aber mit dieser Codezeile
For i = 1 To objWks.Range("B:B").End(xlUp).Row  
wirst Du wenig Erfolg haben, weil das To-Ergebnis immer 1 ist

Du musst die Zelle angeben, vonderaus nach oben auf die 1. belegte Zelle gezählt wird.
Wks.Cells(Wks.Rows.Count, "B").End(xlUp).Row  
Bedeutet: Von der letzten Zeile aus gesehen, die erste belegte Zelle (von unten nach oben) finden.


Gruß Dieter


PS.
Das .End bezieht sich nicht auf die Letzte Zeile eines Sheets, sondern nur auf eine letzte Zelle mit Inhalt (von oben nach unten oder von unten nach oben).

Beispiel: Zeile 1-5 ist belegt, Zeile 6 ist eine Leerzeile und die Zeilen 7-10 sind wieder belegt, dann:
Line = Cells(1,"B").End(xlDown).Row   'Ab Zeile 1:  Ergebnis = 5  

Line = Cells(10,"B").End(xlUp).Row   'Ab Zeile 10:  Ergebnis = 7  
Member: mak-xxl
mak-xxl Apr 17, 2012 at 19:09:49 (UTC)
Goto Top
Moin didi1954,

und da man vorab nicht weiß, welche Zeile die letztbelegte ist und welche Excel-Version der Anwender hat, macht man es eben so:

Range("B" & Rows.Count).End(xlUp).Row

oder so:

Cells(Rows.Count, "B").End(xlUp).Row

es sei, denn, man macht Fehler beim Kopieren, so wie ich oben ... face-smile

Freundliche Grüße von der Insel - Mario
Member: fitzin
fitzin Apr 17, 2012 at 19:46:14 (UTC)
Goto Top
Vielen Dank für eure Hilfe! Funktioniert perfekt - genau was ich gesucht habe face-smile