VBA (Excel) Function,Min - Zwei Werte? Laufzeitfehler 1004
Hallo!
Ich hab ein Problem: Schulisch bin ich dazu gezwungen, mit VBA ein Programm zu programmieren, welches mir in einem bestimmten Datenfeld den Minimal-Wert mit Position ausgibt. Funktioniert an sich ganz gut, außer wenn ein Wert Doppelt vorkommt. Dann soll es zwar einen Wert finden, aber nur mit diesem einen weiterarbeiten. Kann mir da jemand helfen? Vielen Dank!
-
1 Mitglied fand diese Antwort hilfreich
Hm wäre interessant wie du angefangen hast das zu lesen, wenn du schon einen Ansatz hast. Ich persönlich würde es in etwa so machen (angenommen die Werte stehen in der ersten Spalte, ab Zeile 2:
Sub kleinsteZahl() With Tabelle1 'Ersten Wert von Hand setzen Dim min As Integer min = CInt(.Cells(2, 1).Value) 'Letzte Zeile Dim zeileMax As Integer zeileMax = .UsedRange.Rows.Count Dim zeile As Integer Dim position As Integer position = 2 'Durchläuft die erste Spalte For zeile = 3 To zeileMax 'Ist die Zahl kleiner wird Position und Zahl gespeichert If CInt(.Cells(zeile, 1).Value) < min Then position = zeile min = CInt(.Cells(zeile, 1).Value) End If Next zeile 'Ausgabe in einer MsgBox MsgBox "Die kleinste Zahl ist " + CStr(min) + " in Zeile " + CStr(position) End With End SubGibt sicher auch elegantere Lösungen, hab mit VBA auch nur ein Wochenende gearbeitet, an sich hat Excel ja von Haus aus schon eine MIN-Option, so würde entsprechend nur der erste gefundene Minimalwert verwendet.
-
suche mal den englischen Formelnamen für KKleinste(),
frage Worksheetfunction.KKleinste(1) und (2) ab und vergleiche die beiden. dann kannst du mit dem Ergebnis dieses Vergleichs die Adresse raussuchen oder verwerfen.
Die Syntaxen (Syntaxis? wohl nicht! Syntaces?) musst du selber finden, einen Link in alle Sprachen findest du unter
http://wwwhome.ewi.utwente.nl/~trieschn/excel/excel.html -
jetzt hats mich in den Fingern gejuckt und ich hab doch selber ein µ geschrieben, denn ich konnte nicht entscheiden, ob KKleinste(Bereich;1) und KKleinste(Bereich;2) nicht -genauso wie Max- immer auf dieselbe Zelle zugreift.
Du wirst virelleicht etwas Probleme haben, Dich da drin zurechtzufinden, denn es sind mehrfach verschachtelte Funktionen drin, aber versuchs.
Zum Verständnis: alles basiert auf SELECTION.
Du kannst das aber jederzeit durch Range(von, bis) ersetzen.
Die Letzte Zelle ist LZ = Selection.cells(Selection.cells.count), mit SET als OBJEKT gesetzt!
Ich definiere erst MinW als den kleinsten Wert der Selection.
Dann suche ich mittels VERGLEICH = Match(was, wo, Typ0) nach MinW, finde das in der n-ten Zelle der Selection und setze diese als Objekt mit
SET FiZ = ...
Jetzt frage ich, ob KKleinste= Small(Sel, 1)=Small(Sel, 2).
Wenn JA, dann definiere ich einen neuen Bereich mit FiZ.offset(1, 0) bis LZ
in diesem suche ich erneut den Wert MinW und finde ihn in in F2Z, die ich erneut mit SET als OBJEKT setze
Somit bleiben mir FiZ und F2Z als Objekt erhalten, ich könnte danach Adressen oder Inhalte oder Offset(x, y) etc abfragen.
Die Debug.print-Befehle dienen zur Entwickler-Kontrolle.
Und hier die Sub:
Sub FindenZweitKleinste()
Dim FiZ, F2Z, LZ, MinW
Debug.Print "1: " & Application.Worksheetfunction.Small(Selection, 1) & " 2: " & Application.Worksheetfunction.Small(Selection, 2)
MinW = Application.Worksheetfunction.Min(Selection)
Set LZ = Selection.Cells(Selection.Cells.Count)
Set FiZ = Selection.Cells(Application.Worksheetfunction.Match(MinW, Selection, 0))
Debug.Print Selection.Address & " MinWert:" & MinW & " LetzteZelle:" & LZ.Address & " FindeZelle:" & FiZ.Address
If Application.Worksheetfunction.Small(Selection, 1) = Application.Worksheetfunction.Small(Selection, 2) Then
Set F2Z = Range(FiZ.Offset(1, 0), LZ).Cells(Application.Worksheetfunction.Match(MinW, Range(FiZ.Offset(1, 0), LZ), 0))
Debug.Print "2 x " & MinW & " =>2.MinW:" & F2Z.Address
End If 'LZ = Selection.cells.SpecialCells(xlLastCell).Address liefert letzte Zelle des GESAMTEN AKTIVEN ARBEITSBLATT-Bereichs!
End Sub ' obwohl nur Selection.Cells... abgefragt: ??? Bug ??? deshalb Selection.Cells(Selection.Cells.Count)
Kopiere das so in Deinen Editor, es sollte laufen! Werte im Direkt-Fenster.