Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [VBA] Add-in di excel che si ricarica ogni volta che apro una finestra di excel..

    salve a tutti,

    lo sò, lo sò, il titolo lascia a desiderare... cercherò di spiegarmi meglio nel messaggio...

    ho fatto, due anni fà, un'add-in per excel per la creazione, la modifica (visible, enabled) delle Commandbars di excel... solo che ho notato ora, come avevo notato due anni fà, che ogni tanto, si scasinano le barre...

    nel senso che mi visualizza barre che ne io(via programma), ne l'utente, abbiamo visaualizzato...

    gira e rigira ho scoperto che se si apre un foglio e successivamente se ne apre un'altro o se ne crea uno nuovo, tutti gli oggetti che si sono creati la prima volta che si avvia l'addin, vengono ricreati da nuovo, come se fossero due add-in diverse ma che fanno lo stesso lavoro...

    il casino delle barre nasce perchè, se l'utente chiude l'applicazione excel (attenzione non la cartella di lavoro), lui mi avvia "tutte e due le add-in" con il risultato che le barre vengono scasinate...

    ora la mia domanda è: come posso fare ad archiviarmi le barre sapendo che aprendo due fogli l'add-in si resetta ogni volta?

    nel prossimo messaggio, metto il codice delle barre, così capite la logica...

    grazie
    Bombardare per la pace, è come trombare per la verginità.

    C'è qualcuno al mondo che tromba troppo secondo me...

    Andrea Medici

  2. #2
    Questo è l'"oggetto" che uso per archiviare le barre...

    codice:
    Private Type Bottone
        Visibile As Boolean
        Disponibile As Boolean
        Discriminato As Boolean
    End Type
    
    Private Type Fogli
        NomeFoglio As String
        Bottoni() As Bottone
        CeBottoni As Boolean
    End Type
    
    Private Type SingolaBarra
        Nome As String
        Visibile As Boolean
        Disponibile As Boolean
        VisibileProgramma As Boolean
        DispProgramma As Boolean
        FoglioAttivo() As Fogli
        CartellaAttiva As String
    End Type
    
    Private Type InfoBarra
        Avviato As Boolean
        Caricando As Boolean
        barra() As SingolaBarra
    End Type
    
    
    Public Barre As InfoBarra
    questa è la sub che viene richiamata quando si vuole inserire o modificare una barra

    codice:
    Sub BarrePersonalizzate(NomeBarra As String, swNasVis As Boolean, _
                            swEnb As Boolean, FogliAb As String, _
                            arrBottoni() As Variant, BotFogli As String, Cartella As String, _
                            Optional swNewDisp As Boolean, Optional swNewVis As Boolean)
        ' se FogliAb="" significa da applicare a tutti i fogli
        ' in caso nomebarra = FB,SB usare swNasVis per la FormulaBar e swEnb per la StatusBar
        Dim swBar As Integer, swTool As Boolean
        On Error GoTo ErrH
        If ControllaOggetto = True Then Exit Sub
        swBar = -1
        If NomeBarra = "FB,SB" Then
            For i = 0 To UBound(barre.barra)
                If barre.barra(i).Nome = NomeBarra Then
                    barre.barra(i).VisibileProgramma = swNasVis
                    barre.barra(i).DispProgramma = swEnb
                    If Len(Trim(FogliAb)) > 0 Then
                        Call AggFogBott(i, FogliAb, BotFogli, False)
                    Else
                        ReDim Preserve barre.barra(UBound(barre.barra)).FoglioAttivo(0)
                        barre.barra(UBound(barre.barra)).FoglioAttivo(0).NomeFoglio = ""
                    End If
                    GoTo VisNasCB
                End If
            Next
        End If
        If CBDoesExist(NomeBarra) = False Then
            Call CreaBarra(NomeBarra, arrBottoni(), "Crea")
        Else
            For i = 0 To UBound(barre.barra)
                If barre.barra(i).Nome = NomeBarra Then
                    swBar = i
                    Exit For
                End If
            Next
            If arrBottoni(0) <> "" Then Call CreaBarra(NomeBarra, arrBottoni(), "Verifica")
        End If
        If swBar >= 0 Then
            Call AggFogBott(swBar, FogliAb, BotFogli, True)
            If swNasVis <> barre.barra(swBar).VisibileProgramma Or barre.barra(swBar).DispProgramma <> swEnb Then
                barre.barra(swBar).VisibileProgramma = swNasVis
                barre.barra(swBar).DispProgramma = swEnb
                swTool = CBToolbarShow(NomeBarra, swNasVis, swEnb)
            End If
            barre.barra(swBar).CartellaAttiva = Cartella
        Else
            ReDim Preserve barre.barra(UBound(barre.barra) + 1)
            barre.barra(UBound(barre.barra)).Nome = NomeBarra
            If IsMissing(swNewDisp) Then swNewDisp = False
            If IsMissing(swNewVis) Then swNewVis = False
            barre.barra(UBound(barre.barra)).Disponibile = swNewDisp
            barre.barra(UBound(barre.barra)).Visibile = swNewVis
            Call AggFogBott(UBound(barre.barra), FogliAb, BotFogli, True)
            barre.barra(UBound(barre.barra)).VisibileProgramma = swNasVis
            barre.barra(UBound(barre.barra)).DispProgramma = swEnb
            barre.barra(UBound(barre.barra)).CartellaAttiva = Cartella
        End If
        If Tienne.Normalizzato = True Then Tienne.Normalizzato = False
    VisNasCB:
        On Error GoTo 0
        Exit Sub
    ErrH:
        Call Errore("BarrePersonalizzate", Err.Description, Err.Number)
    End Sub
    
    Sub AggFogBott(posBarra As Integer, Fogli, Bottoni, swBottoni)
        Dim arrBottoni As Variant, arrFogli As Variant, posFoglio As Integer, swFoglioCe, strFogliCe As String * 1
        On Error GoTo ErrH
        If Len(Trim(Fogli)) > 0 Then
            arrFogli = Split(Fogli, ",")
            strFogliCe = "x"
        Else
            strFogliCe = ""
        End If
        If Len(Trim(strFogliCe)) = 0 Then
            ReDim Preserve barre.barra(posBarra).FoglioAttivo(0)
            posFoglio = 0
            barre.barra(posBarra).FoglioAttivo(posFoglio).NomeFoglio = ""
            barre.barra(posBarra).FoglioAttivo(posFoglio).CeBottoni = False
            If swBottoni = True Then Call AggBottoni(posBarra, Bottoni, posFoglio)
        Else
            i = 0
            Do While Not i > UBound(arrFogli)
                If i = 0 Then
                    ReDim Preserve barre.barra(posBarra).FoglioAttivo(0)
                    posFoglio = 0
                Else
                    If VerPosFoglio(arrFogli(i), posBarra) = -1 Then
                        posFoglio = UBound(barre.barra(posBarra).FoglioAttivo)
                        ReDim Preserve barre.barra(posBarra).FoglioAttivo(posFoglio + 1)
                        posFoglio = UBound(barre.barra(posBarra).FoglioAttivo)
                    End If
                End If
                barre.barra(posBarra).FoglioAttivo(posFoglio).NomeFoglio = Trim(arrFogli(i))
                barre.barra(posBarra).FoglioAttivo(posFoglio).CeBottoni = False
                If swBottoni = True Then Call AggBottoni(posBarra, Bottoni, posFoglio)
                i = i + 1
            Loop
        End If
        Exit Sub
    ErrH:
        Call Errore("AggFogBott", Err.Description, Err.Number)
    End Sub
    
    Function VerPosFoglio(NomeFoglio, posBarra) As Integer
        On Error GoTo ErrH
        VerPosFoglio = -1
        For k = 0 To UBound(barre.barra(posBarra).FoglioAttivo)
            If barre.barra(posBarra).FoglioAttivo(k).NomeFoglio = NomeFoglio Then
                VerPosFoglio = k
                Exit For
            End If
        Next
        Exit Function
    ErrH:
        Call Errore("VerPosFoglio", Err.Description, Err.Number)
    End Function
    
    Sub AggBottoni(posBarra As Integer, Bottoni, nFoglio)
        Dim qstFoglio, arrBottoni As Variant, z, arrVisDisp As Variant, x
        On Error GoTo ErrH
        If Len(Trim(Bottoni)) > 0 Then
            arrBottoni = Split(Bottoni, ",")
            If UBound(arrBottoni) > -1 Then
                arrVisDisp = Split(arrBottoni(0), ";")
                If UBound(arrVisDisp) > -1 Then
                    With barre.barra(posBarra).FoglioAttivo(nFoglio)
                        ReDim Preserve .Bottoni(UBound(arrVisDisp))
                        For x = 0 To UBound(arrVisDisp)
                            Select Case arrVisDisp(x)
                                Case "0"
                                    .Bottoni(x).Disponibile = False
                                    .Bottoni(x).Visibile = False
                                Case "1"
                                    .Bottoni(x).Disponibile = False
                                    .Bottoni(x).Visibile = True
                                Case "2"
                                    .Bottoni(x).Disponibile = True
                                    .Bottoni(x).Visibile = False
                                Case "3"
                                    .Bottoni(x).Disponibile = True
                                    .Bottoni(x).Visibile = True
                            End Select
                            .Bottoni(x).Discriminato = True
                        Next
                        .CeBottoni = True
                    End With
                End If
                Bottoni = Replace(Bottoni, arrBottoni(0) & ",", "")
            End If
        Else
            With barre.barra(posBarra).FoglioAttivo(nFoglio)
                ReDim Preserve .Bottoni(0)
                .Bottoni(0).Disponibile = True
                .Bottoni(0).Visibile = True
                .Bottoni(0).Discriminato = False
            End With
        End If
        Exit Sub
    ErrH:
        Call Errore("AggBottoni", Err.Description, Err.Number)
    End Sub
    Bombardare per la pace, è come trombare per la verginità.

    C'è qualcuno al mondo che tromba troppo secondo me...

    Andrea Medici

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.