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

VBA-Befehl wird "verschluckt"

VBA-Befehl wird "verschluckt"
08.04.2015 15:55:26
Hendrik
Hallo zusammen,
um den Wert eines Cube-Elements in eine Variable zu schreiben, nutze ich folgenden Code:
Function gibAktuellenStand(strConName) As String
On Error Resume Next
ActiveWorkbook.Worksheets.Add.Name = "tmpStand"
On Error GoTo 0
ActiveWorkbook.Worksheets("tmpStand").Range("A1").FormulaLocal = "=cubeelement(""" &  _
strConName & """;""[Dim Stand Datum].[Dim Standdatum].[Alle].firstchild.firstchild.firstchild"")"
gibAktuellenStand = Replace(Range("A1").Value, "-", "")
Application.DisplayAlerts = False
ActiveWorkbook.Worksheets("tmpStand").Delete
Application.DisplayAlerts = True
End Function
Das funktioniert prima, wenn ich Schritt für Schritt debugge.
Lasse ich den Code normal laufen, wird das Löschen des Tabellenblattes nicht mehr ausgeführt! Ich vermute, dass es am Zeitversatz liegt, den die Cube-Abfrage braucht (1 bis 2 Sekunden). Was kann ich tun, damit der nächste Befehl nicht verschluckt wird? Eine Pause einbauen?
Danke!
Hendrik

23
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA-Befehl wird "verschluckt"
08.04.2015 16:22:44
Oberschlumpf
Hi Hendrik
schalt mal das On Error aus, dann werden auch Fehlermeldungen nicht "verschluckt".
Hilfts?
Ciao
Thorsten

AW: VBA-Befehl wird "verschluckt"
08.04.2015 16:43:49
Hendrik
Hallo Thorsten,
danke für den Tipp. Ich habe die Fehlerbehandlung auskommentiert (die eigentlich aber ja erforderlich ist) und bekomme dann einen Laufzeitfehler 13 "Typen unverträglich" in der Zeile mit dem replace(). Gehe ich dann auf debuggen und einen Schritt weiter, steht in gibAktuellenStand aber dennoch der richtige und umformatierte Wert.
Weißt Du weiter?
Danke und Grüße
Hendrik

AW: VBA-Befehl wird "verschluckt"
08.04.2015 17:04:31
Daniel
Hi
in der Zeile mit Replace steht vor dem Range kein Workbook und kein Tabellenblatt davor angegeben.
damit beziehst du dich entweder auf das aktive Blatt, oder wenn sich der Code in einem Tabellenblattmodul befindet, auf das Blatt des Moduls.
Das kann, muss aber nicht das Blatt sein, auf welchem du die Formel eingefügt hast.
du solltes also auch hier workbook und Worksheet vor die Range schreiben, genauso wie beim Schreiben der Formel.
Gruß Daniel

Anzeige
AW: VBA-Befehl wird "verschluckt"
08.04.2015 17:09:50
Rudi
Hallo,
vielleicht hilft ja
Function gibAktuellenStand(strConName) As String
On Error Resume Next
ActiveWorkbook.Worksheets.Add.Name = "tmpStand"
On Error GoTo 0
With Worksheets("tmpStand").Range("A1")
.FormulaLocal = "=cubeelement(""" & _
strConName & """;""[Dim Stand Datum].[Dim Standdatum].[Alle].firstchild.firstchild. _
firstchild"")"
Do While Left(.Text, 1) = "#"
'warten
Loop
gibAktuellenStand = Replace(.Value, "-", "")
End With
Application.DisplayAlerts = False
ActiveWorkbook.Worksheets("tmpStand").Delete
Application.DisplayAlerts = True
End Function
(aus der Hilfe: Wenn Auswertungen mit der CUBEELEMENT-Funktion ausgeführt werden, wird vorübergehend die Meldung "#DATEN_ABRUFEN…" in der Zelle angezeigt, bis alle Daten abgerufen wurden.)
Gruß
Rudi

Anzeige
AW: VBA-Befehl wird "verschluckt"
08.04.2015 17:12:35
Markus
Hallo Hendrik
Versuch es mal mit der Eigenschaft Text anstatt Value. Also folgende Codezeile:
gibAktuellenStand = Replace(Range("A1").Text, "-", "")
Ich vermute dies wird einiges klarstellen (#NV), aber ein neues Problem aufwerfen.
Gruss Markus

AW: VBA-Befehl wird "verschluckt"
09.04.2015 09:28:08
Hendrik
Hallo zusammen,
vielen Dank für die ganzen Beiträge und die daraus entstandene Diskussion.
Ich bin erst heute wieder dazu gekommen alle durchzugehen und Eure Tipps auszuprobieren.
@Daniel: Danke für den Hinweis mit dem absoluten Range-Bezug. Ich habe das Tabellenblatt nun explizit angegeben. Auf das Problem hat das aber leider keinen Einfluss.
@Rudi: Damit hast Du mir eine Endlosschleife eingebrockt. :o) Die mit # beginnende Meldung steht in der Tat kurz in der Zelle. Wenn ich die Schleife drin habe, geht die aber nicht mehr weg.
@Markus: "Die Text-Eigenschaft des Range-Objekts kann nicht zugeordnet werden."
Gibt es noch weitere Vorschläge? :o)
Kommt es häufig vor, dass sich der Interpreter im Debug-Modus anders verhält als zur normalen Laufzeit? Wäre ja nicht sinnvoll...

Anzeige
AW: VBA-Befehl wird "verschluckt"
09.04.2015 11:36:48
Luschi
Hallo Hendrik,
das Anzeigen von '#DATEN_ABRUFEN' in der Zelle 'A1' ist eine Rückgabe des Fehlerwertes beim Aktualisieren von 'CubeElement', siehe:
https://support.office.com/de-ch/article/FEHLERTYP-Funktion-10958677-7c8d-44f7-ae77-b9a9ee6eefaa
Deshalb schreibe in eine Zelle, nicht nicht von der Aktualisierung betroffen ist,
noch eine Formel hier in Zelle 'F1':
.Offset(0, 10).FormulaLocal = "=WENN(FEHLER.TYP(A1)=8;8;0)"
Diese Formel gibt den Fehlerwert der Zelle 'A1' zurück, der dann in der Schleife
abgefragt werden kann.

With Worksheets("tmpStand").Range("A1")
.FormulaLocal = "=cubeelement(""" & strConName & _
""";""[Dim Stand Datum].[Dim Standdatum].[Alle]." & _
"firstchild.firstchild.firstchild"")"
.Offset(0, 5).FormulaLocal = "=WENN(FEHLER.TYP(A1)=8;8;0)"
Do While .Offset(0, 5).Value = 8
'warten
Loop
gibAktuellenStand = Replace(.Value, "-", "")
End With
Eigentlich muß es auch mit dem folgenden Kontrukt gehen:
Do While .Errors.Item(xl...).Value=8
'warten
Loop
aber weder die vba-IntelliSense, noch die Vba-Online-Hilfe wollen den passenden xl-Wert mir verraten. Im Objekt-Katalog (F2) hab ich ihn auch noch nicht entdeckt.
Gruß von Luschi
aus klein-Paris

Anzeige
AW: VBA-Befehl wird "verschluckt"
09.04.2015 13:07:07
Hendrik
Hallo Luschi,
danke für die Antwort.
Ich habe den Code angepasst und im debugger laufen lassen.
    With ActiveWorkbook.Worksheets("tmpStand").Range("A1")
.FormulaLocal = "=cubeelement(""" & strConName & """;""[Dim Stand Datum].[Dim  _
Standdatum].[Alle].firstchild.firstchild.firstchild"")"
.Offset(0, 5).FormulaLocal = "=WENN(FEHLER.TYP(A1)=8;8;0)"
Do While .Offset(0, 5).Value = 8
'warten
Loop
gibAktuellenStand = Replace(.Value, "-", "")
End With
Am Beginn der Schleife breche ich mit "Typen unverträglich" ab.
In F1 steht zu diesem Zeitpunkt die Formel

=WENN(FEHLER.TYP(A1)=8;8;0) 
und das Ergebnis #NV. Soll das so? Ich verstehe die Intention nämlich nicht recht. :)
Danke und Grüße
Hendrik

Anzeige
AW: VBA-Befehl wird "verschluckt"
09.04.2015 13:30:01
Hendrik
Hallo nochmal,
ich habe es auch so probiert:
    With ActiveWorkbook.Worksheets("tmpStand")
.Range("A1").FormulaLocal = "=WENN(ISTFEHLER(A2);0;1)"
.Range("A2").FormulaLocal = "=cubeelement(""" & strConName & """;""[Dim Stand Datum].[ _
Dim Standdatum].[Alle].firstchild.firstchild.firstchild"")"
Do While .Range("A1").Value = 0
'warten
Loop
gibAktuellenStand = Replace(.Range("A2").Value, "-", "")
End With
Klappt beim Debuggen und hängt im Normalbetrieb in einer Endlosschleife fest.
Das ist doch Schrott. Hat jemand eine andere Idee, wie ich das Ergebnis einer Cube-Abfrage in eine Variable bekomme? Deswegen mache ich diesen ganzen Zirkus.

Anzeige
AW: VBA-Befehl wird "verschluckt"
09.04.2015 14:56:02
Luschi
Hallo Hendrik,
ich bin gerade Dabei, ein OLAP-Cube aus 1er Access-DB mit 2,2 Mio. Datensätze aufzubauen und
teste dann noch mal.
Schuld an dem Dilemma sind aber nicht die fleißigen Helfer in den unterschiedlichsten Foren, sondern die miese Qualität der Excel-Online-Hilfe und den sonstigen Veröffentlichungen von M$.
Und die meisten Fachbeiträge zu diesem Thema wollen alle Geld sehen in Form von Mitgliedsbeiträgen pro Zeitraum; z.B:
http://www.akademie.de/wissen/excel-daten-datenbanken-auswerten-olap-cubes-0
Hier spricht man zwar Klartext, aber 150€ + MwST sind schon ein Happen Geld!
Ich melde mich dann noch mal.
Gruß von Luschi
aus klein-Paris

Anzeige
AW: VBA-Befehl wird "verschluckt"
09.04.2015 15:06:54
Hendrik
Hallo Luschi,
die fleißigen Helfer möchte ich auch auf keinen Fall kritisiert wissen und nochmal ausdrücklich loben!
Ich werde die Funktion oben jetzt erst mal wieder ausschalten. So kann ich weiterhin automatisiert eine Verbindung zum Würfel herstellen, eine Pivottabelle erstellen und diese mit ein paar Werten vorbelegen. Nur den Stand muss ich dann halt jedes mal manuell setzen.
Falls Du neue Erkenntnisse hast, würde ich mich über einen Kommentar freuen, ich bekomme ja eine Mail, wenn hier etwas geschrieben wird.
Grüße
Hendrik
PS: wo liegt klein-Paris? :)

Anzeige
Goethe, Faust, Mephisto, Auerbachs Keller! orT
09.04.2015 16:45:49
Luc:-?
Gruß, Luc :-?

AW: Goethe, Faust, Mephisto, Auerbachs Keller! orT
11.04.2015 17:39:02
Luschi
Hallo Hendrik,
ich habe jetzt mal mit E_2003 eine MS-Query erstelle mit 55.000 DS und als Olap-Cube abgespeichert. So was scheint es ab E_2007 nicht mehr zu geben.
Daraus dann eine Pivottabelle erstellt und per Vba aktualisiert. In der Statusleiste erscheint
folgende Meldung:
Excel 2003: Olap aktualisieren... (ESC drücken um Vorgang abzubrechen)
Excel 2010: Daten werden gelesen (ESC drücken, um Vorgang abzubrechen):
Excel 2013: DATEN WERDEN GELESEN (ESC DRÜCKEN, UM VORGANG ABZUBRECHEN):
Aber eine Meldung "#DATEN_ABRUFEN…", wie von M$ proklamiert, erscheint in keiner der 3 Excelversionen in der 1. Zelle der Pivottabelle. Damit hat natürlich die Formel: =WENN(FEHLER.TYP(A1)=8;8;0) überhaupt keinen wert und kann nicht als Schleifenabbruch genutzt werden - und die Endloschleife ist vorprogrammiert. Ich forsche mal weiter...
Gruß von Luschi
aus iklein-Paris

Anzeige
Außerdem sollte man schon eine ordentliche ...
08.04.2015 18:40:24
Luc:-?
…FehlerBehandlung in eine (Function-)Procedure einbauen, Hendrik;
On Error Resume Next kann dabei durchaus mal sinnvoll sein, niemals aber On Error GoTo 0, außer zu temporären TestZwecken!
Gruß, Luc :-?

AW: Außerdem sollte man schon eine ordentliche ...
08.04.2015 18:57:25
Daniel
Die Fehlerbehandlungsroutine ist hier doch nur drin, damit das Blatt nur dann eingefügt wenn es noch nicht vorhanden ist!
Danach wird das OnError ja sofort wieder deaktiviert.
Solange sich das Makro noch in der Entwicklungs- oder Testphase befindet, sind ErrorHändler sowieso meisten kontraproduktiv.
Ohne Errorhändler stoppt das makro in der Fehlerverursachenden Zeile und man kann sofort die verwendeten Variablen und Zellwerte überprüfen und erhält so die Informationen, die für eine Ursachenfindung wichtig sein können.
Ein Errorhändler würde diese Informationen vernichten.
Einen Errorhändler kann man einbauen, wenn das Makro fertig getestet ist und fehlerfrei läuft.
Gruß Daniel

Du argumentierst scharf an der Sache vorbei, ...
08.04.2015 19:15:31
Luc:-?
…Daniel,
denn du kannst davon ausgehen, dass meine F-Behandlungen, auch, wenn sie von Anfang an vorhanden sind, richtig verwendet wdn und die jeweils gewünschte Info liefern und nicht vernichten. Bei in ZellFmln verwendeten UDFs schließt das uU Xl-FehlerWerte ein. :-]
Wird dagegen ein On Error GoTo 0 mal vergessen, landet der wahrscheinlich VBA-unkundige Nutzer plötzlich im VBE oder, falls das Projekt geschützt ist, erhält kryptische FehlerMeldungen, mit denen er nichts anfangen kann.
TestZwecke hatte ich bereits erwähnt…
Gruß, Luc :-?

AW: Du argumentierst scharf an der Sache vorbei, ...
08.04.2015 19:26:45
Daniel
Hi
wie lieferst du denn in einer Fehlerbehandlung die Zeile mit, in der der Fehler auftritt?
Gruß Daniel

AW: Du argumentierst scharf an der Sache vorbei, ...
08.04.2015 20:56:26
Daniel
ah, ok. Danke
für den Eigenbedarf zu aufwendig.
Gruß Daniel

AW: Außerdem sollte man schon eine ordentliche ...
08.04.2015 19:01:01
Markus
Hallo Luc
Mit On Error Goto 0 wird eine aktivierte Fehlebehandlung wieder deaktiviert.
In diesem Fall wird damit das On Error Resume Next wieder deaktiviert, d.h. nach On Error Goto 0 werden Laufzeitfehler wieder erzeugt, wie wenn keine Fehlerbehandlung eingebaut ist.
Besser wäre sicher ein On Error Goto Fehlerbehandlung, doch das von dir empfohlene Weglassen von On Error Goto 0 ist die schlechteste Lösung, da sonst On Error Resume Next bis zum Prozedurende aktiviert wäre.
Gruss Markus

Na, was beginnt in meinem, von dir übernommenen...
08.04.2015 19:24:05
dir
…Betreff, Markus?
Richtig, die Forderung einer ordentlichen FehlerBehandlung! Da steht also nichts von Weglassen! Was hier dann bei Fehlern passiert, sehe ich! Und dass das für TestZwecke sinnvoll sein kann, hatte ich angedeutet.
Ich weiß ja nicht, ob dir deine Lehrtätigkeit viel Zeit für „Forschung in der Grauzone“ zwischen VBA und Xl, sprich Einsatz von UDFs in ZellFmln, lässt… ;-)
Gruß, Luc :-?

AW: Na, was beginnt in meinem, von dir übernommenen...
08.04.2015 21:22:52
dir
Hallo Luc
Ups, deinen Betreff hatte ich wirklich übersehen, Sorry.
Dank deiner höflichen Art möchte ich mich zum Thema auch nicht weiter äussern. Doch damit hast du mir die Augen geöffnet. Ich werde am morgigen unterrichtsfreien Tag das schöne Wetter auf dem herrlichen Vierwaldstättersee geniessen (http://www.lakelucerne.ch), und mich nicht mehr in deinen Graubereich einmischen (ich hoffe, dass du da etwas neidisch wirst).
Gruss Markus

Nee, ich war Ostern 2 Tage unterwegs, ...
09.04.2015 05:14:59
Luc:-?
…erst auf Burg Rabenstein inkl Wanderung und nächsten Tag am Scharmützelsee, Markus;
klingt preußisch und ist es auch… ;-)
Außerdem habe ich jeden Tag „frei“. Na, neidisch… ;-)
Was ein Smilie ist, weißt du aber schon…?
Das ist übrigens nicht meine Grauzone, sondern einfach nur eine, in der anscheinend die geringste „Verkehrsdichte“ herrscht…
Gruß aus D.BB.TF.BM, Luc :-?

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige