So ermitteln Sie die minimale und maximale Zeile und Spalte in einem Bereich, der als Parameter an eine Funktion übergeben wird

StackOverflow https://stackoverflow.com//questions/21028325

  •  21-12-2019
  •  | 
  •  

Frage

Ich versuche, eine spezielle VLookup-Funktion in VBA zu schreiben, bei der anstelle eines Werts, der in einem Spaltenbereich nachgeschlagen wird, mehrere Werte in mehreren Spaltenbereichen nachgeschlagen werden.Wenn alle „Nachschlage“-Werte mit den jeweiligen Werten in den Spalten übereinstimmen, wird ein Wert zurückgegeben, der nur wenige angegebene Spalten entfernt liegt.Etwas wie

splvlookup (RngArea als Bereich, OptionName als String, StrikePrice als Single, TrdDate als Datum, dcr als Ganzzahl, Columnref als Ganzzahl)

Wo

RngArea ist der Bereich der gesamten Tabelle

Name, Preis, Dt sind Werte, die in ihren jeweiligen Spalten in RngArea nachgeschlagen werden (Spaltennummern werden nicht als Parameter an die Funktion übergeben, da dies nicht notwendig ist, die Spaltenüberschriften sich nicht ändern und alle Spalten in der gleichen Reihenfolge angeordnet sind stets)

dcr ist ein Dekrementzähler, der das Datum um einige Tage dekrementiert.Daher ist das nachgeschlagene Datum Dt -dcr

Columnref ist eine Referenznummer, die die Anzahl der Spalten ab der ersten Spalte in RngArea angibt

In meiner Tabelle RngArea gibt es mehrere Werte für jede der Variablen Dt, Price, Name.Allerdings gibt es nur eine einzigartige Kombination aller drei zusammen.Die Aufgabe besteht darin, diese eindeutige Zeile und den entsprechenden Wert in der durch Columnref identifizierten Spalte zu finden.

Meine Frage

So ermitteln Sie die minimalen und maximalen Zeilen- und Spaltenbereiche.Sobald ich das gefunden habe, kann ich Schleifen innerhalb dieser Min- und Max-Bereiche verwenden und nach den Suchwerten suchen.Ich bin mir sicher, dass dies ein sehr einfacher Trick für einen Profi ist, aber er scheint mir ein Rätsel zu sein.Jede Hilfe wird geschätzt.Dank im Voraus.

Hier ist der Code, den ich basierend auf dem Rat von PA verwendet habe. Der Code ist behoben.

Function splVlookup(RngArea As Range, OptionName As String, StrikePrice As Single, TrdDate As Date, Datedecrement As Integer, Columnref As Integer) As Variant
Dim i As Long

i = 1

Do While i < RngArea.Rows.Count + 1

If (RngArea.Cells(i, 9) = StrikePrice) And (RngArea.Cells(i, 3) = OptionName) And (RngArea.Cells(i, 1) = (TrdDate - Datedecrement)) Then

splVlookup = RngArea.Cells(i, Columnref)
Exit Function
End If

i = i+1

Loop

If i = RngArea.Rows.Count + 1 Then
splVlookup = CVErr(xlErrNA)
End If

End Function

Die Tabellenstruktur sieht folgendermaßen aus (getrennt durch „|“)

Trddate | Option | OptionName | Volumen aufrufen | Rufen Sie öffnen.

War es hilfreich?

Lösung

Angenommen Range, können Sie darauf zugreifen .Rows.Count Und .Columns.Count und einfach verwenden For Schleifen, um darüber zu iterieren .Cells Eigentum.

For i = 1 To rng.Rows.Count
  For j = 1 To rng.Columns.Count
    set Val = rng.Cells(i, j).Value
  Next j
Next i

Probieren Sie diesen Code mit verschiedenen Bereichen aus.

Das werden Sie merken .Cells bezieht sich auf die im Bereich relativ zu seinem Ursprung enthaltenen Zellen.So für Range("B2:C4"), es ist .Cells(1,2) wird sich beziehen "C2".

Es kommt auch mit Bereichen zurecht, die nicht zusammenhängende Zellen enthalten.Für Range("B2:C4","D2:E4"), es ist .Cells(1,3) wird sich beziehen "D2".

Andere Tipps

Wenn Sie nur nach den ersten und letzten Zellen in einem Bereich suchen, können Sie etwas wie folgt ausprobieren:

generasacodicetagpre.

Wenn Sie versuchen, nach einem Wert in einem Bereich zu suchen, werfen Sie einen Blick auf die untenstehende Routine an und sehen Sie, ob Sie Ihren Code ändern können ...

generasacodicetagpre.

Verwenden Sie Kreuzung und mache eine binäre Suche:

generasacodicetagpre.

Das oben genannte sollte für einen beliebigen Reichweite arbeiten, und es ist nicht durch den gesamten Bereich, weder Zellen verwendend.Dies sollte ziemlich einfach sein, sich für RNGMAXROW, RNGMincolumn und RNGMaxColumn anzupassen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top