2012-04-09 19 views
1

Ich erstelle eine Excel-Anwendung, die ein Benutzerformular öffnet, wenn der Benutzer zu einem bestimmten Blatt geht. Wenn der Benutzer auf dieses Blatt klickt, wird das Formular angezeigt. Ich möchte jedoch nicht, dass Benutzer sehen können, was sich auf dem Blatt befindet. Ich will nur, dass es sich ohne Verzögerung öffnet oder schon in diesem Blatt geladen ist. Gibt es eine Möglichkeit, dies zu tun?Excel VBA Formular Verzögerung

Danke.

+1

Wenn Sie Sie sagen Sie den Benutzer nicht, dass die Daten auf dem Blatt zu sehen, meinen Sie die Daten aus dem Formular auf dem Blatt ist? Wenn ja, warum nicht ein Blatt machen, nur um das Formular zu öffnen? –

+1

Wenn Sie nicht möchten, dass der Benutzer sieht, was sich in dem Arbeitsblatt befindet, warum müssen die Benutzer dann auf dieses Arbeitsblatt klicken, um das Formular zu öffnen? Können Sie einen anderen Mechanismus zum Öffnen des Formulars verwenden? Ein Knopf auf einem anderen Blatt, vielleicht? –

+0

Gut kann ich die Daten des Blattes nicht ändern, weil die Zellen im Rest der Anwendung abhängig sind. Da die Leute es gewohnt sind, auf diese Registerkarte zu gehen, ist es für sie schön, auf diese Registerkarte zu klicken und von dort aus zu gehen. Irgendwie eine lange Geschichte ... Gibt es überhaupt etwas, um das Verhalten zu ändern, wenn ein Benutzer auf einen Tab am unteren Rand des Blattes klickt? Anstatt das Blatt zu öffnen, öffnet es das Formular? – thebiglebowski11

Antwort

2

Das Folgende ist so nah wie möglich zu dem, was Sie suchen.

Ich habe ein Formular mit dem Standardnamen UserForm1 erstellt. Ich habe den folgenden Code in ThisWorkbook aufgenommen.

Wenn der Benutzer auf die Registerkarte "Sheet2" klickt, lädt der Code UserForm1, maximiert es und zeigt es an. Wenn das Formular beendet wird, wechselt der Code zu "Sheet3".

Dies entspricht nicht genau Ihrer Spezifikation, da Sie "Sheet2" für einen Bruchteil einer Sekunde sehen können, bevor das Formular angezeigt wird. Ich habe versucht, das Formular vorab zu laden. Ich habe versucht, die Bildschirmaktualisierung in der Ereignisroutine SheetDeactivate auszuschalten und nicht wieder einzuschalten, bis ich die SheetActivate-Ereignisroutine beendet habe. Aber nichts, was ich versucht habe, verhindert diesen kurzen Blitz.

Versuchen Sie diesen Code und entscheiden Sie, dass es gut genug ist.

Private Sub Workbook_SheetActivate(ByVal Sh As Object) 

    If Sh.Name = "Sheet2" Then 
    Load UserForm1 
    With UserForm1 
     .Width = Application.Width 
     .Height = Application.Height 
     .Show 
    End With 
    Application.EnableEvents = False ' Surpress SheetActivate event 
    Worksheets("Sheet3").Activate 
    Application.EnableEvents = True 
    End If 

End Sub 
2

Sie können alle Zellen in dem Arbeitsblatt ausblenden, indem Sie zuerst gehen:

Worksheets("Sheet3").Cells.EntireRow.Hidden = True 
Worksheets("Sheet3").Cells.EntireColumn.Hidden = True 
MyUserForm.Show 'You can show modally here if you like 

Wenn Sie bereit sind, wieder der Inhalt dem Benutzer zu zeigen, können Sie verwenden:

MyUserForm.Hide 
Worksheets("Sheet3").Cells.EntireRow.Hidden = False 
Worksheets("Sheet3").Cells.EntireColumn.Hidden = False 

Der Vorteil hierbei ist, dass Sie die Höhe und Breite von Zeilen und Spalten während des Prozesses nicht verlieren - sie werden genau in ihren ursprünglichen Formaten wiederhergestellt.

sieht wie folgt aus: enter image description here

+0

Schön gemacht, ich setze das in meine Toolbox. – Jesse

+0

Ich mag, was Sie getan haben, aber wenn ich versuche, in der Funktion Arbeitsblatt_Aktivieren zu implementieren, erhalte ich einen Fehler: "Kann die versteckte Eigenschaft der Range-Klasse nicht einstellen" ... irgendeine Idee? – thebiglebowski11

+0

Wenn Sie Ihren genauen Code posten (vor allem, wenn er vom obigen Code abweicht) und einen anderen Kommentar hinterlassen, um mich zu benachrichtigen, werde ich es auf meinem Computer testen und sehen, was schief läuft. Es sollte funktionieren, wenn genau wie oben beschrieben. Beachten Sie, dass einige Aktionen während der Ausführung bestimmter Excel-Ereignisse nicht ausgeführt werden können. Dies ist wahrscheinlich etwas, was Sie tun möchten, bevor das Worksheet_Activate-Ereignis ausgelöst wird, oder vielleicht später, indem Sie es mit dem folgenden Befehl senden: 'Application.OnTime Now," YourMethodName "' – Alain