Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1632to1636
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

Schleifen und If Abfragen

Schleifen und If Abfragen
05.07.2018 15:12:33
Christian
Guten Tag,
ich habe eine Exceltabelle, mit der mittels vier Kriterien eine Bewertung (Werte zwischen "" und 100) durchgeführt werden soll und diese Kriterein sollen jeweils unterschiedliche gewichtet werden können.
Nun habe ich das sehr einfach mittels VBA schon einmal geschrieben und es funktioniert auch. Aber ich denke, es gibt eine bessere Möglichkeit über Schleifen, wie man diese Aufgabe "eleganter" oder einfacher und mit weniger Aufwand lösen kann.
Ich möchte also besseres Programmieren lernen und bitte daher um Hilfe.
Sub Gewichtungsanpassung_Entwicklung()
Rem read values of weighting
Dim P(9 To 12)  As Variant
Dim Q(9 To 12) As Variant
For i = 9 To 12
P(i) = ActiveSheet.Cells(i, 16).Value
Q(i) = ActiveSheet.Cells(i, 17).Value
Next i
Rem Fallunterscheidungen
Rem Fall 3
If (P(9) = "") And (P(10) = "") And (P(11) = "") Then
Q(9) = ""
Q(10) = ""
Q(11) = ""
Q(12) = 100
Rem Werte ausgeben
GoTo ausgabe
End If
If (P(9) = "") And (P(10) = "") And (P(12) = "") Then
Q(9) = ""
Q(10) = ""
Q(11) = 100
Q(12) = ""
Rem Werte ausgeben
GoTo ausgabe
End If
If (P(9) = "") And (P(11) = "") And (P(12) = "") Then
Q(9) = ""
Q(10) = 100
Q(11) = ""
Q(12) = ""
Rem Werte ausgeben
GoTo ausgabe
End If
If (P(10) = "") And (P(11) = "") And (P(12) = "") Then
Q(9) = 100
Q(10) = ""
Q(11) = ""
Q(12) = ""
Rem Werte ausgeben
GoTo ausgabe
End If
Rem Fall 2
If (P(9) = "") And (P(10) = "") Then
a = (Q(9) + Q(10)) / (Q(11) + Q(12))
Q(9) = ""
Q(10) = ""
Q(11) = Q(11) + (a * Q(11))
Q(12) = Q(12) + (a * Q(12))
Rem Werte ausgeben
GoTo ausgabe
End If
If (P(9) = "") And (P(11) = "") Then
a = (Q(9) + Q(11)) / (Q(10) + Q(12))
Q(9) = ""
Q(11) = ""
Q(10) = Q(10) + (a * Q(10))
Q12 = Q(12) + (a * Q(12))
Rem Werte ausgeben
GoTo ausgabe
End If
If (P(9) = "") And (P(12) = "") Then
a = (Q(9) + Q(12)) / (Q(10) + Q(11))
Q(9) = ""
Q(10) = Q(10) + (a * Q(10))
Q(11) = Q(11) + (a * Q(11))
Q(12) = ""
Rem Werte ausgeben
GoTo ausgabe
End If
If (P(10) = "") And (P(11) = "") Then
a = (Q(10) + Q(11)) / (Q(9) + Q(12))
Q(9) = Q(9) + (a * Q(9))
Q(10) = ""
Q(11) = ""
Q(12) = Q(12) + (a * Q(12))
Rem Werte ausgeben
GoTo ausgabe
End If
If (P(10) = "") And (P(12) = "") Then
a = (Q(10) + Q(12)) / (Q(9) + Q(11))
Q(9) = Q(9) + (a * Q(9))
Q(10) = ""
Q(11) = Q(11) + (a * Q(11))
Q(12) = ""
Rem Werte ausgeben
GoTo ausgabe
End If
If (P(11) = "") And (P(12) = "") Then
a = (Q(11) + Q(12)) / (Q(9) + Q(10))
Q(9) = Q(9) + (a * Q(9))
Q(10) = Q(10) + (a * Q(10))
Q(11) = ""
Q(12) = ""
Rem Werte ausgeben
GoTo ausgabe
End If
Rem Fall 1
If (P(9) = "") Then
a = Q(9) / (Q(10) + Q(11) + Q(12))
Q(9) = ""
Q(10) = Q(10) + (a * Q(10))
Q(11) = Q(11) + (a * Q(11))
Q(12) = Q(12) + (a * Q(12))
Rem Werte ausgeben
GoTo ausgabe
End If
If (P(10) = "") Then
a = Q(10) / (Q(9) + Q(11) + Q(12))
Q(9) = Q(9) + (a * Q(9))
Q(10) = ""
Q(11) = Q(11) + (a * Q(11))
Q(12) = Q(12) + (a * Q(12))
Rem Werte ausgeben
GoTo ausgabe
End If
If (P(11) = "") Then
a = Q(11) / (Q(9) + Q(10) + Q(12))
Q(9) = Q(9) + (a * Q(9))
Q(10) = Q(10) + (a * Q(10))
Q(11) = ""
Q(12) = Q(12) + (a * Q(12))
Rem Werte ausgeben
GoTo ausgabe
End If
If (P(12) = "") Then
a = Q(12) / (Q(9) + Q(10) + Q(11))
Q(9) = Q(9) + (a * Q(9))
Q(10) = Q(10) + (a * Q(10))
Q(11) = Q(11) + (a * Q(11))
Q(12) = ""
Rem werte ausgeben
GoTo ausgabe
End If
ausgabe:
For k = 1 To 12
ActiveSheet.Cells(k, 16).Value = P(k)
ActiveSheet.Cells(k, 17).Value = Q(k)
Next k
End Sub
vielen Dank im Voraus
MFG
Christian

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Schleifen und If Abfragen
05.07.2018 18:20:59
ChrisL
Hi Christian
Kombinationen...
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
Eine gewisse Regelmässigkeit für Schleifen ist zwar erkennbar, aber für eine "gute" Lösung sollte man den Schleifen-Salat wenn möglich vermeiden. Nur dazu müsste man deine Berechnung genau verstehen.
Ich würde in einer Tabelle mit Formeln beginnen und ganz zum Schluss kann man die Lösung spasseshalber immer noch in VBA umwandeln.
For i = 9 To 12
P(i) = ActiveSheet.Cells(i, 16).Value
Q(i) = ActiveSheet.Cells(i, 17).Value
Next i
einfacher
P = Range("P9:P12")
Q = Range("Q9:Q12")
cu
Chris
Anzeige
AW: Schleifen und If Abfragen
06.07.2018 15:01:20
mmat
Ungetestet. Sach ma ob das funktioniert.
Sub Fall2(a, b, c, d, p(), q())
Dim x
x = q(a) + q(b) / q(c) + q(d)
q(a) = ""
q(b) = ""
q(c) = q(c) + (x * q(c))
q(d) = q(d) + (x * q(d))
End Sub
Sub Fall1(a, b, c, d, p(), q())
Dim x
x = q(a) / q(b) + q(c) + q(d)
q(a) = ""
q(b) = q(b) + x * q(b)
q(c) = q(c) + x * q(c)
q(d) = q(d) + x * q(d)
End Sub
Sub mach_hin()
Dim i, cnt, p(9 To 12), q(9 To 12)
For i = 9 To 12
p(i) = ActiveSheet.Cells(i, 16).Value
q(i) = ActiveSheet.Cells(i, 17).Value
Next i
cnt = 0
For i = 9 To 12
If p(i) = "" Then cnt = cnt + 1
Next
If cnt = 4 Then MsgBox "Den Fall gibts doch garnicht": End
If cnt = 3 Then
For i = 9 To 12
If p(i) = "" Then q(i) = "" Else q(i) = 100
Next
End If
If cnt = 2 Then
If (p(9) = "") And (p(10) = "") Then Fall2 9, 10, 11, 12, p(), q()
If (p(9) = "") And (p(11) = "") Then Fall2 9, 11, 10, 12, p(), q()
If (p(9) = "") And (p(12) = "") Then Fall2 9, 12, 10, 11, p(), q()
If (p(10) = "") And (p(11) = "") Then Fall2 10, 11, 9, 12, p(), q()
If (p(10) = "") And (p(12) = "") Then Fall2 10, 12, 9, 11, p(), q()
If (p(11) = "") And (p(12) = "") Then Fall2 11, 12, 9, 10, p(), q()
End If
If cnt = 1 Then
If (p(9) = "") Then Fall1 9, 10, 11, 12, p(), q()
If (p(10) = "") Then Fall1 10, 9, 11, 12, p(), q()
If (p(11) = "") Then Fall1 11, 9, 10, 12, p(), q()
If (p(12) = "") Then Fall1 12, 9, 10, 11, p(), q()
End If
For i = 9 To 12
ActiveSheet.Cells(i, 16).Value = p(i)
ActiveSheet.Cells(i, 17).Value = q(i)
Next i
End Sub

