Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1640to1644
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Zwei Probleme: On Error und Spalten durchsuchen

Zwei Probleme: On Error und Spalten durchsuchen
30.08.2018 11:07:15
lukas
Hallo liebes Forum!
ich stehe gerade vor folgendem Problem: ich möchte eine Korrelationsmatrix mit einer Vielzahl von Parametern erstellen. Die Berechnung habe ich mittels zwei For Schleifen realisiert. Mit meinem ersten Datensatz ging dies problemlos.
Der neue Datensatz hat allerdings einige Unstimmigkeiten und kann einige Korrelationskoeffizienten (nicht Pearson, sondern Point Biserial CorrCoeff) nicht berechnen, weswegen ich den Plan hatte mithilfe der On Error Funktion, immer wenn es einen Fehler gibt, die Sub nicht zu unterbrechen, sondern "Fehler" in die Zelle zu schreiben und in die nächste Iteration der For Schleife zu springen. Dazu hatte ich http://excelmatters.com/2015/03/17/on-error-wtf/
mir durchgelesen aber sah dort keine Lösung für mein Problem.
Wenn es mit der On Error Funktion nicht klappen sollte, hatte ich mir eine weitere Methode überlegt; weiss allerdings nicht, ob es mit VBA umsetzbar ist.
Die Korrelationsberechnung scheitert oft aus folgendem Grund:
Spalte A enthält keine Werte, wenn Spalte B den Wert 1 annimmt. In Spalte B gibt es nur 1 oder 0 und die Messwerte in Spalte A fehlen für die Einsen in Spalte B.
Gibt es einen Befehl nach dem Motto: "Finde die Werte in Spalte A, für jede 1 in Spalte B" Danach würde ich mit der Bedingung "Wenn A = Nothing (enthält keine Werte für 1 in Spalte B) dann führe die Berechnung nicht durch" versuchen, mein Programm zum Laufen zu kriegen.
Beste Grüsse,
Lukas

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Teil 1: On Error
30.08.2018 11:28:03
ChrisL
Hi Lukas
Hier mal ein Beispiel für On-Error. Zur Demo werden Text und Zahlen multipliziert, womit bewusst Fehler provoziert werden...
Sub t()
Dim ar As Variant
Dim i As Integer
ar = Array(1, "B", 2, "D", 3)
For i = 0 To UBound(ar)
On Error Resume Next
Cells(i, 1) = ar(i) * 2
If Err.Number  0 Then Cells(i, 2) = Err.Description
Err.Clear
Next i
End Sub
cu
Chris
AW: Teil 1: On Error
30.08.2018 12:34:15
Hans
Hallo
mir fallen spontan mehrere Lösungen aus, je nachdem ob man Spalte A oder B auswertet
Das Makro startet dann nur noch wenn die korrekte Bedingung erfüllt ist. Probier es bitte aus.
Welche Version du nimmst ist völlig wurscht, Hauptsache sie laeuft mit allen Daten fehlerfrei!
mfg Hans
Sub Beispiele()
If Cells(i, 2) = 0 Then
Cells(i, 1) = ar(i) * 2
End If
If Cells(i, 1).Value  "" Then
Cells(i, 1) = ar(i) * 2
End If
If Trim(Cells(i, 1))  "" Then
Cells(i, 1) = ar(i) * 2
End If
End Sub

Anzeige
AW: Teil 1: On Error
30.08.2018 15:27:48
lukas
Danke für die schnellen Antworten! Die On Error If-Abfrage hat für den ersten Fehler richtig funktioniert, jedoch weitere Berechnung wurden fälschlicherweise auch als Fehler erkannt. Ich poste mal meinen Code, vielleicht hilft das mein Problem zu verdeutlichen.
Sub PBiCorrel()
Dim i As Byte
Dim j As Byte
Dim k As Byte
Dim length As Integer
Dim DP As Long
Dim r_pb As Double, r As Double
Dim avg_1 As Double, avg_0 As Double, stdev_class As Double, stdev_num As Double
Dim n_total As Long, n1 As Long
Dim n0 As Integer
Dim Spalte_i As Range, Spalte_j As Range
DP = 83151
n0 = 867
n_total = 83150
n1 = n_total - n0
Worksheets("Parameter_Numerisch_Klassen").Activate
For j = 24 To 106
stdev_class = Application.WorksheetFunction.StDev_P(Range(Cells(2, j), Cells(DP, j)))
If Not stdev_class = 0 Then
For k = 1 To 23
stdev_num = Application.WorksheetFunction.StDev_P(Range(Cells(2, k), Cells(DP,  _
k)))
On Error Resume Next
avg_0 = Application.WorksheetFunction.AverageIfs(Range(Cells(2, k), Cells(83151, _
k)), _
Range(Cells(2, j), Cells(83151, j)), "=0")
avg_1 = Application.WorksheetFunction.AverageIfs(Range(Cells(2, k), Cells(83151, _
k)), _
Range(Cells(2, j), Cells(83151, j)), "=1")
If Err.Number = 0 Then
r_pb = ((avg_1 - avg_0) / stdev_num) * Sqr(n1 * n0 / (n_total) ^ 2)
Worksheets("KorrelMatrix").Cells(j + 1, k + 1) = r_pb
Else
Worksheets("KorrelMatrix").Cells(j + 1, k + 1) = Err.Description
Err.Clear
End If
Next k
End If
Next j
Ein bisschen was zu Erklärung: meine Daten bestehen aus numerischen Messwerten und Klassifikatoren, die ich per one hot encoding in Einsen und Nullen umcodiert habe. Hierfür gibt es einen speziellen Korrelationskoeffizienten r_pb, den ich nun berechnen möchte. Häufiger Fehler ist, wenn die Standardabweichung des numerischen Parameters 0 ist (Division durch 0) oder aber, wenn avg_0 oder avg_1 nicht berechnet werden kann: avg_1 gibt den Mittelwert des numerischen Parameters an, für alle Einsen im Klassifikator: Bsp:
Num - Klasse
5 - 1
4 - 1
3 - 0
5 - 1
2 - 0
=> avg_1 = (5+4+5)/3=4,6666...
Da mein Datensatz unvollständig ist, kann es passieren, dass avg_0 oder avg_1 nicht berechnet werden kann, da es keine Werte für Einsen oder Nullen in der Klasse gibt. Da ein Parameter bis zu 83000 Werte besitzen kann, würde ich gerne die komplette Range vergleichen.
Gibt es eine Art "FindIF" Funktion? Set Num_Param_1 = FindIF(Class_Param, "=1") Wenn er keine findet ist Set Num_Param_1 = Nothing und so könnte ich dann weiter machen.
Die ganzen Ifs könnte ich mir allerdings sparen, wenn das mit der On Error Funktion richtig funktionieren würde... immer wenn Fehler entsteht, ab in die nächste For-Schleifen Iteration.
Anzeige
AW: Teil 1: On Error
30.08.2018 16:00:22
ChrisL
Hi
Die mathematische Grundlage fehlt mir und ohne Beispieldatei kann ich nicht Debuggen.
Probiere mal ob du eine Fehlermeldung erhältst...
If Err.Number = 0 Then
On Error GoTo 0
r_pb = ((avg_1 - avg_0) / stdev_num) * Sqr(n1 * n0 / (n_total) ^ 2)
Worksheets("KorrelMatrix").Cells(j + 1, k + 1) = r_pb
Else
Worksheets("KorrelMatrix").Cells(j + 1, k + 1) = Err.Description
Err.Clear
End If
cu
Chris
AW: Teil 1: On Error
30.08.2018 16:20:44
Daniel
"Gibt es eine Art "FindIF" Funktion? Set Num_Param_1 = FindIF(Class_Param, "=1") Wenn er keine findet ist Set Num_Param_1 = Nothing und so könnte ich dann weiter machen."
ja, gibt es, falls Class_Param ein eindimensionales Array oder ein zweidimensionales Array oder Zellbereich mit einer Spalte oder einer Zeile ist:
so kannst du prüfen, ob die 0 in ClassParam vorkommt (der gesuchte Wert ist der erste Parameter im Match)
dim Check as Variant
check = Application.Match(0, ClassParam, 0)
if Vartype(check) = vbdouble
'--- Suchwert in Array vorhaneen
else
'--- Suchwert nicht in Array vorhanden
end if
die suche ist relativ schnell, da die Suche beim ersten fund abgebrochen wird.
Gruß Daniel
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige