Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Position in einer Range wiedergeben VBA

Position in einer Range wiedergeben VBA
02.07.2016 20:23:20
Max
Hallo, ich schreibe gerade an einer Funktion, die alle Werte einer interpolierten Zinsstrukturkurve speichern soll. Interpolation zwischen erstem und letztem vorgegebenem Zeitpunkt funktioniert bereits, nun möchte ich allerdings noch zu allen Zeitpunkten vor dem ersten bzw. nach dem letzten gegebenen Zeitpunkt konstant interpolieren. Ich hab dafür zwei Spalten, in einer stehen die Zeitpunkte (TimeRg) und in der anderen die Zinssätze (RateRg).
Nun würde ich so vorgehen:
If Time(i) Rate(i) = ?
ElseIf Time(i) >= Application.WorksheetFunction.Max(TimeRg) Then
Rate(i) = ?
Else:
[bereits fertiger Teil mit linearer Interpolation]
Nun weiß ich allerdings nicht wie ich den Zinssatz zu dem kleinsten bzw. größten Wert von TimeRg ermittele. Nur bei einer normalen Zinsstrukturkurve könnte ich einfach mit max/min arbeiten, um die Zinssätze zu ermitteln. Es soll allerdings auch für inverse Zinsstrukturkurven und nicht zeitlich sortierte Zeitabfolgen funktionieren. Als 2D-Matrix könnte ich es (vermutlich) auch, aber da ich den Großteil schon als zwei Ranges geschrieben habe, würde ich gern bei diesem Ansatz bleiben. :)
Ich schätze was ich dafür bräuchte ist eine Funktion, die mir die Position des Wertes von Application.WorksheetFunction.Min(TimeRg) in der Range gibt. Hätte ich diesen Wert könnte ich einfach RateRg.Cells(xx) benutzen. Könnt ihr mir eine solche Funktion nennen?
Danke

Anzeige

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Position in einer Range wiedergeben VBA
03.07.2016 00:22:13
Max
habe es bereits gelöst

AW: Position in einer Range wiedergeben VBA
03.07.2016 00:49:52
fcs
Hallo Max,
die entsprechende Funktion für die Suche nach der Position eines Wertes in einer Matrix ist Match (Tabellenfunktion VERGLEICH).
Du solltest nicht Time als Variablenname verwenden, dies eine VBA-Funktion ist.
Gruß
Franz
Sub aaTest()
Dim i As Long, xxxx As Long
Dim TimeRg As Range, RateRg As Range
Dim TimeMin, RateMin, TimeMax, RateMax, lngMin As Long, lngMax As Long
Dim wks As Worksheet
Dim varTime() As Date, varRate() As Double
'Start Anweisungen für Testwerte
Set wks = ActiveSheet
With wks
lngMax = .Cells(.Rows.Count, 1).End(xlUp).Row
Set TimeRg = .Range(.Cells(2, 1), .Cells(lngMax, 1))
Set RateRg = .Range(.Cells(2, 2), .Cells(lngMax, 2))
End With
xxxx = 100
ReDim varTime(1 To xxxx)
ReDim varRate(1 To xxxx)
'Ende Anweisungen für Testwerte
'Rate bei Min-Zeit
TimeMin = Application.WorksheetFunction.Min(TimeRg)
lngMin = Application.WorksheetFunction.Match(TimeMin, TimeRg, 0)
RateMin = RateRg.Cells(lngMin, 1)
'Rate bei Max-Zeit
TimeMax = Application.WorksheetFunction.Max(TimeRg)
lngMax = Application.WorksheetFunction.Match(TimeMax, TimeRg, 0)
RateMax = RateRg.Cells(lngMax, 1)
'Interpolationen - Test
For i = 1 To xxxx
varTime(i) = VBA.Rnd()
Select Case varTime(i)
Case Is = TimeMax
varRate(i) = 321 'hier Formel eintragen
Case Else:
'[bereits fertiger Teil mit linearer Interpolation]
varRate(i) = 333 'hier Formel eintragen
End Select
Next
End Sub

Anzeige
AW: Position in einer Range wiedergeben VBA
03.07.2016 03:40:31
Michael
Hi zusammen,
falls Match Treffer nicht wie erwartet findet, ist Runden hilfreich: nur mal im Hinterkopf behalten.
@Franz: gibt es einen besonderen Grund, weshalb Du rnd mit "VBA." schreibst?
Schöne Grüße,
Michael
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Position in einer Range wiedergeben mit VBA


Schritt-für-Schritt-Anleitung

Um die Position eines Wertes in einer Range mit VBA zu ermitteln, kannst du die Match-Funktion verwenden. Hier ist eine einfache Schritt-für-Schritt-Anleitung:

  1. Öffne den VBA-Editor:

    • Drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Füge ein Modul hinzu:

    • Klicke im Menü auf Einfügen und wähle Modul.
  3. Schreibe den VBA-Code:

    • Füge den folgenden Code in das Modul ein:
    Sub FindPositionInRange()
       Dim TimeRg As Range
       Dim RateRg As Range
       Dim TimeMin As Variant
       Dim lngMin As Long
       Dim RateMin As Variant
       Dim wks As Worksheet
    
       Set wks = ActiveSheet
       Set TimeRg = wks.Range("A2:A10") ' Beispielrange
       Set RateRg = wks.Range("B2:B10")
    
       TimeMin = Application.WorksheetFunction.Min(TimeRg)
       lngMin = Application.WorksheetFunction.Match(TimeMin, TimeRg, 0)
       RateMin = RateRg.Cells(lngMin, 1)
    
       MsgBox "Die Rate für den minimalen Zeitpunkt ist: " & RateMin
    End Sub
  4. Führe das Makro aus:

    • Drücke F5, um das Makro auszuführen und die Rate für den minimalen Zeitpunkt anzuzeigen.

Häufige Fehler und Lösungen

  • Fehler: "Wert nicht gefunden"
    Lösung: Stelle sicher, dass der Wert, den du suchst, tatsächlich in der Range vorhanden ist. Verwende die Funktion Runden, um sicherzustellen, dass die Werte genau übereinstimmen.

  • Fehler: Falsche Range
    Lösung: Überprüfe die Ranges TimeRg und RateRg. Achte darauf, dass sie korrekt definiert sind und die entsprechenden Werte enthalten.


Alternative Methoden

Falls du eine andere Methode zur Ermittlung der Position in einer Range bevorzugst, kannst du auch die For Each-Schleife verwenden. Hier ein Beispiel:

Dim cell As Range
For Each cell In TimeRg
    If cell.Value = TimeMin Then
        MsgBox "Position: " & cell.Row
    End If
Next cell

Diese Methode bietet mehr Flexibilität, kann jedoch langsamer sein, wenn du mit großen Datenmengen arbeitest.


Praktische Beispiele

Hier ist ein praktisches Beispiel, wie du die Match-Funktion in einem realen Szenario nutzen kannst:

Sub InterpolationExample()
    Dim TimeRg As Range
    Dim RateRg As Range
    Dim TimeMax As Variant
    Dim lngMax As Long
    Dim RateMax As Variant
    Dim wks As Worksheet

    Set wks = ActiveSheet
    Set TimeRg = wks.Range("A2:A10")
    Set RateRg = wks.Range("B2:B10")

    TimeMax = Application.WorksheetFunction.Max(TimeRg)
    lngMax = Application.WorksheetFunction.Match(TimeMax, TimeRg, 0)
    RateMax = RateRg.Cells(lngMax, 1)

    MsgBox "Die Rate für den maximalen Zeitpunkt ist: " & RateMax
End Sub

In diesem Beispiel wird die Rate für den maximalen Zeitpunkt ermittelt und angezeigt.


Tipps für Profis

  • Vermeide die Verwendung von reservierten Wörtern: Nutze alternative Variablennamen anstelle von Time oder Date, um Konflikte zu vermeiden.

  • Nutze Option Explicit: Setze Option Explicit am Anfang deines Moduls, um sicherzustellen, dass alle Variablen deklariert sind. Dies hilft, Fehler frühzeitig zu erkennen.

  • Optimierung der Performance: Wenn du viele Werte abgleichen musst, erwäge die Verwendung von Arrays, um die Geschwindigkeit zu erhöhen.


FAQ: Häufige Fragen

1. Wie kann ich die Position eines Wertes in einer nicht sortierten Range finden?
Du kannst die Match-Funktion verwenden, jedoch musst du sicherstellen, dass die Werte nicht sortiert sein müssen. Eine Schleife kann ebenfalls helfen.

2. Was sind die Unterschiede zwischen Match und einer Schleife?
Match ist in der Regel schneller und effizienter für große Datenmengen, während eine Schleife mehr Flexibilität bietet, aber langsamer sein kann.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige