Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
688to692
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
688to692
688to692
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

VBA Codeoptimierung

VBA Codeoptimierung
05.11.2005 09:51:57
Diver
Hallo zusammen,
ich habe einen VBA-Code geschrieben, den ich gern ein wenig performanter
gestalten möchte...leider fehlt mir gerade die zündende Idee. Hier der Code:
Public Function GewichteterDurchschnitt(rngBereich As Range, _ Vergleichswert1 As Variant, _ Vergleichswert2 As Variant, _ Vergleichswert3 As Variant) As Long Dim intAnzahlZeilen As Integer Dim intIndex As Integer Dim intNenner As Integer Dim lngSumme As Long intAnzahlZeilen = rngBereich.Rows.Count For intIndex = 1 To intAnzahlZeilen If Cells(intIndex + 3, 6).Value = Vergleichswert1 And _ Cells(intIndex + 3, 7).Value = Vergleichswert2 And _ Cells(intIndex + 3, 8).Value = Vergleichswert3 And _ Cells(intIndex + 3, 9).Value <> "" Then lngSumme = lngSumme + Cells(intIndex + 3, 9).Value intNenner = intNenner + 1 End If Next GewichteterDurchschnitt = lngSumme If intNenner = 0 Then GewichteterDurchschnitt = 0 Else GewichteterDurchschnitt = (lngSumme / intNenner) End If End Function
Vielen Dank vorab.
Grüsse,
D.

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Codeoptimierung
05.11.2005 10:37:26
Erich
Hallo Diver(?),
warum machst du das überhaupt mit VBA? Ich würde nicht VBA vergleichen/addieren/dividieren lassen, sondern das per Excelformel erledigen. Excel kann das sehr viel schneller. Eine solche Excelformel kannst du auch von VBA aus nutzen, wenn du den Funktionswert in einem Makro brauchen solltest.
Ist das eine "zündende Idee"?
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
P.S.:
Schau doch doch mal so nebenbei, was bei https://www.herber.de/forum/faq.htm
unter "Die Kommunikation" über NickNames steht...
Anzeige
AW: VBA Codeoptimierung
05.11.2005 10:46:13
Diver
Hallo Erich,
wie säh denn eine Lösung nach deinem Vorschlag genau aus...grübel, grübel?
Grüsse,
D.
AW: VBA Codeoptimierung
05.11.2005 10:37:41
Luschi
Hallo Diver,
da Du den auszuwertenden Bereich als Objekt (rngBereich) an die Funktion
übergibst, ist es sinnvoller (und vor allem schneller), die Cells-Bezüge
durch rngBereich.OffSet(?,?).Value zu ersetzen. Bei Cells() muß Excel
erst selber ein Objekt nachbilden.
Zu einer genaueren Aussage mußt Du mir aber sagen, welcher Bereich hinter das "rngBereich"-Objekt steckt.
Zudem ist die Funktion als Long-Wert definiert, aber der Rückgabewert ist
durch die Division von 2 Werten aber ein Double-Wert. In C++ und Java würde
hier der Compiler schon nicht mitspielen.
Gruß von Luschi
aus klein-Paris
Anzeige
AW: VBA Codeoptimierung
05.11.2005 10:44:37
Diver
Hallo Luschi aus klein Paris ;-)
der Bereich, den ich mit Range einfange sollte mir nur melden,
wieviele Zeilen ich für den Schleifendurchlauf benötige.
Die Vergleichswerte sind dann:
1. Der Wochentag, also SO, MO, DI usw.
2. Ein Vertriebsweg, also Weg 1, Weg 2 usw.
3. Ein Tarif, also Tarif 1, Tarif 2 usw.
Wie würde eine performantere Lösung, insbesondere mit
rngBereich.OffSet(?,?).Value
aussehen?
Vielen Dank vorab.
Gruss,
Diver
AW: VBA Codeoptimierung
05.11.2005 11:37:04
Luschi
Hallo Diver,
die Information, die ich brauche ist Folgende:
Der Übergabeparameter "rngBereich" entspricht Range("A20:F100"),
aber auf Deine Bedingungen angepaßt.
Gruß von luschi
aus klein-Paris
Anzeige
AW: VBA Codeoptimierung
05.11.2005 11:41:08
Diver
Hallo nochmal,
ich fange den Bereich "$F$4:$F$8373" ein, damit icht halt die Anzahl Zeilen habe.
Reicht das oder brauchst du weitere Infos?
Viele Grüsse,
D.
AW: VBA Codeoptimierung
05.11.2005 13:16:22
Luschi
Hallo Diver,
hier ist die Funktion: Public Function GewichteterDurchschnitt(rngBereich As Range, _ Vergleichswert1 As Variant, _ Vergleichswert2 As Variant, _ Vergleichswert3 As Variant) As Long Dim intAnzahlZeilen As Integer, _ intNenner As Integer, _ lngSumme As Long, _ rng As Range intNenner = 0 lngSumme = 0 For Each rng In rngBereich If rng.Offset(0, 0).Value = Vergleichswert1 And _ Offset(0, 1).Value = Vergleichswert2 And _ Offset(0, 2).Value = Vergleichswert3 And _ Offset(0, 3).Value <> "" Then lngSumme = lngSumme + rng.Offset(0, 3).Value intNenner = intNenner + 1 End If Next If intNenner = 0 Then GewichteterDurchschnitt = 0 Else GewichteterDurchschnitt = CLng(lngSumme / intNenner) End If End Function Die Range-Variable "rng" durchläuft in der For-Each-Schleife
den Bereich "rngBereich". Deshalb ist die Anzahl der Schleifendurchläufe un-
interessant.
rng.Offset(0, 0) entspricht dabei F4, F5, F6 usw.
rng.Offset(0, 1) entspricht dann G4, G5, G6 usw.
usw.
rng.Offset(0, 3) entspricht dann I4, I5, I6 usw.
Gruß vo Luschi
aus klein-Paris
Anzeige
AW: VBA Codeoptimierung
05.11.2005 14:33:17
Diver
Hallo nochmal,
perfekt, funktioniert einwandfrei und performanceoptimiert :-)))
Vielen, vielen Dank.
Grüsse,
D.
AW: VBA Codeoptimierung
05.11.2005 11:47:21
Alex
Hallo,
einiges an Deinem Code ist mir nicht ganz klar - daher
hab ich das zum Testen mal angepasst.
aber vielleicht kannst Du hiermit was anfangen
(sollte ca. 100fach schneller laufen:)

Function GewichteterDurchschnitt(rngBereich As Range, _
Vergleichswert1 As Variant, _
Vergleichswert2 As Variant, _
Vergleichswert3 As Variant) As Double
Dim intAnzahlZeilen As Long
Dim intIndex As Long
Dim intNenner As Long
Dim lngSumme As Long
Dim hlp As Variant
intAnzahlZeilen = rngBereich.Rows.Count
hlp = rngBereich
For intIndex = 1 To intAnzahlZeilen
If hlp(intIndex, 1) = Vergleichswert1 And _
hlp(intIndex, 2) = Vergleichswert2 And _
hlp(intIndex, 3) = Vergleichswert3 And _
hlp(intIndex, 4) <> "" Then
lngSumme = lngSumme + hlp(intIndex, 4)
intNenner = intNenner + 1
End If
Next
GewichteterDurchschnitt = lngSumme
If intNenner = 0 Then
GewichteterDurchschnitt = 0
Else
GewichteterDurchschnitt = (lngSumme / intNenner)
End If
End Function

Anzeige
AW: VBA Codeoptimierung
05.11.2005 12:06:26
Diver
Hallo Alex,
habe mal den Code integriert...kommt leider nur #Wert raus.
Was verstehst du an dem Code nicht? Ggf. kommen wir dann weiter.
Viele Grüsse,
D.
AW: VBA Codeoptimierung
05.11.2005 12:06:36
Diver
Hallo Alex,
habe mal den Code integriert...kommt leider nur #Wert raus.
Was verstehst du an dem Code nicht? Ggf. kommen wir dann weiter.
Viele Grüsse,
D.
AW: VBA Codeoptimierung
05.11.2005 12:20:37
Alex
Hallo,
folgendes verstehe ich nicht:
1.
Du übergibst doch einen Zellbereich und Du ermittelst
die Anzahl der Zeilen mit rngBereich.Rows.Count-
warum dann intIndex + 3 ?
Damit verlässt Du doch den angegebenen Bereich.
2.
Ich weiß nicht genau, welche Werte in welcher Zelle stehen.
in Cells(intIndex + 3, 9).Value steht vermutlich ein Long- Wert
die anderen sind mir unbekannt.
Was für ein Problem hast Du denn, meinen Code zu integrieren?
Anzeige
AW: VBA Codeoptimierung
ransi
hallo allerseits
wenn ich den code richtig verstanden habe und du das ergebniss in einer tabelle brauchst, versuchs alternativ mal mit einer formellösung.
 
 FGHI
1Vergleichswert1Vergleichswert2Vergleichswert3 
2abc 
3abc8
4npu10
5hdg1
6abc9
7tcu7
8xpi8
9yaq2
10jnk9
11    
128,5   
Formeln der Tabelle
F12 : {=MITTELWERT(WENN(F3:F10&"##"&G3:G10&"##"&H3:H10=F2&"##"&G2&"##"&H2;I3:I10))}
 
Diagramm - Grafik - Excel Tabellen einfach im Web darstellen    Excel Jeanie HTML  3.0    Download  
kann man noch um folgendes ergänzen:
=wenn(istfehler(formel);0;formel)
damit kein #DIV/0! kommt wenn keine übereinstimmungen.
ransi
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige