Suprimarea inchiderii userform si workbook folosind "X"

Închis
zvonacfirst
Mesaje: 105
Membru din: Mie Feb 19, 2014 10:41 pm

Suprimarea inchiderii userform si workbook folosind "X"

Mesaj de zvonacfirst » Mar Sep 12, 2017 9:11 am

Salutare.

Am un workbook pentru care vreau sa suprim posibilitatea de a fi inchis cu click pe butonul "X", cu un msgbox de genul:

Cod: Selectaţi tot

MsgBox "Utilizati butonul FINALIZARE", vbOKOnly, "Actiune nepermisa"
Motivul este ca vreau sa dirijez userul catre o inchidere care sa asigure si salvarea modificarilor si atunci am pus un buton care il duce la un userform.
Acest userform are un buton Save and Close dar as vrea sa suprim de asemenea inchiderea prin click pe "X", cu un msgbox de genul:

Cod: Selectaţi tot

MsgBox "Utilizati butonul Save and Close", vbOKOnly, "Actiune nepermisa"
Ideea este ca userul sa nu aiba de ales intre Save, Don't save si Cancel pentru a nu risca sa aleaga o optiune care nu salveaza modificarile.

Codurile utilizate sunt urmatoarele:
- In ThisWorkbook

Cod: Selectaţi tot

Option Explicit
Public BooleanForClosing As Boolean
--------------------------------------------------------------------
Private Sub Workbook_BeforeClose(Cancel As Boolean)
     
    If BooleanForClosing = False Then
        MsgBox "Utilizati butonul FINALIZARE", vbOKOnly, "Actiune nepermisa"
        Cancel = True
    End If
     
End Sub
-------------------------------------------------------------------
Private Sub Workbook_Open()
Application.Visible = False
UserForm1.Show
End Sub
- In Userform1:

Cod: Selectaţi tot

Private Sub CommandButton1_Click()
Me.Hide
Application.Visible = True
End Sub
------------------------------------------------------------------
Private Sub CommandButton2_Click()
Application.DisplayAlerts = False
    
    With ThisWorkbook
        .Save
        .Close
    End With
    
Application.DisplayAlerts = True
End Sub
------------------------------------------------------------------
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = vbFormControlMenu Then
        Cancel = True
        MsgBox "Utilizati butonul Save and Close", vbOKOnly, "Actiune nepermisa"
    End If
End Sub
- In Module (cod simplu, fara legatura cu problema, dar il postez totusi)

Cod: Selectaţi tot

Sub Finalizare()
Application.Visible = False
UserForm1.Show
End Sub
Treaba este ca daca apas butonul Save and Close in intoarce msgbox-ul de la inchiderea workbookului, si intru intr-un cerc fara iesire.
Va solicit ajutorul pentru rezolvarea problemei. Am atasat un workbook pentru exemplificare.
Multumesc in avans.
Nu aveţi permisiunea de a vizualiza fişierele ataşate acestui mesaj.

Liana
Mesaje: 46
Membru din: Mie Dec 14, 2016 6:07 pm

Re: Suprimarea inchiderii userform si workbook folosind "X"

Mesaj de Liana » Mar Sep 12, 2017 10:50 am

Buna,

Intra intr-un loop datorita codului din ThisWorkbook
Stergeti/dezactivati codul asta si va functiona.

Cod: Selectaţi tot

Public BooleanForClosing As Boolean
--------------------------------------------------------------------
Private Sub Workbook_BeforeClose(Cancel As Boolean)
     
    If BooleanForClosing = False Then
        MsgBox "Utilizati butonul FINALIZARE", vbOKOnly, "Actiune nepermisa"
        Cancel = True
    End If
     
End Sub

zvonacfirst
Mesaje: 105
Membru din: Mie Feb 19, 2014 10:41 pm

Re: Suprimarea inchiderii userform si workbook folosind "X"

Mesaj de zvonacfirst » Mar Sep 12, 2017 5:30 pm

Buna. Multumesc.
Daca sterg/dezactivez acel cod, butonul X (Close) din aplicatie devine activ, ori eu doresc exact contrariul. Daca X devine inactiv si intoarce acel msgbox, fortez userul sa utilizeze butonul Finalizare din fiecare sheet pentru a deschide userform1.
De asemenea nici butonul X din userform nu trebuie sa fie activ.

TudyBTH
Moderator
Moderator
Mesaje: 993
Membru din: Joi Feb 11, 2016 2:12 pm
Localitate: Cluj Napoca

Re: Suprimarea inchiderii userform si workbook folosind "X"

Mesaj de TudyBTH » Mar Sep 12, 2017 9:04 pm

Buna,

In Thisworkbook:

Cod: Selectaţi tot

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Cancel = Not BooleanForClosing
    If Cancel = True Then
        MsgBox "Utilizati butonul FINALIZARE", vbOKOnly, "Actiune nepermisa"
    End If
End Sub
In sub-ul butonului

Cod: Selectaţi tot

Private Sub CommandButton2_Click()
    BooleanForClosing = True
    With ThisWorkbook
        .Close True
    End With
End Sub
Nu aveţi permisiunea de a vizualiza fişierele ataşate acestui mesaj.
Am invatat sa inotam in apa, ca pestii
Am invatat sa zburam in aer, ca pasarile
A ramas doar sa invatam sa traim pe Pamant, ca Oamenii.

zvonacfirst
Mesaje: 105
Membru din: Mie Feb 19, 2014 10:41 pm

Re: Suprimarea inchiderii userform si workbook folosind "X"

Mesaj de zvonacfirst » Joi Sep 14, 2017 8:57 am

Multumesc mult.
Ce am atasat este doar un test. Am mutat codurile in workbookul la care lucrez si am avut surpriza sa imi dea o eroare referitoare la codul din ThisWorkbook.
Am eliminat Option Explicit si functioneaza.

Dr.Windows
Moderator
Moderator
Mesaje: 4570
Membru din: Vin Iul 31, 2009 7:32 am

Re: Suprimarea inchiderii userform si workbook folosind "X"

Mesaj de Dr.Windows » Sâm Sep 16, 2017 6:58 pm

zvonacfirst scrie:Am eliminat Option Explicit si functioneaza.
Acea optiune forteaza utilizatorul sa declare variabilele pe care le utilizeaza in acel modul si asta este bine pentru ca sunt mai multe avantaje:
1. Microsoft spune ca acel cod va fi executat ceva mai repede pentru ca nu mai sta sa verifice pe percurs de ce tip sunt acele variabile in plus nu mai exista riscul de a reutiliza o variabila stocand in ea alt tip de date fata ed cel "declarat";
2. Declararea cu instructiunea DIM ajuta si la scrierea mai usor a variabilelor cu nume mai lung pentru ca dupa cateva caractere se poate "forta" editorul cu CTRL+SPATIU sa afiseze lista de "posibilitati" si pot alege variabila dintr-o lista iar astfel nici nu mai fac greseli de "dactilografiere";
3. Declararea variabilelor in acea procedura ajuta la "protejarea" lor local, adica nu pot fi modificate in alte proceduri in cazul in care au fost declarate si ca variabile publice.

Închis

Înapoi la “Visual Basic for Application (VBA) cu Excel - Intrebari tehnice”