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

Formelmonster durch VBA ersetzen

Formelmonster durch VBA ersetzen
Maris
Hallo lieben Excel Profis,
ich habe in einer Tabelle ein Formelmonster... das leider beide Kerne von meiner CPU meist voll auslastet, gibt es vielleicht eine Möglichkeit den Rechner zu schonen indem man das ganze durch VBA ersetzt. Folgende Formel greift auf Daten der Tabellenblätter A1 und B1 zu. Es ist ein Sverweis der nach 3 SuchKriterien sucht...
Kalenderwoche, Kategorie und Kennzahl:

=SVERWEIS(E$3;INDEX(INDIREKT("'"&$B4&"'!A:A");VERGLEICH($D4;INDIREKT("'"&$B4&"'!A:A");0)):INDEX( _
INDIREKT("'"&$B4&"'!BA:BA");1000);VERGLEICH($A4;INDIREKT("'"&$B4&"'!2:2");0);0)
Könnte man das durch VBA ersetzen, erleichteren oder exportieren?
Anbei noch die Beispieltabelle:
https://www.herber.de/bbs/user/72680.xls
Freu mich über jede Hilfe :-)!
Gruß Maris

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Formelmonster durch VBA ersetzen
14.12.2010 13:18:07
Rudi
Hallo,
was bringt dich auf die Idee, dass VBA schneller ist?
Die Bremse in deiner Mappe ist INDIREKT.
Du solltest mal über eine vernünftige Datenstruktur nachdenken. Letztlich käme diese auf deine Übersicht raus. Die Kategorie-Sicht könntest du dann auch per Pivot, zumindest mit einfachen Formeln, machen.
Gruß
Rudi
AW: Formelmonster durch VBA ersetzen
14.12.2010 13:28:15
selli
hallo maris,
rudi hat recht. deine blätter a1 und b1 sehen zwar gut aus, sind aber für jegliche auswertungen der daten bzw. aufstellung von statistiken unbrauchbar.
wenn die auswertung (rudis vorschlag: pivot) vernünftig formatiert wird reicht das doch.
die menge der formeln mit INDIREKT, die du einsetzen möchtest zwingt excel in die knie.
gruß
selli
Anzeige
AW: Formelmonster durch VBA ersetzen
14.12.2010 13:40:01
Maris
Hallo und danke für euere Antworten,
ich brauche beide Übersichten leider, aus der Übersicht wird dann noch ein Pivot erstellt aus den Mappen A1 und B1 werden charts erstellt und dienen zur Überblickschaffung in den Kalenderwochen. Dacht mit VBA kann man evtl. einen Export machen oder die Formelberechnung per Knopfdruck starten.
Leider kann ich nicht auf eine der beiden Ansichten verzichten... :-(
Gruß,
Maris
Dann musst du auch auf Speed verzichten (owT)
14.12.2010 13:41:52
Renee

AW: Dann musst du auch auf Speed verzichten (owT)
14.12.2010 13:49:57
Maris
schade!
du hast es nicht verstanden
14.12.2010 14:06:45
Rudi
Hallo,
du sollst deine Daten in einer Form wie in 'Übersicht' eingeben. Die Blätter A1 und A2 kannst dann daraus mit einfacheren Formeln (vor allem ohne INDIREKT) erstellen. Du musst den Weg also nur umdrehen.
Gruß
Rudi
Anzeige
AW: du hast es nicht verstanden
14.12.2010 15:29:25
Maris
Hallo Rudi,
leider ist das nicht so einfach da ich die Daten mit folgendem Code bereits aus einer anderem Tabellenblatt exportiere.
Ein Möglichkeit wäre den Export auch direkt in die Übersichtsmappe. Aber dazu müßte mir jemand beim Code helfen...
Anebi die Beispielmappe (Code zum exportieren der Rohdaten in Kategorie Auto und Motorrad liegt in Modul 1 und unten angefügt)
https://www.herber.de/bbs/user/72683.xls
Sub Aufruf()
On Error GoTo Fehler
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Call DatenHolen(Sheets("Rohdaten_Kategorien"), 6)
Call DatenHolen(Sheets("Rohdaten_Produkte"), 6, 7, 2)
Fehler:
Call Aktivieren
If Err  0 Then MsgBox Err.Description, , "Fehler-Nr.: " & Err.Number
End Sub
Sub Aktivieren()
Application.ScreenUpdating = True
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
End Sub
Sub DatenHolen(shQ As Worksheet, intSpalten As Integer, Optional intZVersatz As Integer,  _
Optional intSVersatz As Integer)
Dim shZ As Worksheet
Dim rngZelle As Range, rngFinden As Range
Dim lngS As Long, lngZ As Long
Dim intKW As Integer, intKWSpalte As Integer
intKW = Val(shQ.Range("C3"))
If intKW  53 Then MsgBox "KW """ & intKW & """ existiert nicht.": Exit Sub
Set shZ = Sheets("Rohdaten_Produkte")
For Each rngZelle In shQ.Range(shQ.Cells(5, 1), shQ.Cells(Rows.Count, 1).End(xlUp))
If rngZelle  "" Then
If shZ.Name  rngZelle Then
If Not SheetExist(rngZelle.Text) Then
rngZelle.Interior.ColorIndex = 3
Application.Goto rngZelle
If MsgBox("Blatt """ & rngZelle & """ existiert nicht!", vbOKCancel, " _
Fehler") = vbCancel Then
Call Aktivieren
End
End If
Else
Set shZ = Sheets(rngZelle.Text)
Set rngFinden = shZ.Rows(2).Find(intKW, , xlValues, xlWhole)
If rngFinden Is Nothing Then MsgBox "KW """ & intKW & """ existiert in """ & _
shZ.Name & """ nicht.": Exit Sub
intKWSpalte = rngFinden.Column
End If
End If
Set rngFinden = shZ.Columns(1).Find(rngZelle.Offset(0, 1), , xlValues, xlWhole)
If rngFinden Is Nothing Then
rngZelle.Offset(0, 1).Interior.ColorIndex = 3
Application.Goto rngZelle.Offset(0, 1)
If MsgBox("Eintrag """ & rngZelle.Offset(0, 1) & """ existiert nicht!",  _
vbOKCancel, "Fehler") = vbCancel Then
Call Aktivieren
End
End If
Else
rngFinden.Offset(1 + intZVersatz, intKWSpalte - 1).Resize(intSpalten, 1) =  _
WorksheetFunction.Transpose(rngZelle.Offset(0, 2 + intSVersatz).Resize(1, intSpalten))
End If
End If
Next
End Sub
Public Function SheetExist(strName As String) As Boolean
On Error Resume Next
SheetExist = Not Sheets(strName) Is Nothing
End Function

Anzeige
AW: einfache UDF
15.12.2010 02:13:16
Daniel
Hi
auch wenn deine Tabellenstruktur wie schon erkannt wurde nicht besonders auswertefreundlich ist:
dieses Formelmonster lässt sich gut durch eine UDF ersetzen:
Function meineFormel(Kategorie As String, _
Woche As Long, _
Hilfsspalte As String, _
Kennzahl As String) As Variant
Dim Ze As Long
Dim Sp As Long
Dim Zelle As Range
With Sheets(Kategorie)
Sp = .Rows(2).Find(what:=Woche, lookat:=xlWhole).Column
Set Zelle = .Columns(1).Find(what:=Hilfsspalte, lookat:=xlWhole)
Ze = .Columns(1).Find(what:=Kennzahl, after:=Zelle, lookat:=xlWhole).Row
meineFormel = .Cells(Ze, Sp).Value
End With
End Function

ich denke mal, die Parameterbenennung ist selbsterklärend, damit du weißt, auf welche Zellen du sie beziehen musst.
Die Funktion kannst du dann wie eine normale Excelformel verwenden.
Einzige Einschränkung:
eine neuberechnung findet nur statt, wenn sich in den angebenen Zellen was ändert, aber nicht wenn die Wertetabellen, auf den Blättern A1 bzw B1 geändert werden, hier müsstest du dann von Hand eine Neuberechnung anstossen.
was ich jetzt auch nicht eingebaut habe sind so Sicherheitsabfragen, wie ob die "Kategorie1" immer vorkommt.
dh. wenn "Auto" keine "Kategrie1" hat aber der nachfolgende Abschnitt, dann würde, wenn du danach suchst, die "Kategorie1" aus dem nachfolgenden Abschnitt als Ergebnis ausgegeben werden
Gruß, Daniel
Anzeige
AW: einfache UDF
15.12.2010 17:05:27
Maris
Hi Daniel,
genau so was habe ich gemeint :-) Wie baue ich das jetzt aber in das Excelsheet ein? Beziehungsweise werden mir dann nicht Fehlerwerte in Kategorie1 eingelsen ohne Sicherheitsabfrage?
Gruß und vielen Dank,
Maris
AW: einfache UDF
15.12.2010 21:45:52
Daniel
HI
zum einbauen einfach den Code in ein allgemeines Modul schreiben.
Dann kannst du die Funktion wie über eine normale Excelfunktion verwenden (ambesten über den Formelassistenten eingeben, dann werden die Parameterbenennungen mit angezeigt und du weißt, wo du was eingeben musst.
zu der Problematik was passiert wenn Kategorie1 nicht existiert kann ich auch nicht viel sagen.
dazu müsste man die Echtdaten kennen.
so wie es jetzt beschrieben ist, kann ich keinen Ansatz finden um festzustellen, wo der Datenbereich für AUTO zu Ende ist. bei ner anderen Tabellenstruktur wärs einfacher möglich aber so sehe ich keinen Ansatz.
Gruß, Daniel
Anzeige

304 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige