Tasto minimizza in una form

di il
6 risposte

Tasto minimizza in una form

Salve a tutti, sono nuovo del forum, vi scrivo perchè ho bisogno di aiuto nella creazione di una form di excel, il problema è questo:
Ho creato un paio di form in excel dove ho inserito i tasti minimizza, ingrandisci e chiudi nella finestra in alto a dx (anche se il tasto ingrandisci è inattivo, ma il problema non è questo), premetto che i codici non li ho creati io ma li ho trovati sempre su internet. Fino ad oggi il tasto minimizza ha sempre funzionato ma nell'ultima "creazione" mi va in conflitto con un altro comando. Praticamente nella form ho inserito anche un grafico a torta seguendo questi comandi (trovati sempre su internet):

Dim ChartNum As Integer
Private Sub UserForm_Initialize()
ChartNum = 1
UpdateChart
End Sub

Private Sub UpdateChart()
Set CurrentChart = Sheets("Foglio1").ChartObjects(ChartNum).Chart
CurrentChart.Parent.Width = 500
CurrentChart.Parent.Height = 300

' Save chart as GIF
Fname = ThisWorkbook.Path & Application.PathSeparator & "temp.gif"
CurrentChart.Export Filename:=Fname, FilterName:="GIF"

' Show the chart
Image1.Picture = LoadPicture(Fname)
End Sub


Se avvio la form funziona tutto e si carica anche il grafico, ma quando vado ad inserire i codici per i tasti minimizza, ingrandisci e chiudi (come di seguito):

Option Explicit
Private nr As Long
Private rng As Range
Private c As Range
Private Declare Function FindWindow& Lib "user32" _
Alias "FindWindowA" (ByVal lpClassName$, _
ByVal lpWindowName$)
Private Declare Function SetWindowLong& Lib "user32" Alias _
"SetWindowLongA" (ByVal hWnd&, ByVal nIndex&, _
ByVal dwNewLong&)
Private Declare Function EnableWindow& Lib "user32" _
(ByVal hWnd&, ByVal fEnable&)
Private Declare Function ShowWindow& Lib "user32" _
(ByVal hWnd&, ByVal nCmdShow&)


questi invece li inserisco nel comando initialize:
'\\ Minimizza su user
Dim Style As Long

' Min: &H20000 / Max: &H10000 / Resize: &H40000
' agendo su &H20000 e/o su &H40000 si ha anche l'ingrandimento
Style = &H84C80080 Or &H20000 Or &H40000
SetWindowLong FindWindow(vbNullString, Me.Caption), -16, Style
EnableWindow FindWindow(vbNullString, Application.Caption), 1


l'errore che mi appare è questo:

ERRORE DI COMPILAZIONE
VARIABILE NON DEFINITA
e mi evidenzia CurrentChart nel comando Set CurrentChart di Private Sub updateChart

Ora ribadisco che sono alquanto ignorante di Vb e quello che creo è utilizzando i comandi che trovo su internet, ma fino ad oggi non ho mai avuto problemi, tutto nasce quando inserisco il comando Option explicite , come se andasse in conflitto con il comando Dim ChartNum As Integer
Qualcuno può spiegarmi dove sbaglio? Grazie

6 Risposte

  • Re: Tasto minimizza in una form

    Beh ci dici l'errore ma non possiamo capire il motivo, visto che il codice che richiama la funzione di minimizza non lo hai scritto...!

    Penso ci possa essere qualche anomalia sulle chiamate API per il recupero dell'hWnd della UserForm ed il successivo passaggio alla minimizzazione... ma è come avere la sfera di cristallo...
  • Re: Tasto minimizza in una form

    Spiegati meglio, per favore.
  • Re: Tasto minimizza in una form

    Non avevo visto le ultime 2 righe anceh perchè non hai usato i TAG CODE...!!!

    Il codice come lo hai scritto è impossibile da DEBUGGARE.

    La FindWindow deve essere verificata se restituisce un valore>0... se la metti diretta nella SetWindowLong non ti puoi accorgere...
    Anche la SetWindowLong restituisce un valore che definisce se è andata a buon fine...!!!

    Io avrei usato la ShowWindow per il minimizza... ma credo tu prima debba risolvere l'anomalia.

    Scrivi codice che possa essere Debuggato applicando dei BreackPoint e seguito PASSO-PASSO premendo F8...!

    Una cosa simile
    
    Dim hWndUF as Long
    Dim hWndAP as Long
    Dim Style As Long
    Dim retVal as Long
    Style = &H84C80080 Or &H20000 Or &H40000
    hWndUF=FindWindow(vbNullString, Me.Caption)
    
    If hWnd>0 then
       retVal=SetWindowLong (hWndUF, -16, Style)
       If retVal=0 then
          MsgBox "ERRORE nella SetWindows Long"
          Exit Sub/Function
       End If
       hWndAP= FindWindow(vbNullString, Application.Caption)
       If hWndAP>0 then
          retVal=   EnableWindow hWndAP, 1
          If retVal=0 then
              MsgBox "ERRORE nella SetWindows Long"
              Exit Sub/Function
          End If
       Esle
           MsgBox "ERRORE nella FindWindow APPLICATION"
           Exit Sub/Function
       End if
    Else
           MsgBox "ERRORE nella FindWindow USER FORM"
           Exit Sub/Function
    End If
    So che questo codice è più lungo delle 2 righe che hai scritto tu... ma questo è usabile il tuo no...!

    Se poi non ti vai a leggere le istruzioni delle chiamate API e non sai cosa devi guardare... sembra quasi un'azione da COPIA/INCOLLA....
  • Re: Tasto minimizza in una form

    Allora fermo restando che se mi presento come novizio, inesperto o qualsiasi altro aggettivo da di per se che non inserisco i codici come gli esperti vorrebbero o peggio ancora sbaglio nel descrivere la problematica, chi scrive nei forum è proprio perchè ha difficolta più o meno grandi che da solo non riesce a risolvere, ma non per questo mi sento un inetto o un fallito nel voler provare a conoscere o imparare il VBA ... comunque a parte questo sfogo o polemica che si voglia ringrazio Alex perchè tutto sommato sta dedicando tempo e pazienza per un mio problema, confermo che i miei codici non sono altro che un copia/incolla di codici "trovati" su internet e messi a disposizione di chi ne voleva fare uso. Per Alex: i codici relativi al minimizza e chiudi mi hanno sempre funzionato, la problemaitca è associarli ad altri codici che, sempre su internet, ho trovato per inserire un grafico su un form. Ribadisco che il problema nasce quando inserisco il comando Option Explicit, su alcuni manuali che ho trovato viene suggerito di inserire questo comando in moduli ma così facendo il minimizza non funziona è per questo che l'ho inserito, sempre su suggerimento di altri, insieme agli altri codici...ora vediamo se ho capito come postare i codici come mi è stato suggerito:
    Questi sono i codici per inserire il grafico presente su una sheet e trasformato, con questi codici, in formato gif:
    Dim ChartNum As Integer
    Private Sub UserForm_Initialize()
    ChartNum = 1
    UpdateChart 
    End Sub
    
    Private Sub UpdateChart()
    Set CurrentChart = Sheets("Foglio1").ChartObjects(ChartNum).Chart
    CurrentChart.Parent.Width = 500
    CurrentChart.Parent.Height = 300
    
    ' Save chart as GIF
    Fname = ThisWorkbook.Path & Application.PathSeparator & "temp.gif"
    CurrentChart.Export Filename:=Fname, FilterName:="GIF"
    
    ' Show the chart
    Image1.Picture = LoadPicture(Fname)
    End Sub
    
    Se avvio la form funziona tutto e si carica anche il grafico, ma quando vado ad inserire i codici per i tasti minimizza, ingrandisci e chiudi (come di seguito):
    Option Explicit
    Private nr As Long
    Private rng As Range
    Private c As Range
    Private Declare Function FindWindow& Lib "user32" _
    Alias "FindWindowA" (ByVal lpClassName$, _
    ByVal lpWindowName$)
    Private Declare Function SetWindowLong& Lib "user32" Alias _
    "SetWindowLongA" (ByVal hWnd&, ByVal nIndex&, _
    ByVal dwNewLong&)
    Private Declare Function EnableWindow& Lib "user32" _
    (ByVal hWnd&, ByVal fEnable&)
    Private Declare Function ShowWindow& Lib "user32" _
    (ByVal hWnd&, ByVal nCmdShow&)
    
    questi invece li inserisco nel comando initialize:
    
    '\\ Minimizza su user
    Dim Style As Long
    
    ' Min: &H20000 / Max: &H10000 / Resize: &H40000
    ' agendo su &H20000 e/o su &H40000 si ha anche l'ingrandimento
    Style = &H84C80080 Or &H20000 Or &H40000
    SetWindowLong FindWindow(vbNullString, Me.Caption), -16, Style
    EnableWindow FindWindow(vbNullString, Application.Caption), 1
    
    
    ERRORE DI COMPILAZIONE
    VARIABILE NON DEFINITA
    e mi evidenzia CurrentChart nel comando Set CurrentChart di Private Sub updateChart
    speriamo così vada bene....
  • Re: Tasto minimizza in una form

    Polemica a parte, di cui non condivido il senso... chi sviluppa DEVE STUDIARE la base di come si scrive il codice... non semplicemente COPIAINCOLLARE, questo secondo me...

    Nel tuo caso il problema è GENERICO o GENERALE, l'uso di "OPTION EXPLICIT" è la cosa più utile che deve usare chi sviluppa, perchè OBBLIGA a dichiarare tutte le variabili usate.

    Tu le hai dichiarate tutte nel modo giusto...?

    Nel tuo caso, a parte il codice scritto, devi dichiarare TUTTE le variabili e questo è la base...
    Vado a farti un paio di esempi:
    
    CurrentChart  è oggetto o variabile Oggetto...?
    fname ... dove la dichiari...?
  • Re: Tasto minimizza in una form

    Vedi Alex Studiare non è un problema, purchè ci siano manuali che insegnino dalla A alla Z e non manuali che partono dalla C, dando per scontate alcune cose, mi è stato consigliato un libro di F. B. (non scrivo il nome perchè credo sia pubblicità) dove alcune cose sono spiegate bene ma altre in maniera molto velata...
    Ti sembrerà strano ma sto imparando più dialogando con te che studiando sui manuali, il problema è che, giustamente, prima o poi ti romperai di spiegare ...
    La mia richiesta non è un corso avanzato anche perchè non è ne il luogo ne il modo giusto per farlo, ma solo cercare di capire perche se prendo i due codici separati mi funzionano ma se cerco di accoppiarli non funzionano, tu parli di variabili dichiarate ed io non ti so rispondere perchè ancora ho molta ignoranza, da profano mi viene da dirti che tutto sommato sono dichiarate in quanto i codici per il minimizza se inseriti da soli funzionano e quelli del caricamento grafico idem, ma insieme no...ti ringrazio per la pazienza ma di più non so cosa dirti e mi rendo conto che anche tu non puoi aiutarmi non per incapacità ma perchè hai bisogno di più parametri che per il momento non so darti.
Devi accedere o registrarti per scrivere nel forum
6 risposte