Aktive Tabelle

Hi leute.
Richtige experten sind mal wieder gefragt.
ich schreibe momentan an einem programm, wo ich mit den einzelnen Zellen auf von mir gebaute Macro-Funktionen zugreife.
ich habe mehrere blätter und z.b. drei Funktionen, die von jedem blatt aus benutzt werden.

nun meine frage:

wenn er mir die blätter füllt, dann dauert das ganze 40 min.
damit der bildschirm nicht die ganze zeit rumflackert, durch das viele füllen habe ich die bildschirmaktivitäten mit „application.screenupdate = false“ unterdrückt.

da ich manche tabellen auch dynamisch füllen lasse, habe ich insgesamt, aus reiner neugier einen zähler mit eingebaut, der einfach in den funktionen sich um eins hochsetzt.

zähle ich aber die zellen, und die anzahl der ausgeführten funktionen, bin ich der meinung, dass diese funktionen teilweise doppelt und dreifach ausgeführt werden.

Quelltext ist vieeeel zu lang, und auszüge leider zu unübersichtlich.

1)wie geht excel mit den funktionen vor? gibt es da eine feste reihenfolge?

  1. mich würde, um die zahl genauer zu überprüfen interessieren, wie oft er die funktion von jedem blatt aus ausruft.
    wenn ich aber mit „activesheet“ arbeite, liefert er mir immer nur den namen von dem blatt, wo ich die ganze berechnung meiner arbeitsmappe gestartet habe, und das ist def. die seite wo gar nichts berechnet wird. liegt das am „application.screenupdate = false“ und welche andere lösung könnte es da geben??

Danke schon im vorraus Micha

Hi Micha,

wenn er mir die blätter füllt, dann dauert das ganze 40 min.
damit der bildschirm nicht die ganze zeit rumflackert, durch
das viele füllen habe ich die bildschirmaktivitäten mit
„application.screenupdate = false“ unterdrückt.

Wenn der Bildschirm flackert, hast Du wahrscheinlich in den Makros den Befehl „ZelleXY. select
DAS bremst wie Sau. Versuch mal, ohne Select klarzukommen.
Wenn Du willst, kannst Du mir eine Beispieldatei und den Quelltext schicken, dann schmeiß ich mal ein Auge drauf. Ich tus auch garantiert wieder runter, wenn ich was zurückschicke ;o)

zähle ich aber die zellen, und die anzahl der ausgeführten
funktionen, bin ich der meinung, dass diese funktionen
teilweise doppelt und dreifach ausgeführt werden.

Führe die Makros mal schrittweise aus, dann siehst Du, ob Funktionen aufgerufen werden, die nicht nötig sind.

Quelltext ist vieeeel zu lang, und auszüge leider zu
unübersichtlich.

Was ist vieeeeel zu lang?
Ich hab hier „Makro´s“ mit 1200 Zeilen am laufen ;o)

1)wie geht excel mit den funktionen vor? gibt es da eine feste
reihenfolge?

Die gibst Du im Quelltext vor. Und Excel führt sie aus. So wie der Herr befehlen.

Danke schon im vorraus Micha

Biddeschööön, Fritz

ich schreibe momentan an einem programm, wo ich mit den
einzelnen Zellen auf von mir gebaute Macro-Funktionen
zugreife.
ich habe mehrere blätter und z.b. drei Funktionen, die von
jedem blatt aus benutzt werden.
wenn er mir die blätter füllt, dann dauert das ganze 40 min.

Ohne Code kann ich da nix beschleunigen.

zähle ich aber die zellen, und die anzahl der ausgeführten
funktionen, bin ich der meinung, dass diese funktionen
teilweise doppelt und dreifach ausgeführt werden.
1)wie geht excel mit den funktionen vor? gibt es da eine feste
reihenfolge?

  1. mich würde, um die zahl genauer zu überprüfen
    interessieren, wie oft er die funktion von jedem blatt aus
    ausruft.
    wenn ich aber mit „activesheet“ arbeite, liefert er mir immer
    nur den namen von dem blatt, wo ich die ganze berechnung
    meiner arbeitsmappe gestartet habe, und das ist def. die seite
    wo gar nichts berechnet wird. liegt das am
    „application.screenupdate = false“ und welche andere lösung
    könnte es da geben??

Hi Michael,
ich hab den folgenden Code mal so zusammengestellt, mag sein dass ‚activesheet‘ was falsches angibt, hab das nicgr genau überprüft, aber macht nix, anhand der Zellenadresse müßtest du leicht herausfinden können welches Blatt damit gemeint ist.
In deine Funktionen musst du wie hier im Beispiel doppel() gezeigt, die ersten 4 Befehlszeilen mit einbauen, bei bereich(n,2) den jeweiligen Funktionsnamen reinschreiben. Weiterhin ggfs. in abruf() den Tabellenblattnamen des AusgabeTBs abändern.
Durch Aufruf von abruf() siehst du dann im AusgabeTB welche Zelle welche Funktion aufrief und in welcher Reihenfolge dies Excel tut.
Gruß
Reinhard

Folgenden Code in ein Modul:

Dim zaehl As Integer
Dim bereich(10000, 2) As String
Function doppel(x As Integer) As Integer
zaehl = zaehl + 1
bereich(zaehl, 0) = Application.Caller.Address
bereich(zaehl, 1) = ActiveSheet.Name
bereich(zaehl, 2) = "doppel"
doppel = 2 \* x
End Function

Sub abruf()
Tabellenname = "Tabelle3" 'hier anpassen auf TabelleX
Set ws = Worksheets(Tabellenname)
ws.Range("A1:B65536").ClearContents
n = 1
While bereich(n, 0) ""
 If bereich(n, 1) ws.Name Then
 ws.Cells(n, 2) = bereich(n, 0)
 ws.Cells(n, 1) = bereich(n, 1)
 ws.Cells(n, 3) = bereich(n, 2)
 End If
 n = n + 1
Wend
Set ws = Nothing
zaehl = 0
For n = 0 To 10000
bereich(n, 0) = ""
Next n
End Sub

Ohne Code kann ich da nix beschleunigen.
Dim zaehl As Integer
Dim bereich(10000, 2) As String
Function doppel(x As Integer) As Integer
zaehl = zaehl + 1
bereich(zaehl, 0) = Application.Caller.Address
bereich(zaehl, 1) = ActiveSheet.Name
bereich(zaehl, 2) = „doppel“
doppel = 2 * x
End Function

Sub abruf()
Tabellenname = „Tabelle3“ 'hier anpassen auf TabelleX
Set ws = Worksheets(Tabellenname)
ws.Range(„A1:B65536“).ClearContents
n = 1
While bereich(n, 0) „“
If bereich(n, 1) ws.Name Then
ws.Cells(n, 2) = bereich(n, 0)
ws.Cells(n, 1) = bereich(n, 1)
ws.Cells(n, 3) = bereich(n, 2)
End If
n = n + 1
Wend
Set ws = Nothing
zaehl = 0
For n = 0 To 10000
bereich(n, 0) = „“
Next n
End Sub

Hallo Reinhard.

Erstmal super danke, deine Idee ist klasse und funktioniert auch
soweit.
das einzige prob, was ich echt noch habe ist, 1. ich habe einen datensatz, von über 110000 Funktionsaufrufen, da macht excel mit seiner nur 65536 zellen schlapp, das bekomme ich ja noch hin,
aber, wie du schon gesagt hast…

activesheet arbeitet nicht richtig. ich bekomme IMMER den namen vom ersten blatt, von dem ich die calculation starte. dort mache ich aber garnichts, auf dem blatt, sondern eher auf den anderen 21.
hast du da noch eine idee, wär echt klasse!!!

Gruß und danke nochmals, Micha

das einzige prob, was ich echt noch habe ist, 1. ich habe
einen datensatz, von über 110000 Funktionsaufrufen, da macht
excel mit seiner nur 65536 zellen schlapp, das bekomme ich ja
noch hin,
aber, wie du schon gesagt hast…

activesheet arbeitet nicht richtig. ich bekomme IMMER den
namen vom ersten blatt, von dem ich die calculation starte.
dort mache ich aber garnichts, auf dem blatt, sondern eher auf
den anderen 21.

Hi Michael,
Ideen habe ich reichlich aber mein Excelwissen oder auch Excel macht da nicht mit :smile:
Nachfolgendes Makro Protokoll() musst du in jede deiner Funktionen einbauen, so wie hier in die Funktion doppel():

Function doppel(x As Integer) As Integer
Protokoll („doppel“)
doppel = 2 * x
End Function
Leider fand ich da keinen Dreh den Funktionsnamen auszulesen, du musst also jeweils den Funktionsnamen manuell
eintragen wie in Protokoll („doppelt“).
Weiterhin wird vorausgesetzt (Achtung keine Fehlerüberprüfung), dass Word läuft und ein Dokument geöffnet ist.

Dann werden alle Excel-Funktionsaufrufe in das Worddok eingetragen in der Form:
 Tabelle Zelle Funktion
[Mappe3]Tabelle1 $D$2 doppel
[Mappe3]Tabelle2 $A$1 doppel
Gruß
Reinhard

Function doppel(x As Integer) As Integer
Protokoll ("doppel")
doppel = 2 \* x
End Function

Sub Protokoll(n As String)
Dim WordObj As Object
Dim WordDoc As Word.Document
Dim dName$
'On Error GoTo w
Set WordObj = GetObject(, "Word.Application")
'GoTo n
'w:
'Set WordObj = CreateObject("Word.Application")
'n:
'Set WordDoc = WordObj.Documents.Add
'WordObj.Visible = True
Satz = Left(Application.Caller.Address(external:=True), \_
 InStrRev(Application.Caller.Address(external:=True), "!") - 1)
Satz = Satz & " " & Mid(Application.Caller.Address(external:=True), \_
 InStrRev(Application.Caller.Address(external:=True), "!") + 1)
Satz = Satz & " " & n
With WordObj
 .Selection.TypeText Text:=Satz
 .Selection.TypeParagraph
End With
End Sub

Hi Michael,
Ideen habe ich reichlich aber mein Excelwissen oder auch Excel
macht da nicht mit :smile:
Nachfolgendes Makro Protokoll() musst du in jede deiner
Funktionen einbauen, so wie hier in die Funktion doppel():

Function doppel(x As Integer) As Integer
Protokoll („doppel“)
doppel = 2 * x
End Function
Leider fand ich da keinen Dreh den Funktionsnamen auszulesen,
du musst also jeweils den Funktionsnamen manuell
eintragen wie in Protokoll („doppelt“).
Weiterhin wird vorausgesetzt (Achtung keine
Fehlerüberprüfung), dass Word läuft und ein Dokument geöffnet
ist.

Dann werden alle Excel-Funktionsaufrufe in das Worddok
eingetragen in der Form:
Tabelle Zelle Funktion
[Mappe3]Tabelle1 $D$2 doppel
[Mappe3]Tabelle2 $A$1 doppel
Gruß
Reinhard

Function doppel(x As Integer) As Integer
Protokoll („doppel“)
doppel = 2 * x
End Function

Sub Protokoll(n As String)
Dim WordObj As Object
Dim WordDoc As Word.Document
Dim dName$
'On Error GoTo w
Set WordObj = GetObject(, „Word.Application“)
'GoTo n
'w:
'Set WordObj = CreateObject(„Word.Application“)
'n:
'Set WordDoc = WordObj.Documents.Add
'WordObj.Visible = True
Satz = Left(Application.Caller.Address(external:=True), _
InStrRev(Application.Caller.Address(external:=True),
„!“) - 1)
Satz = Satz & " " &
Mid(Application.Caller.Address(external:=True), _
InStrRev(Application.Caller.Address(external:=True),
„!“) + 1)
Satz = Satz & " " & n
With WordObj
.Selection.TypeText Text:=Satz
.Selection.TypeParagraph
End With
End Sub

Hey Reinhard!

Wenn du mir jetzt noch sagst, wie ich in Spalte 4 gleiche aufrufe summieren kann, so dass sie nicht doppelt und dreifach vorkommen (also tabelle, zelle und funktion, alle drei gleich), und dann danach noch die textdatei sortieren kann, …

also dann bist du für mich echt Held nummer 1, jawohl.
aber auch danke bis jetzt schon, klappt alles prima, nur des wäre mir echt noch sehr hilfreich.
wie ich schon sagte, ich habe knapp 100000-120000 funktionsaufrufe, und da ist es dann nicht ganz so leicht des alles manuell zu sortieren, und zu überblicken. außerdem würde es dann vllt auch ein paar seiten in word sparen :wink:

Danke schonma, der Micha

Wenn du mir jetzt noch sagst, wie ich in Spalte 4 gleiche
aufrufe summieren kann, so dass sie nicht doppelt und dreifach
vorkommen (also tabelle, zelle und funktion, alle drei
gleich), und dann danach noch die textdatei sortieren kann,

Hi Michael,
in Word bin ich gar nicht fit.
Aber ich habe den Code umgeschrieben, sodass als Trennzeichen das „;“ benutzt wird.
Somit kannst du in Word sorieren, wenn denn das Dokument gefüllt ist.
Ganzes Dokument markieren (Strg-A)
Tabelle—Umwandeln—Text in Tabelle
Bestätigen

Jetzt ist ja die entstandene Tabelle noch markiert. Also dann
Tabelle—Sortieren
und Schlüssel1, Schlüssel2 usw. auswählen.
Jetzt ist die Tabelle in Word sortiert, d.h. MehrfachEinträge stehen jetzt direkt untereinander.
Tja, jetzt musst du wohl hier im Word-Brett fragen, wie man doppelte Einträge in einer Wordtabelle löscht, ich weiss das nämlich nihct in Word.
Gruß
Reinhard

Function doppel(x As Integer) As Integer
Protokoll ("doppel")
doppel = 2 \* x
End Function

Sub Protokoll(n As String)
Dim WordObj As Object
Dim WordDoc As Word.Document
Dim dName$
'On Error GoTo w
Set WordObj = GetObject(, "Word.Application")
'GoTo n
'w:
'Set WordObj = CreateObject("Word.Application")
'n:
'Set WordDoc = WordObj.Documents.Add
'WordObj.Visible = True
Satz = Left(Application.Caller.Address(external:=True), \_
 InStrRev(Application.Caller.Address(external:=True), "!") - 1)
Satz = Satz & ";" & Mid(Application.Caller.Address(external:=True), \_
 InStrRev(Application.Caller.Address(external:=True), "!") + 1)
Satz = Satz & ";" & n
With WordObj
 .Selection.TypeText Text:=Satz
 .Selection.TypeParagraph
End With
End Sub