Somma celle non vuote in tre colonne

di il
22 risposte

22 Risposte - Pagina 2

  • Re: Somma celle non vuote in tre colonne

    Philcattivocarattere ha scritto:


    gmaster ha scritto:


    Oggesù stamattina son fuso....benedetto venerdì....
    Non so perchè ho scritto query, ma ovviamente sto lavorando in VBA....Scusami
    Guarda se nei Riferimenti hai Microsoft DAO 3.6 Object Library. Se non c'è attivalo, mettendo il segno di spunta.
    Ok, oggi è proprio Venerdì 17.
    Se provo ad attivarlo mi dice "Nome già utilizzato per modulo, libreria o oggetto esistente"
    ...e non mi pare proprio di avere un modulo chiamato così
  • Re: Somma celle non vuote in tre colonne

    gmaster ha scritto:


    Philcattivocarattere ha scritto:


    gmaster ha scritto:


    Oggesù stamattina son fuso....benedetto venerdì....
    Non so perchè ho scritto query, ma ovviamente sto lavorando in VBA....Scusami
    Guarda se nei Riferimenti hai Microsoft DAO 3.6 Object Library. Se non c'è attivalo, mettendo il segno di spunta.
    Ok, oggi è proprio Venerdì 17.
    Se provo ad attivarlo mi dice "Nome già utilizzato per modulo, libreria o oggetto esistente"
    ...e non mi pare proprio di avere un modulo chiamato così
    E' venerdì 17 ma influisce su vba. Scrivi i riferimenti attivi, verifica se qualche riferimento ha la dicitura "manca" ed eventualmente disattivalo. Se nel frattempo vuoi fare qualche prova: dai una ripulita ai riferimenti, tieni solo quelli "indispesabili" (in base a quello che devi fare con vba). Dopo che hai scritto quelli che ora sono attivi, eventualmente, diamo un'occhiata a cosa togliere.
  • Re: Somma celle non vuote in tre colonne

    Ok grazie, ora ci guardo un po'!

    Intanto, facendo un po' di prove ho trovato una query che funziona a modo:
    SELECT Sum(C1 + C2 + C3) AS Tot FROM (SELECT Count(Tbl1.Campo_1) AS C1, Count(Tbl1.Campo_2) AS C2, Count(Tbl1.Campo_3) AS C3 FROM Tbl1)
    E fa il suo bel conteggio in una tabella, mettetndo il suo totale in Tot

    Ora però ho un po' di difficoltà a tradurlo in VBA, per ora ho scritto questo (che non funziona...non mi dà erore, ma mi fa tornare 0 su TotRecDb):
    Public Function TotRecDb()
    Dim strSQL As String
    Dim tbf As TableDef
    Dim totRec As Integer
    Dim Total As Integer
    Dim Name As String
    Dim C1 As Integer
    Dim C2 As Integer
    Dim C3 As Integer
    Dim C4 As Integer
    Dim Tot As Integer
    For Each tbf In DBEngine(0)(0).TableDefs
        If Right(tbf.Name, 3) = "_BB" Then
          Name = tbf.Name
          strSQL = "SELECT Sum(C1 + C2 + C3) AS Tot"
          strSQL = strSQL & "FROM (SELECT Count([" & Name & "].Campo_1) AS C1, Count([" & Name & "].Campo_2) AS C2, Count([" & Name & "].Campo_3) AS C3 FROM [" & Name & "])"
          Total = Total + Tot
       End If
    Next
    TotRecDb = Total
    End Function
    Dove sbaglio? Devo dividere ulteriormente la stringa?

    EDIT: Forse ho scoperto perchè non mi funzionava il DaO.Recordset: in effetti quell'istruzione c'è anche nello script di un altro modulo del DB....quindi non posso più usarla?
  • Re: Somma celle non vuote in tre colonne

    gmaster ha scritto:


    Intanto, facendo un po' di prove ho trovato una query che funziona a modo:
    SELECT Sum(C1 + C2 + C3) AS Tot FROM (SELECT Count(Tbl1.Campo_1) AS C1, Count(Tbl1.Campo_2) AS C2, Count(Tbl1.Campo_3) AS C3 FROM Tbl1)
    strSQL = "SELECT Sum(C1 + C2 + C3) AS Tot"
    e funzionerebbe altrettanto a modo senza quel Sum: su tre campi diversi, che significato ha?

    gmaster ha scritto:


    Forse ho scoperto perchè non mi funzionava il DaO.Recordset: in effetti quell'istruzione c'è anche nello script di un altro modulo del DB....quindi non posso più usarla?
    Non funzionava e adesso funziona, per un altro motivo, che non ho capito. Se fosse stato un problema di conflitto di nomi ti avrebbe dato un altro errore, prima.

    gmaster ha scritto:


    Ora però ho un po' di difficoltà a tradurlo in VBA, per ora ho scritto questo (che non funziona...non mi dà erore, ma mi fa tornare 0 su TotRecDb):
    Perché stai aprendo un recordset che è costituito da un campo con un valore al suo interno. Il recordset non è quel valore. Nel codice che avevo preparato n post fa c'era anche scritto come prendere i valori dei 3 campi (a suo tempo li avevo tenuti separati)
    set rs = dbEngine(0)(0).openrecorset (strSQL)
          total = total + rs(0).value + rs(1).value + rs(2).value
    Se adesso il campo è uno solo ti limiti a rs(0).value

    Ma quale recordset! me ne sono accorto solo ora: per non avere più il problema della dichiarazione del recorset l'hai tolto completamente? Siamo tornati quasi all'inizio del thread! non è servito praticamente a niente. Dove sarebbe, secondo te, nella tua ultima versione della funzione la parte che "esegue" (mi si passi questo verbo) la select?

    Non ci capisco più niente. Devo lasciar decantare il codice.
  • Re: Somma celle non vuote in tre colonne

    Ehehe si scusami sto scrivendo troppo....

    Comunque, riguardo al DAO.recordset son riuscito a farlo funzionare (non ho fatto correzioni specifiche, mi sa che era andato in bambola access) e ora l'errore che mi dà è sulla riga
    Set rs = DBEngine(0)(0).OpenRecordset(strSQL)
    lamentando però un errore nell'istruzione SELECT...

    In ogni caso hai ragione, lascio decantare un attimo che tanto oggi ho capito non compiccio molto...Grazie di tutto per ora!!!!
  • Re: Somma celle non vuote in tre colonne

    gmaster ha scritto:


    Ehehe si scusami sto scrivendo troppo....
    Il discorso è che non sistemi una cosa alla volta, con certezze. Quindi un errore sparisce (forse) ma se ne aggiunge un altro.

    gmaster ha scritto:


    riguardo al DAO.recordset son riuscito a farlo funzionare (non ho fatto correzioni specifiche, mi sa che era andato in bambola access)
    Rileggendo anch'io ho notato che è "sparita" (magia) nella tua versione una delle righe che avevo scritto
    rs.close
    questo fa in modo che il recorset si chiuda altrimenti non si può aprire al ciclo successivo: è già aperto!
    Poi c'e questa che però avevo indicato erroneamente io (senza il set, ora ho corretto anche l'originale)
    set rs = nothing
    che distrugge l'oggetto, liberando anche risorse.

    gmaster ha scritto:


    Set rs = DBEngine(0)(0).OpenRecordset(strSQL) 
    lamentando però un errore nell'istruzione SELECT...
    detto e scritto così come si capisce cosa contiente strSQL? hai fatto altre correzioni nel codice?

    gmaster ha scritto:


    In ogni caso hai ragione, lascio decantare un attimo che tanto oggi ho capito non compiccio molto..
    No, no: tu lavoraci su (concentrazione permettendo, a volte rivedere tutto a mente fresca aiuta)
    Rileggiti l'intero thread, sistema ben bene il codice e cerca di darne una versione "definitiva" in base a tutto quello che è stato scritto. Poi se dà ancora errore ci si lavora ancora.
  • Re: Somma celle non vuote in tre colonne

    Ciao Phil, intanto grazie infinite per l'aiuto, la pazienza e la disponibilià
    Buone notizie, finalmente ci sono riuscito!!!
    Ho usato la variante di query che faceva la somma dei vari Count, e aggeggiato un po' di più coi vari recordset
    
    Public Function TotRecDb()
    Dim rst As DAO.Recordset
        Dim strSQL As String
        Dim tot As Long
        Dim rs As DAO.Recordset
        Dim tbf As TableDef
        Dim Total As Long
        Dim Name As String
    For Each tbf In DBEngine(0)(0).TableDefs
        If Right(tbf.Name, 3) = "_BB" 
        Then
          Name = tbf.Name
          tot = 0
          strSQL = "SELECT Sum(C1 + C2 + C3) AS Tot"
          strSQL = strSQL & " FROM (SELECT Count([Campo_1]) AS C1, Count([Campo_2]) AS C2, Count([Campo_3]) AS C3 FROM [" & Name & "])"
          
          Set rst = CurrentDb.OpenRecordset(strSQL)
                  If Not rst.BOF Then
                  tot = rst.Fields(0)
                  End If
          Total = Total + tot
          rst.Close
          Set rst = Nothing
         End If
    Next
    Set rs = Nothing
    TotRecDb = Total
    End Function
    
    E' sicuramente migliorabile, e forse si può alleggerire un po', però....funziona!
  • Re: Somma celle non vuote in tre colonne

    gmaster ha scritto:


    Buone notizie, finalmente ci sono riuscito!!!
    
          strSQL = "SELECT Sum(C1 + C2 + C3) AS Tot"
    arieccolo: a cosa serve fare Sum della somma di 3 campi quando qui tre campi sono a loro volta in risultato di una query con aggregazione?
    Il risultato di questa

    gmaster ha scritto:


    
         ...SELECT Count([Campo_1]) AS C1, Count([Campo_2]) AS C2, Count([Campo_3]) AS C3 FROM [" & Name & "])"
    ha un record solo. fai un sum su un record solo?

    gmaster ha scritto:


         If Not rst.BOF Then
                  tot = rst.Fields(0)
                  End If
    C'è un motivo particolare per cui la select precedente dovrebbe NON contenere record e quindi verificare se il recordset è vuoto?

    gmaster ha scritto:


    Set rs = Nothing
    dove l'avevi dichiarato ed aperto per ora distruggerlo? Se è per quello nelle dichiarazioni c'era rs, poi usi rst. Aggiungi all'inizio del modulo Option Explicit così eviti di usare variabili non dichiarate (o come in questo caso che credevi di aver dichiarato, ma con un altro nome)

    gmaster ha scritto:


    E' sicuramente migliorabile, e forse si può alleggerire un po', però....funziona!
    Vedi sopra. (tono quasi telegrafico ma non sono arrabbiato, tranquillo)
Devi accedere o registrarti per scrivere nel forum
22 risposte