Supportnet Computer
Planet of Tech

Supportnet / Forum / Tabellenkalkulation

Public-Variable von userform an Excel funktioniert nicht?





Frage

Hallo und frohes und gesundes neues Jahr. Nun hab ich auch mal ein Problem, bin mal gespannt, ob die Excelspezialisten das lösen können. Irgendwie harmoniert Excel nicht mit seinem VBA. Habe eine Userform (Startformular, das von VB6 aus geöffnet wird und als Menü gelten soll) und dort mit [code]Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) If CloseMode = vbFormControlMenu Then MsgBox "Bitte mit dem Button 'Ende' schließen!" Cancel = True End If End Sub[/code] das Schließen mit dem Kreuzle verhindert. Habe eine Public Variable (boolean) namens bolSchliessen und einen Ende Button [code]Private Sub cboEnde_Click() Application.DisplayAlerts = False 'Warnmeldung ausschalten Unload frmStart bolSchliessen = True Application.Quit End Sub[/code] Klappt alles wunderbar, nur Excel ist noch auf und soll natürlich auch nicht mit dem Kreuzle geschlossen werden und keinesfalls gespeichert werden beim Schließen. Also hab ich in "diese Arbeitsmappe" den Code [code]Private Sub Workbook_BeforeClose(Cancel As Boolean) If bolSchliessen = False Then MsgBox "Bitte mit dem Button 'Programm beenden' schließen!" Cancel = True End If End Sub[/code] und dort auch einen Programm beenden Button mit dem Code: [code]Private Sub BtnBeenden_Click() Application.DisplayAlerts = False 'Warnmeldung ausschalten bolSchliessen = True Application.Quit End Sub[/code] Nun gibt mir das userform die Public-Variable bolSchliessen = True nicht weiter und wenn ich mit dem Button auf dem Userform das Programm beenden will, dann geht nur noch der Affengriff mit der Meldung "Bitte mit dem Button 'Programm beenden' schließen!". Das kann doch nicht sein, dass ich das nicht gebacken kriege eine Public-Variable an Excel zu übergeben? Sitz ich jetzt auf der Leitung oder is Excel tatsächlich so bescheuert? Gruß Marie

Antwort 1 von aiuto

Hallo Marie,

Du schreibst
Zitat:
Irgendwie harmoniert Excel nicht mit seinem VBA. Habe eine Userform (Startformular, das von VB6 aus geöffnet wird und als Menü gelten soll)
wo wird denn die Variable bolSchliessen deklariert und in welcher Umgebung läuft die Userform?

Alles Gute im neuen Jahr
vom Helfer

Antwort 2 von coros

Hallo Marie,

zuerst einmal verstehe ich nicht so recht, warum Du die Exceldatei nicht direkt aus Deinem VB6-Formular schließt. Mit den Befehlen

xlWB.Close SaveChanges:=False
xlAppl.Application.Quit

wird das Workbook ohne zu speichern ausDeinem VB6-Formular geschlossen und Excel beendet. "xlWB" und" xlAppl" müssen in VB6 beides male als "Object" deklariert werden. Dann bräuchtest Du keinen Button in Excel zum separaten Schließen.

Wenn das aber so sein soll, wäre interessant zu wissen, wo Du in Excel die Variable deklarierst. Eventuell in der UserForm? Wenn ja, deklariere die Variable in einem Modul, da der Zusatnd beim Schließen der UserForm verloren geht. Bei einem Modul bleibt der Zustand über das Schließen der UserForm erhalten.

Mal eine ganz andere Variante, die Du in Excel einbauen könntest. kopiere nachfolgende Code in ein StandardModul.

Option Explicit
Option Base 1
Option Private Module

Public Const GWL_STYLE = (-16)
Public Const WS_SYSMENU = &H80000

Public newClas As New clsApp_1

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long
'####################################################################################################################

Public Sub Schließenkreuz_einblenden()
    Dim xl_hwnd, lStyle
    xl_hwnd = FindWindow("xlMain", vbNullString)
    If xl_hwnd <> 0 Then
        lStyle = GetWindowLong(xl_hwnd, GWL_STYLE)
        lStyle = SetWindowLong(xl_hwnd, GWL_STYLE, lStyle Or WS_SYSMENU)
        DrawMenuBar xl_hwnd
    End If
End Sub
'####################################################################################################################

Public Sub Schließenkreuz_ausblenden()
    Dim xl_hwnd, lStyle
    xl_hwnd = FindWindow("xlMain", vbNullString)
    If xl_hwnd <> 0 Then
        lStyle = GetWindowLong(xl_hwnd, GWL_STYLE)
        lStyle = SetWindowLong(xl_hwnd, GWL_STYLE, lStyle And Not WS_SYSMENU)
        DrawMenuBar xl_hwnd
    End If
End Sub
'####################################################################################################################

Sub procControlEnableDisable(intId As Integer, _
bolStatus As Boolean)

Dim cmbSuche As CommandBar
Dim cmbcSteuerelement As CommandBarControl
For Each cmbSuche In Application.CommandBars
Set cmbcSteuerelement = _
cmbSuche.FindControl(ID:=intId, recursive:=True)

If Not cmbcSteuerelement Is Nothing Then
cmbcSteuerelement.Enabled = bolStatus
End If
Next

End Sub

Nachfolgenden Code kopierst Du in ein Klassenmodul:

Option Explicit

Public WithEvents App As Application

Private Sub App_WorkbookOpen(ByVal Wb As Workbook)
Dim myApplication As Object, strWorkbooksNamePfad
If Wb.FullName <> ThisWorkbook.FullName Then
Set myApplication = New Excel.Application
strWorkbooksNamePfad = Wb.FullName
Workbooks(Wb.Name).Close False
myApplication.Workbooks.Open (strWorkbooksNamePfad)
myApplication.Visible = True
Set myApplication = Nothing
End If
End Sub

Wenn Du nun das Makro "Schließenkreuz_ausblenden" wird Dir in Excel oben rechts die Taskbar ausgeblendet und es kann niemand über das Kreuz, da nicht mehr vorhanden, Excel schließen.

Wäre das eventuell eine Variante für Dich? Ich benutze das sehr häufig, damit der Benutzer nur über von mir vorgegebene Wege die Datei beenden kann.

MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du
ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 3 von Marie

Also ihr beiden, erstmal hunderttausend Dank.

Noch funktioniert es nicht, ich bekomme Fehler beim Kompilieren: benutzerdefinierter Typ nicht definiert bei "newClas As New clsApp_1" wenn ich Call Schließenkreuz_ausblenden in Workbook open reinsetze (sollte vermutlich dazusagen, dass ich in Office 97 programmiere). Der Rest ist doch eine Api, die müsste ja überall laufen?

Die Publics habe ich in einem normalen Modul, bin ich halt so gewohnt, normal programmiere ich in VB6 und Access, bei beiden funktioniert das so. In Excel kenne ich mich nun gar nicht aus, wäre also super wenn ihr mir sagen könntet wo die Publics erhalten bleiben, habe nämlich derer noch mehrere und die funktionieren leider auch nicht. Zum Beispiel Datenpfad und Programmpfad brauche ich normalerweise als publics, im Moment lese ich beides jedesmal neu ein.

Hi Oliver, es ist folgendes. Habe ein umfangreiches Programm, VB6 ist nur die Menüführung, Einrichten und so weiter, der Kunde arbeitet dann normalerweise in Access weiter und mit Word-Seriendruck, ebenfalls von Access aus gesteuert.

Nun wollte der Kunde noch ein Rechnungsprogramm. Da ich ein sehr gutes habe, was mir Mark mal in Excel geschrieben hat, haben wir nun versucht das einzubinden. Es lief fast alles wunderbar bis auf die Publics. Dann habe ich es von VB aus gestartet, da lief vieles beim Öffnen nicht mehr, was ich in Workbook open hatte. Deshalb habe ich diese Userform als Startformular eingerichtet, damit das Programm nicht in vb kleben bleibt, denn alles andere wird in mehreren Exceldateien ausgeführt.

Was ich übrigens auch nicht hinbekomme ist das Leeren von Kombifeldern. Wenn ein Kunde ausgewählt wurde hätte ich ganz gerne wieder ein weißes leeres Feld in der Ansicht aber 'Me.CboKunden.Clear" gibt Fehler und 'Me.CboKunden.Value = "" geht auch nicht. Jetzt habe ich Buttons danebengemacht und blende die Kombifelder aus nach der Kundenwahl. Beim nächsten Start von Excel in drei Tagen steht der alte Name immer noch drin, wenn ich das wieder einblende. :-(( Bin halt doch ein Excellaie, ich glaub das kapier ich nie, warum Excel mir nicht gehorchen will :-).

Gruß Marie

Antwort 4 von Marie

Da der zweite Code bei mir mal wieder in einer Zeile eingelesen war, dachte ich ich hätte vielleicht einen Fehler beim Zeilenumbruch gemacht, hab dann nochmal denselben Code ber herber.de gefunden, da steht nur

Public newClas As New clsApp

ohne _1,

ansonsten scheint es exakt derselbe Code zu sein, dachte dann dass es vielleicht Class mit zwei s heissen muss, aber es bleibt derselbe Fehler. Keine Ahnung, geht leider nicht bei mir. :-((

Nochmal Gruß Marie

Antwort 5 von coros

Hallo Marie,

sorry, dass ich erst jetzt wieder reagiere, hatte aber vorher keine Zeit.

Zu dem Problem mit dem Klassenmodul kann ich leider nicht viel sagen, da ich nirgends mehr Excel97 installiert habe und das daher unter XLS97 nicht testen kann. Ich muss mal schauen, ob ich das irgendwie in einem Virtuellen PC installiert bekomme und versuche es dann mal.
Eine Frage noch dazu: Hast Du dem Klassenmodul den Namen "clsApp_1" vergeben? Wenn nicht, hole dies bitte nach. Klicke doppelt auf das Klassenmodul und schreibe in den Klasseneigenschaften (Taste F4 zum Einblenden) in der Zeile "Name" den Namen "clsApp_1". Ich vermute mal, dass dort bei Dir "Klasse1" steht. Zu Deiner Anmerkung bezüglich des Namens der Klasse: Wie die Klasse benannt wird ist eigentlich egal. Wichtig ist nur, dass in dem Makro, in dem die Klasse Anwendung findet, der richtige Klassenname aufgeführt wird. Das bedeutet, in dem Makro muss in der Zeile

Public newClas As New clsApp_1

der richtige Klassennname, hier clsApp_1, aufgeführt werden.

Wie man Variablen von Visual Basic nach Excel bekommt, kann ich leider nicht sagen, da ich mich damit noch nicht ausgiebig beschäftigt habe. Ich ändere aus Visual Basic immer nur Werte usw. Aber auch dafür hätte ich eine Alternative. Schreibe die Variablenwerte in Visual Basic einfach in die Registry und lese diese Werte in Excel dann wieder aus. Hier mal ein Beispiel:

Vorher noch die Anmerkung, für nachfolgendes Beispiel muss in VB6 und in Excel der Verweis "Windows Script Host Object Model" aktiviert sein.

In Visal Basic schreibst Du einen oder auch mehrer Wert(e) in die Registry.

Option Explicit

Dim Reg As New IWshShell_Class

Sub Schreiben()
Reg.RegWrite "HKCU\Software\IMF\Programm\No.1", Dein Variablenwert
End Sub



In Excel ließt Du den Wert dann wieder aus.

Option Explicit

Dim Reg As New IWshShell_Class

Sub Lesen()
Variable_Excel = Reg.RegRead("HKCU\Software\IMF\Programm\No.1")
End Sub


Somit hast Du die Wert auch in Excel. Nur mal so eine Idee.

Zu Deiner Frage zum leeren der Kombinationsfelder. Mit den Befehlen leerst Du das komplette Kombifeld, als die Werte, die in der Auswahl aufgeführt wurden, nicht aber den angezeigten Namen. Der Befehl zum leeren des Anzeigefeldes nim den Befehl

Me.CboKunden.Text = ""

Ich hoffe, Du kommst klar.

MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du
ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 6 von Marie

Hallo Oliver

erstmal tausend Dank für Deine Mühe und nein, um Gottes willen, Du brauchst Dir kein Office 97 aufzuspielen. In den Fällen, wo das eine Rolle spielt, krieg ich das schon raus.

Klar, war der Name falsch - ich Dussel -, läuft prima. Und ich habe schon vorher ein Tool gefunden, was mir auch in der userform den Schließen-Button ausblendet und diese auf Vollbild umschaltet, nun kann ich die Public-Variable ganz entfernen.

Ach ich liebe Apis, die kannste hinknallen wo Du willst, die laufen einfach überall. Hätte mich jetzt auch gewundert, wenn das nicht gegangen wäre.

Und nein, in die Registry schreiben während der Laufzeit, das kann und will ich nicht. Haste das schonmal mit Windows Vista probiert? Denke das geht da gar nicht mehr. Da würde ich mir eher Properties schreiben, oder geht das nicht in Excel? Ist aber kein Problem, ich habe bei allen meinen Programmen ini-Dateien, da kann ich ständig drin rumschreiben und wieder auslesen, is nur lästig.

Me.CboKunden.Text = "" ist wohl der richtige Befehl, denn die Zeile wird geleert, aber entweder schreibe ich das an die falsche Stelle oder.. hab es schon mit on error resume next probiert, aber ich bekomme dann anschließend die Meldung "Eigenschaft Column konnte nicht abgerufen werden" Fehler 381 in cboKunden_Change, auch wenn ich das Me.CboKunden.Text = "" in lost focus schreibe, da müsste doch change abgearbeitet sein???
Im übrigen habe ich bei Excel böse Probleme überhaupt die ganzen Möglichkeiten zu finden, gibt es da keine Liste welche Ereignisse es gibt?

Trotzdem tausend Dank erstmal, das mit dem Schließen klappt ja jetzt mal wunderbar.

Gruß Marie

Antwort 7 von coros

Hallo Marie,

zur Info, auch unter Windows Vista kann man in die Registry schreiben. Wenn das nicht ginge, gäbe es keine Registry mehr. Ich mache das ständig, dass ich für mich relevante Dinge, wie z.B. Einstellungen eines Programms in einen Pfad in die Registry schreibe. Auch unter Windows Vista.

Zu Deiner Fehlermeldung beim Leeren der ComboBox: Durch das Leeren löst Du ein Change-Ereignis in der ComboBox aus. Nun weiß ich nicht, was in diesem Ereignis bei Deinem Code steht. Sicher ist nur, dass durch das Change-Ereignis bei Dir ein weiterer Code abgearbeitet wird, dem nun Zustände oder Infos durch das leere ComboBox-Textfeld fehlen. Lösung wäre, Du fängst das durch eine If-Abfrage in dem Change-Ereignis der ComboBox ab. Entweder durch eine Variable, die Du als Boolean-Variable deklarierst oder durch eine Abfrage, ob das Textfeld nicht leer ist.

Lösung mit Abfrage ob Textfeld nicht leer ist:

Private Sub ComboBox1_Change()
If ComboBox1.Text <> "" Then
'Hier dann Dein weiterer Code
End If
End Sub

Lösung mit einer Variablen:

Public Sperre As Boolean

Private Sub CommandButton1_Click()
Sperre = True
ComboBox1.Text = ""
Sperre = False
End Sub

Private Sub ComboBox1_Change()
If Sperre = False Then
'Hier dann Dein weiterer Code
End If
End Sub

Somit wird wenn das ComboBox-Textfeld geleert wird, das Change-Ereignis zwar immer noch angestoßen, aber der Code darin nicht mehr abgearbeitet.

Bei Fragen einfach wieder melden. Danke auch für Deine Bewertung.

MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du
ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 8 von Marie_ohne_Keks

Hi Oliver,

nochmal tausend Dank und sorry, dass ich mich nicht früher gemeldet habe, hab jetzt 5 Sachen gleichzeitig geändert und tausend Fehler bekommen. Bin am Verzweifeln mit dem Excel, weil ich nicht weiss wann welches Ereignis ausgelöst wird und auch nirgendwo eine Übersicht gefunden habe. :-(

Versteh auch nicht wieso ich mich zu früh gefreut habe, denn das Excelkreuz ist zwar weg, aber nicht das "Datei Schließen - Kreuz", das heisst mein Problem ist noch nicht wirklich gelöst.

Aber Deine 50 Bonuspunkte haste Dir trotzdem verdient, zumindest mit der letzten Antwort, die funktioniert prima.

Keine so gute Idee ist das hier:
Private Sub ComboBox1_Change()
If ComboBox1.Text <> "" Then
'Hier dann Dein weiterer Code
End If
End Sub


da beisst sich nämlich die Katze in den *Z*. Ich hab tausend Möglichkeiten probiert (bissel übertrieben), mit error resume next und alles mögliche, bin immer wieder in den Code gelaufen, sogar wenn ich das Leeren an das Ende des Codes selbst geschrieben habe läuft immer wieder in die if-Schleife und will den Code abarbeiten und bringt Fehler 381. Denn leider ist zu dem Zeitpunkt das Leeren offensichtlich noch nicht abgeschlossen, also If ComboBox1.Text <> "" bringt absolut nichts, weil sie immer ungleich leer ist.

Und natürlich kann ich auf meinem Rechner in die Registry schreiben wann ich will, aber nicht bei meinen Kunden. Die dürfen allesamt nicht als Admins den Rechner starten, da kann ich nur beim Installieren in die Registry schreiben, danach nicht mehr.

Gruß und nochmal danke

Marie

Antwort 9 von coros

Hallo Marie,

das mit dem Kreuz ist komisch. Denn mein Code aus AW2 blendet nicht das Kreuz einer Excelmappe aus, sondern die Toolbar oben rechts (Schaltfläche Minimieren, Maximieren und Schließen). Hast Du den Aufruf des Makros "Schließenkreuz_ausblenden" in das Workbook_Open-Ereignis der Datei gepackt, so dass das Makro beim Öffnen der Datei asugeführt wird? Weitere Spekulationen bringen nicht mehr viel, man müsste nun Deine Datei vor sich haben, um zu schauen, warum das nicht funktioniert. Ich kann Dir nur den Vorschlag machen, dass Du mir die Datei mal zusendest und ich schaue, warum das nicht funktioniert und ob Du eventuell einen Fehler gemacht hast. Meine E-Mailadresse findest Du überall auf meiner HP u.a. im Impressum. Binde in der Betreffzeile irgendwie das Wort "Supportnet" und den Namen (Nickname), unter dem Du hier gepostet hast mit ein, da ich alle Mails deren Absender ich nicht kenne, ungelesen lösche. Ist nur ein Angebot. Um Diskretion bezüglich Deiner Daten musst Du Dir keine Sorgen machen. Wenn ich nicht Diskret wäre, hätte ich schon lange keine Kunden mehr und auch nicht täglich zig Hilfeanfragen.

Zu Deiner Aussage

Zitat:
Keine so gute Idee ist das hier:

Private Sub ComboBox1_Change()
If ComboBox1.Text <> "" Then
'Hier dann Dein weiterer Code
End If
End Sub

Das dieser Weg bei Dir nicht funktioniert, liegt an all Deinen VBA-Codes in Deiner UserForm, die ich nicht kenne. Es handelte sich nur um ein Beispiel. Ob das bei Dir funktioniert musstest Du selber herausfinden. Man kann aber nicht pauschal sagen, dass das nichts bringt, da es bei jemandem anderen schon etwas bringen kann.

Übrigends, danke dass Du findest, dass ich mir die 50 Bonuspunkte verdient habe, aber ich antworte hier nicht um Bonuspunkte zu sammeln, sondern weil mir dieses Forum auch schon die ein oder andere Frage beantwortet hat und ich mich daher verbunden fühle das gleiche zu tun.

MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du
ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 10 von Marie

Hallo Oliver, ich glaube wir reden aneinander vorbei:
Ich schrieb:
Zitat:
Versteh auch nicht wieso ich mich zu früh gefreut habe, denn das Excelkreuz ist zwar weg, aber nicht das "Datei Schließen - Kreuz", das heisst mein Problem ist noch nicht wirklich gelöst.

Und Du hast geantwortet:
Zitat:
mein Code aus AW2 blendet nicht das Kreuz einer Excelmappe aus, sondern die Toolbar oben rechts (Schaltfläche Minimieren, Maximieren und Schließen).


Ich denke mal es tut bei uns beiden dasselbe? Du kannst Excel nicht mehr schließen über das Kreuz, aber sehr wohl die Datei, die ja gerade nicht geschlossen werden darf, weil er sie nicht abspeichern können soll.

Deshalb ist mein Problem nach wie vor dasselbe: Wenn ich mit einer Public verhindere, dass über das Kreuz geschlossen wird, dann läßt sich excel nicht mehr über meine Userform schließen, weil die Variable nicht übergeben wird.

Dir meinen Code schicken ist deshalb nicht möglich, weil ich meine Probleme nur habe, wenn ich die Datei über die VB-Maske starte und die läuft nicht, wenn das Ganze nicht installiert ist. Ferner hast Du auch die Runtime von Office 97 nicht. Mein Programm läuft auf allen Rechnern und auf allen Systemen, wird aber von VB aus über die Runtime von A97 gestartet, deshalb ist die vb.exe nicht als Menü abzuschaffen. Du könntest das demnach nur testen, wenn ich Dir das gesamte Setup einschließlich aller Datenbanken schicke, denn beim Einrichten wird abgefragt ob alle Dateien vorhanden sind.

Gruß Marie

Antwort 11 von coros

Hallo Marie,

jetzt habe auch ich es gerafft. Die Leiste, die dieses Kreuz beinhaltet kannst Du auch ausblenden. Der Befehl lautet

Application.CommandBars("Worksheet Menu Bar").Enabled = False

Du kannst auch alle Symbolleisten ausblenden. Das machst Du mit

Dim Menue As CommandBar
On Error Resume Next
For Each Menue In Application.CommandBars
Menue.Enabled = False
Next
On Error GoTo 0

Eventuell hilft es Dir bei Deinem Problem weiter. Bei Fragen wieder melden. Wir werden das schon ans Laufen kriegen.

MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du
ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 12 von aiuto

@Marie, also jetzt mal langsam, für die Hörer vom Landfunk:
Zitat:
Wenn ich mit einer Public verhindere,
was verstehst Du denn unter einer Public?
Zitat:
In Excel kenne ich mich nun gar nicht aus, wäre also super wenn ihr mir sagen könntet wo die Publics erhalten bleiben, habe nämlich derer noch mehrere und die funktionieren leider auch nicht. Zum Beispiel Datenpfad und Programmpfad brauche ich normalerweise als publics, im Moment lese ich beides jedesmal neu ein.
Ich sehe das als Dein eigentliches Problem.

mfg
vom Helfer

Antwort 13 von Marie

@coros: Na das wars doch, tausend Dank, jetzt sind alle Kreuze weg, das von Excel, das vom Workbook und das von der userform. Super, danke.
Zum Laufen hab ich es schon vorher bekommen, faule Tricks fallen mir da immer ein. Dein
Sperre = True
blabla
Sperre = False

hat mich auf die Idee gebracht die userform genauso auszutricksen, hatte eine Function 'beenden' geschrieben und beim Klick auf den Ende Button der userform diese geschlossen und dann die Function aufgerufen, dann ging es. Aber das hier ist mir ja tausendmal lieber.

Das Dinge sollte eigentlich schon zum 1. Januar fertig sein. Hab es nicht hingekriegt, dass es läuft, wenn es von VB aus aufgerufen wird. Hatte immer beim ersten Start mit allen Funktionen, wo ich ein zweites Workbook aufrufen musste, dasselbe Problem, keine Ahnung wieso. Lass ich das Teil ohne vb laufen hat alles funktioniert, mit vb wird beim ersten Durchgang keine andere Datei geöffnet. Mit unendlich vielen Tricks hab ich rausgekriegt, dass es daran liegt, dass das Workbook öffnen nicht klappt beim ersten Start. Sehen kann ich das ja nicht, weil im Testmodus ja alles problemlos läuft.

Ist das Workbook ein einziges Mal angezeigt gewesen, dann läuft alles wunderbar. Nun hab ich aufgegeben, hab die userform rausgeworfen aus dem Start und auch das Einlesen von Daten in Workbook open. Ist zwar jetzt nicht so toll, aber ich kriegs einfach nicht anders hin. Falls Du da noch eine Idee hättest würde ich das schon nochmal nachträglich ändern, aber mach Dir keine großen Umstände, es läuft ja (halt eben nur nicht so wie ich es gerne hätte, dass beim Start des Rechnungsblattes sofort die neue Rechnungsnummer aus einem externen Workbook eingelesen wird.)

Ich vermute mal ich müsste kurz das geladene Workbook aktivieren, damit der vb-Code und/oder der Workbook open Code abgearbeitet ist. Und offensichtlich ist er das auch dann nicht, wenn das userform offen ist.

Hab sogar mit einem Hilfsuserform probiert um nicht aus Workbook open zu öffnen, dort einen Button drauf um das eigentliche userform zu öffnen, dasselbe Problem. Jeder Button funktioniert nicht hinter dem ein zweites Workbook geöffnet werden muss zum Auslesen von Daten, bevor das aktuelle Workbook nicht einmal im Vordergrund angezeigt war.

Klicke ich auf den einzigen Button, der nur das aktuelle Workbook anzeigt, dann kann ich danach alles fehlerlos starten. Öffne ich Excel nicht mit meiner vb.exe klappt es sofort, also kann wohl leider auch keiner von Euch mein Problem nachvollziehen. :-(

Na egal, ich dank Dir in jedem Fall vielmals für Deine Mühe.

Lieber Gruß

Marie

@ aiuto:
Zitat:
Wenn ich mit einer Public verhindere, ..........weil die Variable nicht übergeben wird.


Kennste keine Public Variablen? Die kannste vom ganzen Programm aus jederzeit von überall her aufrufen, ihren Wert ändern so oft Du willst und halt ohne jede Verrenkung darauf zugreifen. Leider aber offensichtlich nicht in userformen :-(

Zitat:
Ich sehe das als Dein eigentliches Problem.
Klar ist das mein Problem, sonst müsste ich nichts fragen. Was hilft mir das aber, dass Du das jetzt feststellst??

Antwort 14 von coros

Hallo Marie,

wenn es Dir darum geht, einen Wert aus einer anderen Datei zu erhalten, musst Du die Datei nicht unbedingt öffnen. Mit

Range("A1") = ExecuteExcel4Macro("'C:\[Dateiname.xls]Blattname'!R1C1")

wird Dir der Wert aus einer geschlossenen Exceldatei, Zelle A1, in Deine Datei ebenfalls in Zelle A1 eingetragen. Wenn Du das beim Öffnen oder Aktivieren von einem Ereignis ausführst (z.B. edem Workbook_Open-Ereignis), solltest Du die Daten einlesen können ohne die Datei öffnen zu müssen. Wobei ich nicht ganz verstehe, warum bei Dir eine 2. Datei nicht geöffnet wird. Allerdings wird auch nicht ganz klar, ob Du beide Dateien über die Exe-Datei öffnen möchtest. Ich öffne meine Excelprogramme auch über eine Exe-Datei. Allerdings öffne ich im Hintergrund nur eine Exceldatei, quasie die Masterdatei, und über die werden durch das Workbook_Open-Ereignis dann alle weiteren Excel- bzw. CSV-Dateien, die zum Teil als Datenbank dienen, geöffnet. Das sollte auch bei Dir funktionieren.

Eventuell hilft es Dir ja.

MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du
ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 15 von aiuto

@Marie
hab das extra nochmal ausprobiert - eine in einem (Excel)Modul als Public deklarierte Variable ist auch in einer (Excel)Userform vorhanden und veränderbar - zumindest im gleichen Projekt und unter Excel2000.
Es sei denn Du hast 'Option Private Module' gesetzt.
Ob das in Excel'97 genauso ist kann ich nicht nachvollziehen.

mfg
vom Helfer

Antwort 16 von Marie

Hi Oliver, danke, nützt mir aber nichts, der Benutzer muss sogar in dem Arbeitsblatt arbeiten können. Ich öffne nur die Programmdatei aus der Vb.exe, aber solange ich nicht einmal die Prozedur abgeschlossen habe, dass eine Tabelle angezeigt wird, krieg ich es nicht hin, dass meine Funktionen laufen, die eine andere Excel-Datei aufrufen, egal ob in Workbook open oder in der Userform. Die userform hab ich deshalb angelegt, weil ich glaubte das liegt daran, dass workbook open abgearbeitet sein muss. Keine Ahnung. In jedem Fall brauche ich nur einmal die Tabelle im aktiven Workbook zu öffnen, dann läuft alles wunderbar, nur halt eben beim ersten Start nicht. Schon komisch. Das mach ich genauso wie Du, das andere sind meine "Daten", die auf dem Server im Netzwerk liegen und von mehreren Rechnern erreichbar sein müssen.

@aiuto: Kann gut sein, dass das nur in 97 noch nicht geht, is nämlich eh verwunderlich. Aber mir ist gerade eingefallen, dass es damals hieß, dass Excel und Word noch nicht so recht mit VBA umgehen können wie Access. Könnte sein, dass das so eine Stelle ist. In jedem Fall kennt meine userform die Public-Variable leider nicht, sonst hätt ich ja keine Probleme.

Dank Euch beiden

gruß Marie

Antwort 17 von Marie

Hallo nochmal Oliver,

ich denke das ist genau mein Problem, dass ich kein Ereignis weiss, bei dem das aktive Workbook bereits angezeigt ist. An der Stelle müssen meine sämtlichen Probleme liegen, dass ich meine Funktionen zu früh laufen lasse.

Habe nämlich jetzt folgendes probiert:
Private Sub CommandButton1_Click()
If Application.CommandBars("Worksheet Menu Bar").Enabled = True Then
    Application.CommandBars("Worksheet Menu Bar").Enabled = False
Else
    Application.CommandBars("Worksheet Menu Bar").Enabled = True
End If
End Sub


mit einem Button klappt das wunderbar. Ich muss das Kreuzle an einer Stelle wieder einblenden, klappt wunderbar. Es müsste aber dann wieder ausgeblendet werden, sobald mein aktives Workbook aktiviert wird und das klappt eben nicht, weil ich keinen blassen Schimmer habe in welches Ereignis ich das schreiben müsste.

Ich hab es in "diese Arbeitsmappe" in Private Sub Workbook_Activate() geschrieben und eine msgbox zum testen dazu. Das Ereignis findet genau dann statt (sprich die msgbox wird genau dann angezeigt), wenn die Leiste wieder eingeblendet werden müsste, aber sie wird nicht eingeblendet.

Vermutlich basieren meine sämtlichen Probleme an exakt dieser Stelle. Deshalb nochmal meine Frage nach den Ereignissen: Welches Ereignis tritt "nach" dem Moment in Kraft, wenn das Workbook offen und bereits fertig angezeigt ist?

Gruß Marie