Interazione excel genera un dato errato

di il
11 risposte

Interazione excel genera un dato errato

Ciao a tutti.

Mi scuso per il titolo, ma non so come riassumere il problema.

Compilo un file excel per contabilità mensile con dei dati ottenuti da una serie di calcoli e registrati su una tabella apposita.

Nel caso in questione, ogni mese devo stampare un elenco annuale dell'anno in corso aggiornato al mese richiesto

Premetto che l'automazione funziona come deve (vabbè, a parte qualche correzione ancora da fare), ma sto avendo un problema con un campo data.

Nella tabella in questione, il campo che mi interessa è "Scadenza", di tipo Data.

La struttura della tabella è:

La query che mi estrapola i dati necessari (mi riferisco alla parte dell'automazione che mi genera il problema) è:

SELECT * FROM tblRiepilogoAnnualeCedole WHERE [IDCarburante]=2 AND DatePart('yyyy',[Data])=2026 ORDER BY [Data],[Scadenza]

da cui ottengo:

Nello specifico, adesso mi interessa il mese di febbraio 2026 (campo [Data]).

A febbraio ho terminato delle vecchie cedole carburante cha scadevano a Luglio 2027 ed ho iniziato ad usare quelle con scadenza Nov 2027.

Nella contabilità queste 2 voci devono essere separate (ecco perchè a gennaio ho un solo record, mentre a febbraio ne genero 2).

Nell'automazione, la riga incriminata è:

ws.Cells(X, Y) = Left(MonthName(DatePart("m", !Scadenza)), 3) & "-" & Right(DatePart("yyyy", !Scadenza), 2)

il fatto è che quando compilo la cartella excel relativa a questa parte della contabilità, ottengo questo:

per gennaio, il registro è esatto, ma febbraio riporta esattamente solo la scadenza della prima voce, mentre la seconda si ostina ad indicare come scadenza Nov-26 invece che Nov-27, eppure il dato di partenza (!Scadenza) è esatto.

non riesco a capire perchè inserisce come anno il 2026, se il campo riporta 2027. Nel file di excel di destinazione ho verificato la cella, ma non c'è nulla "dentro" che motivi la variazione del dato (che so, qualcosa tipo "Anno-1")

11 Risposte

  • Re: Interazione excel genera un dato errato

    Devi reinserire le immagini perche' non si vedono....

  • Re: Interazione excel genera un dato errato

    Rimesse (non so perchè me le ha eliminate....)

  • Re: Interazione excel genera un dato errato

    Hai provato a scomporre la formula per vedere dove si crea l'errore?

    Prova ad esportare solo l'anno per intero e vedi cosa restituisce: 

    DatePart("yyyy", !Scadenza)

    Poi aggiungi il right, e passo passo il resto della formula...

  • Re: Interazione excel genera un dato errato

    10/03/2026 - Mailman ha scritto:

    Hai provato a scomporre la formula per vedere dove si crea l'errore?

    Prova ad esportare solo l'anno per intero e vedi cosa restituisce: 

    DatePart("yyyy", !Scadenza)

    Poi aggiungi il right, e passo passo il resto della formula...

    Se restituisce nov-26 non credo che cambi molto. Prende 2026 e bisogna capire perché.

    Come popoli le celle? Un ciclo? È possibile vedere quella parte di codice? 

  • Re: Interazione excel genera un dato errato

    Questo è il pezzo di codice che lavora su quei dati:

    Set Rst = CurrentDb.OpenRecordset("SELECT * FROM tblRiepilogoAnnualeCedole WHERE [IDCarburante]=" & I & " AND DatePart('yyyy',[Data])=" & Forms!frmContabilita!txtIDAnno & " ORDER BY [Data],[Scadenza]", dbOpenSnapshot)
        
        
        'Debug.Print Rst.RecordCount
        
        With Rst
        
            Step = 1
            MaxStep = Rst.RecordCount
        
            .MoveFirst
            Do Until .EOF
            
                If !Quantita = 0 Then GoTo ProssimoRecord
                
                'Dim Operazione As Integer
                Operazione = !Operazione
                
                'Imposto la cella di inizio scrittura
                'Imposto solo Y in quanto X è stato calcolato nel loop sopra
                Select Case Operazione
                    Case 1  'Se carico, imposto la colonna B
                        Y = 2
                    
                    Case 2  'Se scarico,  imposto la colonna C
                        Y = 3
                
                End Select
                
                ws.Cells(X, Y) = "X"
                Select Case !Operazione
                    Case 1  'Se carico, devo avanzare di 2
                        Y = Y + 2
                    
                    Case 2  'Se scarico,  devo avanzare di 1
                        Y = Y + 1
                        
                End Select
                
                ws.Cells(X, Y) = StrConv(MonthName(DatePart("m", !Data)), vbUpperCase)
                Y = Y + 1
                
                ws.Cells(X, Y) = "ENI"
                Y = Y + 1
                
                ws.Cells(X, Y) = !TestoCedola
                Y = Y + 1
                
                ws.Cells(X, Y) = !Quantita
                Y = Y + 1
                
                ws.Cells(X, Y) = !Litri
                Y = Y + 1
                
                ws.Cells(X, Y) = "50,00"
                Y = Y + 1
                
                ws.Cells(X, Y) = !Importo
                Y = Y + 1
                
                ws.Cells(X, Y) = Left(MonthName(DatePart("m", !Scadenza)), 3) & "-" & Right(DatePart("yyyy", !Scadenza), 2)
                Y = Y + 1
                
                X = X + 1
    
    ProssimoRecord:
            .MoveNext
            
            Step = Step + 1
            
            Call BarraProgresso(Step, MaxStep)
            
            Loop
        End With
        
        Rst.Close
        Set Rst = Nothing

    La riga che dà l'errore dell'anno è l'ultima prima del .MoveNext

  • Re: Interazione excel genera un dato errato

    Che complicazioni inutili...!

    Al posto di usare quella formula composta, non puoi usare solo FORMAT...?

    Format(!Scadenza,"mmm-yy")
  • Re: Interazione excel genera un dato errato

    10/03/2026 - @Alex ha scritto:

    Che complicazioni inutili...!

    Al posto di usare quella formula composta, non puoi usare solo FORMAT...?

    Senz'altro più funzionale della mia.

    Ho imparato un'altra cosa.

    Ma il problema è rimasto lo stesso.....

  • Re: Interazione excel genera un dato errato

    Scusa ma hai fatto un DEBUG.PRINT...?

    Debug.Print Format(!Scadenza,"mmm-yy")	<----Metti un BreakPoint
    ws.Cells(X, Y) = Format(!Scadenza,"mmm-yy")
    Y = Y + 1

    Inserendo un BreakPoint in DEBUG, il codice si ferma, premi F8 ed avanza di 1 riga per volta, e nella finestra Immediata (CTRL+G) controlli cosa viene letto dalla funzione e cosa restituisce... da li poi capisci dove sta il problema se lato Access o lato Excel...

    Non vorrei ad esempio che mancasse l'Apicetto iniziale per forzare a Testo il dato, perchè quello che scrivi NON E' UNA DATA...!

    ws.Cells(X, Y) = "'" & Format(!Scadenza,"mmm-yy")

    Se vuoi che Excel mantenga la data, devi esportare la Data ed impostare la Formattazione della Cella...!

  • Re: Interazione excel genera un dato errato

    Non è necessario mantenere un formato data, testo va benissimo.

    comunque andando a debug, il dato risulta giusto (nov-27).

    Domani mi guarderò cella per cella tutta la cartella excel, perchè a questo punto il problema deve essere lì, anche se non capisco perchè luglio 2027 me lo riporta correttamente lug-27 mentre novembre 2027 lo cambia a nov-26

  • Re: Interazione excel genera un dato errato

    Ma non è più semplice usare un Array e darlo in pasto alla posizione della colonna?

    Invece di fare y=y+1 metti la posizione dell'array

    Cella(1,1)=Array[1] (oppure query.vampo.value)

    Cella(1,2)=Array[2]

    Ecc...

    Record next

    E ricrei l'array (se proprio non ti piacciono i campi e i loro valori)

    Finché non sei all'ultimo record.

    La cella scadenza la formatti come ti ha suggerito Alex e hai finito (anche il processore ti ringrazia).

  • Re: Interazione excel genera un dato errato

    10/03/2026 - Jocman ha scritto:

    ws.Cells(X, Y) = StrConv(MonthName(DatePart("m", !Data)), vbUpperCase) Y = Y + 1 ws.Cells(X, Y) = "ENI" Y = Y + 1

    equivale a

    ws.Cells(X, 1) = "ENI"
    ws.Cells(X, 2) = !TestoCedola
              
    ws.Cells(X, 3) = !Quantita
    ecc...

    meglio se così

    Dim arr As Variant 
    Dim i As Long 
    
    arr = Array("ENI", TestoCedola, Quantita) 
    
    For i = LBound(arr) To UBound(arr) 
       ws.Cells(x, i+1).Value = arr(i) 
    Next i
Devi accedere o registrarti per scrivere nel forum
11 risposte