Convalida formule



  • Convalida formule
    di Mauro (utente non iscritto) data: 08/12/2012 19:07:42

    Dopo tanti sforzi nel riuscire a far funzionare una macro ecco che non mi tiene le formule sul foglio....

    Questa è bella, penso che qualcosa faccia interferenza perchè senza macro funziona....

    Sapete se c'è qualche settaggio da fare !!!!!



  • Rimuovere protezione cartella di lavoro..
    di ijk (utente non iscritto) data: 08/12/2012 19:38:48

    Salve :) e buon weekend
    Anche se non mi faccio sentire ogni tanto passo da queste parti, anche se non ho problemi ma oggi il problema c'è: sto usando il codice scritto da Ron de Bruin per estrarre dati da un gruppo di files excel contenuti in una cartella senza aprirli. Il problema è che il codice non funziona se è protetta la cartella di lavoro dei file da cui si vogliono estrarre i dati (ho fatto delle prove...).
    Il problema si potrebbe risolvere scrivendo del codice che apre ciascun file e sprotegge la cartella di lavoro e poi lo chiude salvandolo. Ma siccome i file sono 50, sapete se è possibile inserire nel codice un'istruzione che rimuove tale protezione senza aprire il file?
    Un'altra cosa che ho pensato: si potrebbe accedere al file in sola lettura? ma.. vedo open usato su un oggetto recordset e...non ci arrivo tanto..
     
    '''''''''''''''''''''''''''''''''''''
    'subroutine che sto provando'
    '''''''''''''''''''''''''''''''''''''
    Sub GetData_Example5()
        Dim SaveDriveDir As String, MyPath As String
        Dim FName As Variant, N As Long
        Dim rnum As Long, destrange As Range
        Dim sh As Worksheet
    
        SaveDriveDir = CurDir
        MyPath = Application.DefaultFilePath    'or use "C:Data"
        ChDrive MyPath
        ChDir MyPath
        FName = Application.GetOpenFilename(filefilter:="Excel Files,*.xl*", _
                                            MultiSelect:=True)
        If IsArray(FName) Then
            ' Sort the Array
            FName = Array_Sort(FName)
    
            Application.ScreenUpdating = False
            'Add worksheet to the Activeworkbook and use the Date/Time as name
            Set sh = ActiveWorkbook.Worksheets.Add
            sh.Name = Format(Now, "dd-mm-yy h-mm-ss")
    
            'Loop through all files you select in the GetOpenFilename dialog
            For N = LBound(FName) To UBound(FName)
    
                'Find the last row with data
                rnum = LastRow(sh)
    
                'create the destination cell address
                Set destrange = sh.Cells(rnum + 1, "A")
    
                ' For testing Copy the workbook name in Column E
                sh.Cells(rnum + 1, "E").Value = FName(N)
    
    
                'Get the cell values and copy it in the destrange
                'Change the Sheet name and range as you like
                GetData FName(N), "Riepilogo_2012-13", "T3:T5", destrange, False, False
            Next
    
        End If
        ChDrive SaveDriveDir
        ChDir SaveDriveDir
        Application.ScreenUpdating = True
    End Sub
    
    '''''''''''''''''''''''''''''''''''''
    'la funzione'
    '''''''''''''''''''''''''''''''''''''
    Public Sub GetData(SourceFile As Variant, SourceSheet As String, _
                       SourceRange As String, TargetRange As Range, Header As Boolean, UseHeaderRow As Boolean)
    ' 30-Dec-2007, working in Excel 2000-2007
        Dim rsCon As Object
        Dim rsData As Object
        Dim szConnect As String
        Dim szSQL As String
        Dim lCount As Long
    
        ' Create the connection string.
        If Header = False Then
            If Val(Application.Version) < 12 Then
                szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                            "Data Source=" & SourceFile & ";" & _
                            "Extended Properties=""Excel 8.0;HDR=No"";"
            Else
                szConnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                            "Data Source=" & SourceFile & ";" & _
                            "Extended Properties=""Excel 12.0;HDR=No"";"
            End If
        Else
            If Val(Application.Version) < 12 Then
                szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                            "Data Source=" & SourceFile & ";" & _
                            "Extended Properties=""Excel 8.0;HDR=Yes"";"
            Else
                szConnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                            "Data Source=" & SourceFile & ";" & _
                            "Extended Properties=""Excel 12.0;HDR=Yes"";"
            End If
        End If
    
        If SourceSheet = "" Then
            ' workbook level name
            szSQL = "SELECT * FROM " & SourceRange$ & ";"
        Else
            ' worksheet level name or range
            szSQL = "SELECT * FROM [" & SourceSheet$ & "$" & SourceRange$ & "];"
        End If
    
        On Error GoTo SomethingWrong
    
        Set rsCon = CreateObject("ADODB.Connection")
        Set rsData = CreateObject("ADODB.Recordset")
    
        rsCon.Open szConnect
        rsData.Open szSQL, rsCon, 0, 1, 1  '<<<<----- errore qui 
    
        ' Check to make sure we received data and copy the data
        If Not rsData.EOF Then
    
            If Header = False Then
                TargetRange.Cells(1, 1).CopyFromRecordset rsData
            Else
                'Add the header cell in each column if the last argument is True
                If UseHeaderRow Then
                    For lCount = 0 To rsData.Fields.Count - 1
                        TargetRange.Cells(1, 1 + lCount).Value = _
                        rsData.Fields(lCount).Name
                    Next lCount
                    TargetRange.Cells(2, 1).CopyFromRecordset rsData
                Else
                    TargetRange.Cells(1, 1).CopyFromRecordset rsData
                End If
            End If
    
        Else
            MsgBox "No records returned from : " & SourceFile, vbCritical
        End If
    
        ' Clean up our Recordset object.
        rsData.Close
        Set rsData = Nothing
        rsCon.Close
        Set rsCon = Nothing
        Exit Sub
    
    SomethingWrong:
        MsgBox "The file name, Sheet name or Range is invalid of : " & SourceFile, _
               vbExclamation, "Error"
        On Error GoTo 0
    
    End Sub
    
    '''''''''''''''''''''''''''''''''''''
    'altra funzione...'
    '''''''''''''''''''''''''''''''''''''
    
    Function LastRow(sh As Worksheet)
        On Error Resume Next
        LastRow = sh.Cells.Find(What:="*", _
                                After:=sh.Range("A1"), _
                                Lookat:=xlPart, _
                                LookIn:=xlFormulas, _
                                SearchOrder:=xlByRows, _
                                SearchDirection:=xlPrevious, _
                                MatchCase:=False).Row
        On Error GoTo 0
    End Function



  • di Vecchio Frac data: 08/12/2012 20:22:46

    jik per favore apri una nuova discussione, non continuare una discussione esistente altrimenti si genera confusione.






  • di Vecchio Frac data: 08/12/2012 20:51:15

    @Mauro, non è chiaro cosa intendi per "non mi tiene le formule sul foglio".
    Come le imposti le formule, via codice?
    o con range(...).Formula = "=..."
    o con range(...) =

    Ottieni invece qualche messaggio di errore? se sì, specifica quale e riporta la riga di codice che solleva errore.




  • Convalida formule
    di Mauro (utente non iscritto) data: 08/12/2012 21:44:02

    Ciao Vecchio Frac,

    ho una userform che inserisce dei dati in una tabella xls. Da li poi ci sono delle celle impostate con delle formule ( prevalentemente sono somme non con codice ) che dati questi input fanno altre cose.

    Fin qui tutto funziona, il problema è quando inserisco nella tabella xls manualmente altri dati ( senza codice quindi) le formule che avevo impostato scompaiono e devo reimpostarle tutte da capo.

    Non so se mi sono spiegato, il problema sta nella userform che ho installato perchè senza di essa ( ovvero inserendo i dati manualmente e quindi tutto manuale, tutto funziona perfettamente) con la macro sembrano esserci delle interferenze o che il file si sia dannegiato.




  • di Textomb data: 10/12/2012 12:38:34

    io lavoro spesso con le userform e non ho mai avuto problemi di sorta.
    probabilmente ci sarà qualche operazione che viene coinvolta, durante l'utilizzzo della userform, che cancella le formule nel foglio senza la tua espressa volontà.
    Però così non si capisce bene. Potresti essere più dettagliato?



  • Convalida formule
    di Mauro (utente non iscritto) data: 10/12/2012 20:43:06

    Grazie TexTomb,

    ma credo che non ci sia spiegazione se non che il file mi si sia danneggiato oppure non so quale sia il problema.

    La userform serve per inserire dei dati di input in delle celle. Le celle automaticamente se non le tocchi rispettano le impostazioni ma se le tocchi (sempre nelle caselle dove ci sono le formule per modificarle e non le userform ) ti cancellano tutte le altre formule perchè sono collegate e devo rifare tutto.

    Es. nella casella A inserisco un dato tramite userform, nella B metto un numero e nella C metto la somma di A*B.

    In D metto il risultato di C * 3 .

    Se vado a toccare la C dicendo che voglio una somma e non un prodotto la D non funziona più.

    Errori del genere. Se tolgo la Userform invece tutto ok come un regolare foglio xls.



  • di Vecchio Frac data: 10/12/2012 20:59:05

    Non credo che il file sia danneggiato.
    Bè, è molto probabile che le celle siano collegate alle textbox dello userform dove si inseriscono i dati.
    Oppure che ci sia qualche evento dello userform che mette mano alle formule.
    Difficile dirlo, sarebbe meglio vedere il file, se possibile, e naturalmente con dati di esempio.
    Quando si scompaginano le formule, magari perchè cambi la formula in C, l'userform è attivo o no?




  • Convalida formule
    di Mauro (utente non iscritto) data: 10/12/2012 22:34:11

    Ciao Vecchio Frac,

    la user è attiva quando cambio, quindi dice che fa interferenza quella se uso la user no posso agire manualmente?



  • di Vecchio Frac data: 11/12/2012 09:30:15

    Io penso che sia così... se la userform è attiva (quindi modeless) e si può agire liberamente sul foglio, avendo delle celle collegate alla userform si influenzano reciprocamente. Un modellino su cui lavorare sarebbe utile :)





  • di jacks (utente non iscritto) data: 14/12/2012 00:26:06

    Non so se posso esserti utile, ma io ho risolto il tuo problema (come l'ho capito io) creando una copia delle celle con formule nelle quali sono stati inseriti i dati tramite un textbox della userform (che sono sempre le stesse), senza utilizzare codice VBA, ma direttamente sul foglio di lavoro (esempio se il range delle celle è = "g4:h14", dovresti creare delle celle con le formule in posizione "aa4:ab14" e se ci sono celle senza formule lasciare a zero nel range "aa4:ab14", oppure mettici un valore predefinito se così vuoi che sia, che tanto puoi sempre modificarlo con il textbox della userform).

    quando hai utilizzato i dati secondo i tuoi scopi, e prima di inserire nuovi dati (subito dopo che hai "pulito" la userform per un nuovo utilizzo), puoi inserire del codice VBA che copia il range "aa4:ab14" in "g4:h14",

    range("aa4:ab14").copy destination:=range("g4:h14")

    oppure il solito

    range("aa4:ab14").copy
    range("g4:h14").select
    activesheet.paste

    dove probabilmente l'utilizzo di controlsource del textbox, ha cancellato le formule sostituendole con il valore inserito.
    fammi sapere se ti sono stato utile

    ciao



  • di Vecchio Frac data: 14/12/2012 11:07:16

    Bene, basterebbe allora semplicemente cancellare il collegamento tra textbox e cella del foglio, e alla pressione di un command button riversare il contenuto della textbox direttamente nella cella del foglio di lavoro.





  • di jacks (utente non iscritto) data: 14/12/2012 14:50:13

    d'accordo se nelle proprietà del textbox non utilizzi "controlsource".
    Tuttavia sia che si utilizzi questa proprietà o no, si potrebbe inserire la formula in un'altra cella che fa riferimento alla cella nella quale sono riversati i valori di textbox (sia tramite la proprietà controlsource che tramite le proprietà text o value).
    Almeno, io faccio così quando ne ho la necessità.

    vecchio frac mi potresti suggerire un metodo più semplice??



  • di Vecchio Frac data: 14/12/2012 15:20:54

    Non ho detto che sia un metodo sbagliato... soprattutto se funziona ^_^
    Non riesco a pensare a un altro metodo perchè così, avulso da un contesto, non avrebbe gran senso.
    Bisognerebbe esaminare un caso concreto. Anche se probabilmente evitare i collegamenti incrociati (textbox collegata a cella remota alla quale fa riferimento la prima cella) risolverebbe qualche problema di ottimizzazione.




  • Convalida formule
    di Mauro (utente non iscritto) data: 14/12/2012 22:25:57

    Grazie ad entrambi proverò le soluzioni prospettate !!!