Anzeige
AW: Schleifen und If Abfragen
06.07.2018 19:39:58
Behncke
Hallo,
leier nein, die Werte für q= 9 to 12 dürfen zusammen nie größer als 100 sein.
Es geht um eine proportionale Umverteilung.
Wenn
q9=50
q10=5
Q11=20
Q12=25
sind , dann muss wenn p10 ="" der Wert für q10 auf die Werte von q9, q11, q12 umverteilt werden.
Aber die Idee gefällt mir, Was ich nicht versanden habe, ist der folgende Abschnitt:
If (p(9) = "") And (p(10) = "") Then Fall2 9, 10, 11, 12, p(), q()
Ist das eine Matrix? Wo kann ich Infos dazu finden? Bitte gib mir ein Stichwort für die Suche im www.
Mfg
Christian
AW: Schleifen und If Abfragen
09.07.2018 09:42:27
mmat
Hallo Christian,
naja, schade, um das zu testen brauchts hat mehr Nähe zum Projekt. Aber dir gings ja darum, den Code übersichtlicher zu gestalten.
>> Aber die Idee gefällt mir.
Das hoff ich doch ;-)
>> Was ich nicht versanden habe, ist der folgende Abschnitt:
>> If (p(9) = "") And (p(10) = "") Then Fall2 9, 10, 11, 12, p(), q()
Das ist ein Funktionsaufruf. Die Funktion entspricht einer derartigen Passage (die es insgesamt 6 Mal gibt)
If (P(9) = "") And (P(11) = "") Then
a = (Q(9) + Q(11)) / (Q(10) + Q(12))
Q(9) = ""
Q(11) = ""
Q(10) = Q(10) + (a * Q(10))
Q12 = Q(12) + (a * Q(12))
Mit a, b, c, d werden die Indexe auf Q in unterschiedlicher Reihenfolge übergeben und damit alle 6 Kombinationen abgearbeitet
Anzeige
Den Fall gibts nicht
09.07.2018 09:59:31
mmat
q9=50
q10=5
Q11=20
Q12=25
Es werden p's eingelesen. Von den vier Werten ist mindestens einer, höchstens 3 gefüllt. Für die p's die nicht gefüllt sind, wird auch kein q ausgegeben. Also kanns den Fall im Ergebnis nicht geben.
Gib mal ein Beispiel mit allen p's und q's
AW: Schleifen und If Abfragen
09.07.2018 10:57:43
Daniel
Hi
ich hab mal versucht, deine Lösung nachzubilden:
Sub test()
Dim Q(9 To 12)
Dim P(9 To 12)
Dim i As Long
Dim a As Double, a1 As Double, a2 As Double
Dim zähler As Long
For i = 9 To 12
P(i) = ActiveSheet.Cells(i, 16).Value
Q(i) = ActiveSheet.Cells(i, 17).Value
Next i
a1 = 0
a2 = 0
zähler = 0
For i = 9 To 12
If P(i) = "" Then
a1 = a1 + Q(i)
Else
a2 = a2 + Q(i)
zähler = zähler + 1
End If
Next
a = 1 + a1 / a2
For i = 9 To 12
If P(i) = "" Then
Q(i) = ""
Else
Select Case zähler
Case 1: Q(i) = 100
Case Else: Q(i) = Q(i) * a
End Select
End If
Next
For i = 9 To 12
ActiveSheet.Cells(i, 16).Value = P(i)
ActiveSheet.Cells(i, 17).Value = Q(i)
Next i
End Sub
Gruß Daniel
Anzeige
Formel-Lösung
09.07.2018 11:30:52
Daniel
Hi
die Aufgabe lässt sich auch durch eine Formel lösen.
Trage mal diese Formel in R9 ein und ziehe sie bis R12 runter:
=WENN(P9="";"";WENN(ANZAHL2($P$9:$P$12)=1;100;Q9*(1+SUMMEWENN($P$9:$P$12;"";$Q$9:$Q$12) /SUMMEWENN($P$9:$P$12;"";$Q$9:$Q$12)))) 
ich würde noch die Teilformeln zwecks besserer Übersicht in Hilfszellen auslagern, deren Werte sind ja für alle 4 Zellen gleich
ANZAHL2($P$9:$P$12)
SUMMEWENN($P$9:$P$12;"";$Q$9:$Q$12)
SUMMEWENN($P$9:$P$12;"";$Q$9:$Q$12)
übrigt bleit dann, wenn die og. Teilformeln in R1:R3 stehen
=WENN(P9="";"";WENN(R1=1;100;Q9*(1+R2/R3)))
gruß Daniel
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige