Anzeige
Archiv - Navigation
1588to1592
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

Aufrufen einer Public Function über Sub verhindern

Aufrufen einer Public Function über Sub verhindern
14.11.2017 15:38:07
Kim
Hallo liebes Forum,
ich kämpfe seit gefühlten 100 Jahren mit einer P ublic Function (die ich glaube ich auch hier gefunden hab) die durch ein Sub aufgerufen wird
und dann in Endlosschleife dort herumspringt - dadurch dauert das ganze unendlich.
Ich habe hier schon einen Eintrag gefunden dazu, allerdings leider ohne Lösung (kann auf die Function leider nicht verzichten)
Ich hätte nun gern eine Möglichkeit dass mein Makro normal durchläuft ohne die Function zu berühren.
Die Function ist folgende:
Public Function SVERWEIS2(Kriterium As String, Bereich As Range, SuchSpalte As Integer, _
ErgebnissSpalte As Integer, welcher_wert As Long)
'Original von UDO
Dim arrTmp
Dim arr()
Dim L As Long
Dim z
z = 1
arrTmp = Bereich
For L = 1 To UBound(arrTmp)
If arrTmp(L, SuchSpalte) = Kriterium Then
ReDim Preserve arr(z)
arr(z) = arrTmp(L, ErgebnissSpalte)
z = z + 1
End If
Next
SVERWEIS2 = arr(welcher_wert)
End Function

Mein Makro (in gekürzter Version weil sehr lang) ist das hier:
Sub Kopie()
Dim tbstr As String
Call Test
' fortlaufende Nummerierung
tbstr = "Bewertung " & ActiveWorkbook.Sheets.Count - 3
Application.ScreenUpdating = False
' Kopiert Original
Range("A1:J92").Select
Selection.Copy
' wo soll neues TB hin
Sheets.Add After:=Worksheets(Worksheets.Count)
' Paste inkl Formeln
Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Selection.PasteSpecial Paste:=xlPasteComments, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
'Blattschutz
ActiveSheet.Protect Password:="@Passwort", UserInterfaceOnly:=True, DrawingObjects:=True, _
Contents:=True, Scenarios:=True, _
AllowFormattingCells:=True, AllowFormattingColumns:=True, _
AllowFormattingRows:=True
'Name wie festgelegt
ActiveSheet.Name = tbstr
'Formatierung
Columns("A:J").EntireColumn.AutoFit
Rows("1:31").EntireRow.AutoFit
Application.CutCopyMode = False
Name = Cells(4, 3).Value
Var0 = Cells(3, 2).Value
Var1 = Cells(4, 2).Value
Sheets("Alle").Select
For I = 4 To 70
If Cells(I, 3).Value = "" Then
Cells(I, 1).Value = Name
Cells(I, 2).Value = Var0
Cells(I, 3).Value = Var1
Exit For
End If
Next
'Löscht alle Angaben damit eine neue Bewertung gemacht werden kann
Sheets("Analyse").Select
Range("C6:C14").ClearContents
Range("C16:C17").ClearContents
Range("C19:C22").ClearContents
Range("I6:I19").ClearContents
Range("E6:E25").ClearContents
Range("J6:J19").ClearContents
Range("B3").ClearContents
Range("H3").ClearContents
Application.ScreenUpdating = True
Sheets("Analyse").Select
Range("B3").Select
End Sub Kann mir vl jemand helfen und sagen was ich tun kann damit die Function nicht aufgerufen wird?
Vielen Dank im Voraus!

16
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Deine Sub benutzt die Funktion nicht!
14.11.2017 15:52:15
EtoPHG
Hallo Kim,
Deine Sub ruft den SVERWEIS2 nirgends auf!
Also muss wohl das Tabellenblatt die Funktion als Formel aufrufen.
Du kannst deine Sub dahingehend ändern, dass du folgendes machst:
Sub Kopie()
Dim iCalc As Integer
iCalc = Application.Calculation
Application.Calculation = xlCalculationManual
'Hier der Code deiner Sub
Application.Calculation = iCalc
End Sub
Gruess Hansueli
AW: Deine Sub benutzt die Funktion nicht!
14.11.2017 16:49:55
Kim
Danke! Sowas hab ich mir vorgestellt, die Function wird zwar immer noch aufgerufen aber erst nachdem er das Sub durchhat (vorher hat er es immer nach dem End If gemacht - weiß nicht wieso)
Der Button war zwar mal schneller (vor der Function) aber jetzt ist es voll ok!
Danke nochmal!
Liebe Grüße, Kim
Anzeige
Erstmal Funktion optimieren
14.11.2017 16:19:31
Daniel
Hi
noch drei Tips, um deine Funktion zu beschleunigen:
1. breche die Schleife ab, wenn der gesuchte Wert gefunden wurde.
weiter muss sie nicht laufen (der originale SVerweis macht das auch)
2. Bilde das Array aus der Schnittmenge von "Bereich" und er UsedRange auf dem Blatt.
das erlaubt es dir, ohne Performaceverlust auch ganze Spalten als Zellbereich anzugeben.
das kannst du jetzt zwar auch tun, aber die Funktion rödelt dann auch wirklich alle Zeilen bis zur letzten durch und das ist nicht erforderlich.
3. wozu das Ergebnis-Array? du übergibst ja nur einen Wert. Dh du brauchst kein Array.
Zähle einfach mit, wie oft der Wert schon vorgekommen ist und übergebe den aktuellen Wert, wenn der Zähler den Zielwert erreicht hat.
Dann brich die Schleife ab (siehe 1)
hier zu ein kleiner Tip:
um festzustellen, ob eine For-Next-Schleife abgebrochen wurde, kann man den Schleifenzähler mit dem Schleifenendwert vergleichen.
ist nach Beendigung der Schleife der Schleifenzähler größer als der -Endwert, wurde die Schleife vollständig durchlaufen.
ist er kleiner oder gleich dem Endwert, wurde die Schleife vorzeitig mit Exit For beendet.
Public Function SVERWEIS2(Kriterium As String, _
Bereich As Range, _
SuchSpalte As Integer, _
ErgebnissSpalte As Integer, _
welcher_wert As Long)
Dim arrTmp
Dim L As Long
Dim z As Long
arrTmp = Intersect(Bereich, Bereich.Worksheet.UsedRange).Value
For L = 1 To UBound(arrTmp)
If arrTmp(L, SuchSpalte) = Kriterium Then
z = z + 1
If z = welcher_wert Then Exit For
End If
Next
If L 
ansonsten, die häufigen Neuberechnungen kannst du nur wie von EtoPHG beschrieben, verhindern, wenn du vor den Aktionen, die eine solche neuberechnung auslösen, die Automatische Neuberechnung von Formeln deaktivieren.
solche UDFs haben halt das Problem, dass sie, auch wenn sie nicht volatil sind, häufiger neu berechnet werden als normale Excelformeln.
Gruß Daniel
Anzeige
AW: Erstmal Funktion optimieren
14.11.2017 16:53:05
Kim
Das klingt alles super logisch und hab ich mir auch gedacht, allerdings kenn ich mich einfach viel zu wenig aus um zu wissen wie man 1. und 2. macht. Dass er nicht das ganze Blatt durchsuchen soll will ich eh - hab nur noch nicht herausgefunden wie
zu 3. - bin mir nicht sicher ob ich das richtig verstehe. ich gebe eigentlich 5 werte aus.
also er sucht nach dem Monat und dem Namen, dann gibt er mir 5 Zahlen pro Monat aus.
Oder meinst du das anders?
Sorry wenn ich mich echt zu blöd anstelle, bin auch nicht böse wenn du aufgibst :)
Liebe Grüße, Kim
AW: Erstmal Funktion optimieren
14.11.2017 17:07:40
Daniel
Naja, jede einzelne Funktion gibt immer nur einen Wert aus.
Du da der Suchbegriff mehrfach vorkommen kann gibst du an, ob du die erste, zweite oder dritte , usw Fundstelle als Ergebnis haben willst.
Aber wenn du die zweite Fundstelle haben willst, brauchst du nach der dritten und vierten nicht mehr suchen, sondern kannst die Schleife abbrechen.
Dafür gibt es das Exit Dir.
Gruß Daniel
Anzeige
Den For Each-Abbruch kannst du genauso
14.11.2017 20:24:32
Daniel
einfach feststellen Luc:
Wenn die For-Each X IN ... Schleife vollständig durch gelaufen ist, ist die Schleifenvariable X leer.
bei einem vorzeitigen Abbruch enthält die Variable den entsprechenden Wert aus der Schleife.
dies kann bei einer Variant-Variable mit If IsEmpty(X) abfragen und bei einer Objektvariablen mit IF X Is Nothing
Gruß Daniel
Anzeige
Gut, das ist meist das Sinnvollste! ;-) owT
15.11.2017 02:06:51
Luc:-?
:-?
Danke für dein FeedBack
15.11.2017 08:19:36
Daniel
Freut micht, dass ich dir helfen konnte.
Gruß Daniel
Dito!
16.11.2017 00:40:00
Luc:-?
Wollte dir Gelegenheit geben, die günstigsten Methoden für beide For-SchleifenTypen in einem Thread darzulegen, damit Nachleser alles zusammen finden.
Das Gut im Betreff ist übrigens hervorgehoben gemeint! ;-)
Luc :-?
Wieso Dito?
16.11.2017 01:08:38
Daniel
Wieso Dito?
16.11.2017 01:08:40
Daniel
Doppeltpostings für Fortgeschrittene
16.11.2017 03:59:21
lupo1
Da es hier binnen 2 Sekunden geschah, sieht es fast nach einem unbeabsichtigten Tastenprellen aus (wobei das normalerweise noch schneller geschieht).
Falls das nicht so ist, bleibt die Möglichkeit, in der Beitragsliste nachzuschauen, ob der Beitrag schon gesendet, aber noch nicht publiziert wurde.
Anzeige
AW: Programmierfehler?
16.11.2017 11:21:26
Daniel
ich hab auch den Eindruck, dass der Beitrag nochmal abgeschickt wird, wenn man die Browserhistorie durchgeht.
Scheint mir ein Problem der Seitenprogrammierung zu sein, da in anderen Foren Doppelposts gar nicht oder zumindest wesentlich seltener vorkommen.
Bezog sich auf 'Danke'! owT
16.11.2017 04:30:01
Luc:-?
:-?
Antwort auf: AW: Bezog sich auf 'Danke'! owT
16.11.2017 08:29:17
Daniel
Hi Luc
Wenn du dich mit "dito" nicht auf den ganzen Text beziehen willst sondern nur auf einen Teil oder nur auf ein einzelnes Wort, dann solltest du dazuschreiben, welchen Teil du meinst.
Sonst ist es missverständlich.
Gruß Daniel

49 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige