Pagina 1 di 2

[Risolto] Macro non funzionante

Inviato: venerdì 9 novembre 2018, 16:10
da theirish
Ciao a tutti, sono alle prese con una macro tradotta da excel che non riesco a far funzionare con LO. La macro serve per un controllo finale delle somme e dei prodotti. Allego il file con la macro e chiedo se qualcuno può gentilmente aiutarmi. Per qualsiasi ulteriore chiarimento chiedete pure. Grazie.

Questa è la macro all'interno del file Calc

Codice: Seleziona tutto

REM Attribute VBA_ModuleType=VBAModule

Option VBASupport 1
Option Compatible

Dim importo(1 To 1000) As Double, quantita(1 To 1000) As Double, nummax As Integer, numaart As Integer, somma As Double
 
 
 Sub estraisomma()

     nummax = Cells(1, 19)
     numart = Cells(2, 19)
     For i = 1 To numart
          quantita(i) = 0
          importo(i) = 0
     Next i
    i = 1
     While i <= nummax
         If (IsNumeric(Cells(i, 2)) And Cells(i, 2) <> "") Then
             j = Cells(i, 2)
         End If
         If (IsNumeric(Cells(i, 12)) And (IsNumeric(Cells(i, 14)) And Cells(i, 14) <> "")) Then
                 importo(j) = importo(j) + Cells(i, 16)
                 quantita(j) = quantita(j) + Cells(i, 12)
          End If
         i = i + 1
     Wend
         For i = 1 To numart
         Cells(i, 20) = i
         Cells(i, 21) = quantita(i)
         Cells(i, 22) = Worksheets("Elenco prezzi").Cells(11 + i * 3 - 2, 6)
         Cells(i, 23) = Cells(i, 21) * Cells(i, 22)
         Cells(i, 24) = importo(i)
         If Abs(Cells(i, 24) - Cells(i, 23)) > 1000 Then
                     Cells(i, 20).Select
                     Beep
                     MsgBox ("Errore")
         End If
 
     Next i
 
 End Sub
 
 Sub controllasomme()
 
     nummax = Cells(1, 19)
     numart = Cells(2, 19)
          somma = 0
          j = 0
    i = 1
     While i <= nummax
         If (IsNumeric(Cells(i, 2)) And Cells(i, 2) <> "") Then
             somma = 0
         End If
        
         If (Cells(i, 4) = "") And ((Cells(i, 6) = "") And (Cells(i, 8) = "") And (Cells(i, 10) = "") And (IsNumeric(Cells(i, 12)) And Cells(i, 12) <> "")) Then
                 Cells(i, 19) = somma
                 If (Abs(somma - Cells(i, 12)) > 0.005) And (somma <> 0) Then
                     Cells(i, 12).Select
                     Beep
                     MsgBox ("Errore di somma")
                 End If
                 
         End If
         If (IsNumeric(Cells(i, 12)) And Cells(i, 12) <> "") Then
                 somma = somma + Cells(i, 12)
                 Cells(i, 12).Select
         End If
         
         i = i + 1
         j = j + 1
     Wend
 End Sub
 Sub controllaprodotti()
 
     nummax = Cells(1, 19)
     numart = Cells(2, 19)
    i = 1
     While i <= nummax
         prodotto = 0
         If (IsNumeric(Cells(i, 12)) And (Cells(i, 12) <> "")) Then
             If (((IsNumeric(Cells(i, 4)) Or (Cells(i, 4) = ""))) And ((IsNumeric(Cells(i, 6)) Or (Cells(i, 6) = ""))) And ((IsNumeric(Cells(i, 8)) Or (Cells(i, 8) = "")) And (IsNumeric(Cells(i, 10)) Or (Cells(i, 10) = "")))) Then
                 Cells(i, 12).Select
                 If Cells(i, 4) <> "" Then a = Cells(i, 4) Else a = 1
                 If Cells(i, 6) <> "" Then b = Cells(i, 6) Else b = 1
                 If Cells(i, 8) <> "" Then c = Cells(i, 8) Else c = 1
                 If Cells(i, 10) <> "" Then d = Cells(i, 10) Else d = 1
                  prodotto = a * b * c * d
                 If (Abs(prodotto - Cells(i, 12)) > 0.005) And ((Cells(i, 4) <> "") Or (Cells(i, 6) <> "") Or (Cells(i, 8) <> "") Or (Cells(i, 10) <> "")) Then
                     Cells(i, 12).Select
                     Cells(i, 18) = prodotto
                     Beep
                     MsgBox ("Errore di prodotto")
                 End If
             End If
         End If
         i = i + 1
     Wend
 End Sub

Re: Macro non funzionante

Inviato: venerdì 9 novembre 2018, 16:29
da Eramad
Ciao.

2 appunti veloci per aiutare chi ti aiuta ;)

- Il codice devi scriverlo in mezzo ai tag e non dopo.
- Puoi spiegare un attimo cosa dovrebbe fare la macro? Giusto per avere un aiuto iniziale alla comprensione del comportamento corretto e cosa vuoi fare

Re: Macro non funzionante

Inviato: venerdì 9 novembre 2018, 16:35
da theirish
La macro è usata in un file per computi metrici estimativi (io sono un geometra). Praticamente sono tre macro che:
- una controlla le somme
- una controlla i prodotti
- una fa un controllo generale e genera i risultati nelle colonne dalla T alla X

Re: Macro non funzionante

Inviato: venerdì 9 novembre 2018, 21:23
da patel
Non hai risposto adeguatamente, come si fa a sapere se funziona correttamente ? quale risultato deve dare e dove lo scrive ?
Noi non siamo geometri.
Comunque prova a modificare le prime righe così:

Codice: Seleziona tutto

Option VBASupport 1

Dim importo(1 To 1000) As Double, quantita(1 To 1000) As Double, nummax As Integer, numaart As Integer, somma As Double
 
 Sub estraisomma()
     CompatibilityMode(True) ' <<<<<<<<
     nummax = Cells(1, 19)

Re: Macro non funzionante

Inviato: venerdì 9 novembre 2018, 22:04
da theirish
Mi dispiace non aver risposto correttamente prima. Ci riprovo: la macro controllaprodotti fa una verifica dei prodotti moltiplicando le colonne 4,6,8,10 e se c'è un errore rimanda una finestra "errore di prodotto". La macro controllasomme verifica le somme di ogni articolo sommando i prodotti(colonna 12 per ogni singolo articolo). La macro estraisomma fa un controllo generale e genera i risultati dalla colonna T in avanti così in ordine: numero articolo, somma delle quantità per quell'articolo, prezzo unitario di ogni articolo, prodotto delle due precedenti colonne, importo preso dalla colonna 16. Spero di essere stato più chiaro. Domani provo la modifica al codice che mi hai suggerito. Grazie per il momento.

Re: Macro non funzionante

Inviato: venerdì 9 novembre 2018, 22:10
da theirish
Anche la macro controllasomme da una finestre “errore di somma” se lo trova nel controllo

Re: Macro non funzionante

Inviato: sabato 10 novembre 2018, 10:38
da theirish
Aggiungo qualche immagine per far capire meglio.

Re: Macro non funzionante

Inviato: sabato 10 novembre 2018, 10:40
da theirish
patel ha scritto:Non hai risposto adeguatamente, come si fa a sapere se funziona correttamente ? quale risultato deve dare e dove lo scrive ?
Noi non siamo geometri.
Comunque prova a modificare le prime righe così:

Codice: Seleziona tutto

Option VBASupport 1

Dim importo(1 To 1000) As Double, quantita(1 To 1000) As Double, nummax As Integer, numaart As Integer, somma As Double
 
 Sub estraisomma()
     CompatibilityMode(True) ' <<<<<<<<
     nummax = Cells(1, 19)
Purtroppo patel, aggiungendo quella riga non funziona.

Re: Macro non funzionante

Inviato: domenica 11 novembre 2018, 13:03
da patel
d'altra parte la macro è scritta per excel e solo quelle molto semplici funzionano su Libre
Inoltre dalle immagini che hai allegato vedo una struttura diversa da quella del file allegato

Re: Macro non funzionante

Inviato: domenica 11 novembre 2018, 15:19
da theirish
patel ha scritto:d'altra parte la macro è scritta per excel e solo quelle molto semplici funzionano su Libre
Inoltre dalle immagini che hai allegato vedo una struttura diversa da quella del file allegato
Speravo si riuscisse a far girare su Libre. Dovrò trovare qualcuno che me la riscriva. Sinceramente non so quando una macro si possa definire semplice o complessa, questa dal mio punto di vista non mi sembrava così complessa, forse perchè so a cosa fa riferimento.
Perchè dici che il file allegato è diverso dalle immagini? Mi sembra strano perchè le ho estrapolate dallo stesso file.
Con un mio amico abbiamo aggiunto questa variabile: test As Boolean

Codice: Seleziona tutto

Sub estraisomma()

     nummax = Cells(1, 19)
     numart = Cells(2, 19)
     For i = 1 To numart
          quantita(i) = 0
          importo(i) = 0
     Next i
    i = 1
     While i <= nummax
         If (IsNumeric(Cells(i, 2)) And Cells(i, 2) <> "") Then
             j = Cells(i, 2)
         End If
         test = IsNumeric(Cells(i, 12)
la condizione non viene mai verificata per nessuna cella, da cosa può dipendere?

Re: Macro non funzionante

Inviato: domenica 11 novembre 2018, 17:33
da Eramad
Dal basso della mia ignoranza penso che capendo bene cosa deve fare questa macro, essendo solo somme e prodotti con relative verifiche, non sia complicatissima da riscrivere.
E penso che riscriverla da zero sia la via migliore...

Re: Macro non funzionante

Inviato: domenica 11 novembre 2018, 18:01
da theirish
Alla fine è come dici tu, fa solo un controllo su somme e prodotti. Speravo che avendo già la base si potesse sistemare velocemente. Se avessi avuto qualche conoscenza di BASIC avrei potuto provarci io ma penso che dovrò cercare qualcuno che lo faccia al mio posto.

Re: Macro non funzionante

Inviato: domenica 11 novembre 2018, 18:07
da patel
te lo posso fare anche io se alleghi un file con i dati ed i risultati desiderati e con spiegazioni a prova di non geometra.
sarebbe gradito anche un file excel funzionante

Re: Macro non funzionante

Inviato: domenica 11 novembre 2018, 18:11
da Eramad
non è difficile.
Con le guide e wiki che si trovano facilmente, la scrivi in una oretta.
Poi trovi qualche esempio qua e la e rubi un po di codice e vedrai che piano piano impari.
Io sto imparando lentamente facendo così. Leggo guide e wiki e ogni volta che devo fare qualcosa cerco il comando relativo, me lo studio due minuti, faccio un paio di prove e arrivo al risultato.

Se vuoi che te lo faccia qualcuno al posto tuo...non imparerai mai e un domani che hai bisogno di anche una piccola modifica dovrai sempre rivolgerti ad altri.

Comunque questo qualcuno avrà sicuramente bisogno di capire bene ogni singolo passaggio che la macro deve eseguire e sapere ogni singola cella che deve prendere in considerazione.
Quindi ci vuole una spiegazione il più dettagliata possibile e meno contorta possibile ;)

Edit:

Una curiosità...ma perchè hai bisogno di una macro che controlla le somme e i prodotti?
Cioè, non basterebbe mettere le formule in quelle caselle e fare in modo che si calcoli automaticamente i risultati? così sei sicuro che non ci sono errori...

Re: Macro non funzionante

Inviato: domenica 11 novembre 2018, 18:23
da patel
theirish ha scritto:la macro controllaprodotti fa una verifica dei prodotti moltiplicando le colonne 4,6,8,10
di quale foglio ?
theirish ha scritto:lLa macro controllasomme verifica le somme di ogni articolo sommando i prodotti(colonna 12 per ogni singolo articolo)
di quale foglio ?. -----

Re: Macro non funzionante

Inviato: domenica 11 novembre 2018, 18:24
da patel
Eramad ha scritto: Una curiosità...ma perchè hai bisogno di una macro che controlla le somme e i prodotti?
Cioè, non basterebbe mettere le formule in quelle caselle e fare in modo che si calcoli automaticamente i risultati? così sei sicuro che non ci sono errori...
Ottima osservazione :bravo:
inoltre il messaggio di errore non ti dice dov'è.
in conclusione non abbiamo capito lo scopo della discussione

Re: Macro non funzionante

Inviato: domenica 11 novembre 2018, 19:09
da theirish
@Eramad : sicuramente dovrò imparare almeno le basi della programmazione, l'ho già messo nella lista delle cose da fare, ma preferirei partire con qualcosa di più semplice.
@patel : le macro controllano somme e prodotti sul foglio "Computo Metrico", il foglio "Elenco Prezzi" serve ad inserire la descrizione delle voci che poi verranno usate nell'altro foglio.

Per entrambi: le formule automatiche per somme e prodotti ci sono già, solo che nel foglio "Computo Metrico" vengono aggiunte ed eliminate righe a seconda del lavoro che viene effettuato e quindi c'è il rischio che qualche prodotto o qualche somma non sia corretta. Visto che la somma finale è quella che il cliente dovrà spendere per ristrutturare casa è meglio che non ci siano errori nei conti e controllare singolarmente ogni somma o prodotto prenderebbe molto tempo. Controllare i conti di un file con decine di centinaia di righe non è il massimo.

Re: Macro non funzionante

Inviato: domenica 11 novembre 2018, 19:11
da theirish
patel ha scritto:te lo posso fare anche io se alleghi un file con i dati ed i risultati desiderati e con spiegazioni a prova di non geometra.
sarebbe gradito anche un file excel funzionante
Domani ti allego un file excel perfettamente funzionante. Grazie.

Re: Macro non funzionante

Inviato: domenica 11 novembre 2018, 19:29
da patel
che abbia anche un errore

Re: Macro non funzionante

Inviato: domenica 11 novembre 2018, 19:50
da patel
è la funzione isnumeric che libre non capisce, prova questa

Codice: Seleziona tutto

Option VBASupport 1

Dim importo(1 To 1000) As Double, quantita(1 To 1000) As Double, nummax As Integer, numaart As Integer, somma As Double
 
 
 Sub estraisomma()
     CompatibilityMode(True)
     nummax = Cells(1, 19)
     numart = Cells(2, 19)
     For i = 1 To numart
          quantita(i) = 0
          importo(i) = 0
     Next i
    i = 1
     While i <= nummax
         If (IsActualNumeric(Cells(i, 2)) And Cells(i, 2) <> "") Then
             j = Cells(i, 2)
         End If
         If (IsActualNumeric(Cells(i, 12)) And (IsActualNumeric(Cells(i, 14)) And Cells(i, 14) <> "")) Then
                 importo(j) = importo(j) + Cells(i, 16)
                 quantita(j) = quantita(j) + Cells(i, 12)
          End If
         i = i + 1
     Wend
         For i = 1 To numart
         Cells(i, 20) = i
         Cells(i, 21) = quantita(i)
         Cells(i, 22) = Worksheets("Elenco prezzi").Cells(11 + i * 3 - 2, 6)
         Cells(i, 23) = Cells(i, 21) * Cells(i, 22)
         Cells(i, 24) = importo(i)
         If Abs(Cells(i, 24) - Cells(i, 23)) > 1000 Then
                     Cells(i, 20).Select
                     Beep
                     MsgBox ("Errore")
         End If
 
     Next i
 
 End Sub
 
 Sub controllasomme()
 
     nummax = Cells(1, 19)
     numart = Cells(2, 19)
          somma = 0
          j = 0
    i = 1
     While i <= nummax
         If (IsActualNumeric(Cells(i, 2)) And Cells(i, 2) <> "") Then
             somma = 0
         End If
        
         If (Cells(i, 4) = "") And ((Cells(i, 6) = "") And (Cells(i, 8) = "") And (Cells(i, 10) = "") And (IsActualNumeric(Cells(i, 12)) And Cells(i, 12) <> "")) Then
                 Cells(i, 19) = somma
                 If (Abs(somma - Cells(i, 12)) > 0.005) And (somma <> 0) Then
                     Cells(i, 12).Select
                     Beep
                     MsgBox ("Errore di somma")
                 End If
                 
         End If
         If (IsActualNumeric(Cells(i, 12)) And Cells(i, 12) <> "") Then
                 somma = somma + Cells(i, 12)
                 Cells(i, 12).Select
         End If
         
         i = i + 1
         j = j + 1
     Wend
 End Sub
 Sub controllaprodotti()
 
     nummax = Cells(1, 19)
     numart = Cells(2, 19)
    i = 1
     While i <= nummax
         prodotto = 0
         If (IsActualNumeric(Cells(i, 12)) And (Cells(i, 12) <> "")) Then
             If (((IsActualNumeric(Cells(i, 4)) Or (Cells(i, 4) = ""))) And ((IsActualNumeric(Cells(i, 6)) Or (Cells(i, 6) = ""))) And ((IsActualNumeric(Cells(i, 8)) Or (Cells(i, 8) = "")) And (IsActualNumeric(Cells(i, 10)) Or (Cells(i, 10) = "")))) Then
                 Cells(i, 12).Select
                 If Cells(i, 4) <> "" Then a = Cells(i, 4) Else a = 1
                 If Cells(i, 6) <> "" Then b = Cells(i, 6) Else b = 1
                 If Cells(i, 8) <> "" Then c = Cells(i, 8) Else c = 1
                 If Cells(i, 10) <> "" Then d = Cells(i, 10) Else d = 1
                  prodotto = a * b * c * d
                 If (Abs(prodotto - Cells(i, 12)) > 0.005) And ((Cells(i, 4) <> "") Or (Cells(i, 6) <> "") Or (Cells(i, 8) <> "") Or (Cells(i, 10) <> "")) Then
                     Cells(i, 12).Select
                     Cells(i, 18) = prodotto
                     Beep
                     MsgBox ("Errore di prodotto")
                 End If
             End If
         End If
         i = i + 1
     Wend
 End Sub
 Public Function IsActualNumeric(Expression) As Boolean
'**********************
'Code Courtesy of
'  Paul Eugin
'**********************
    Dim retBool As Boolean, iCtr As Long
    
    If Not IsNull(Expression) Then    
        For iCtr = 1 To Len(Expression)
            Select Case Asc(Mid(Expression, iCtr, 1))
                Case 48 To 57, 46
                    retBool = True
                Case Else
                    retBool = False
                    Exit For
            End Select
        Next
    End If
    IsActualNumeric = retBool
End Function

Re: Macro non funzionante

Inviato: domenica 11 novembre 2018, 20:06
da Eramad
theirish ha scritto:Per entrambi: le formule automatiche per somme e prodotti ci sono già, solo che nel foglio "Computo Metrico" vengono aggiunte ed eliminate righe a seconda del lavoro che viene effettuato e quindi c'è il rischio che qualche prodotto o qualche somma non sia corretta.
Dunque...

- Se aggiungete righe, anche la macro potrebbe non andare prorpio bene perchè se nella macro indichi delle celle, quelle che aggiungete dopo non sono considerate nella macro.
- Se quando aggiungete le righe, rimettete le formule, risolvete comunque visto che i calcoli li fa ancora automaticamente.
- I totali sono dati da range di celle quindi se aggiungete celle entro quel range, una formula si aggiorna perchè vede la variazione mentre una macro no. Esempio:

Hai dei numeri nelle celle da A1 ad A10. Hai una formula =Somma(A1:A10) e una macro che somma dette celle.
Se aggiungi una riga tra la 7 e la 8 per esempio..la formula si aggiorna automaticamente in =Somma(A1:A11) mentre la macro no. Quindi in questo caso è più corretta una formula.
Con la macro si potrebbe ovviare a questo errore ma certo in maniera molto più contorta.

Continuo a credere che le formule siano la cosa migliore in questo caso visto che sarebbe la via più semplice e rapida e in caso di malfunzionamento la più facile da risolvere autonomamente/in minor tempo.

Re: Macro non funzionante

Inviato: lunedì 12 novembre 2018, 0:25
da theirish
@patel: con IsActualNumeric non lo riconosce, ho provato anche IsNumber e IsNumerical ma niente.
@Eramad: Su excel è sempre andata bene la macro, in 15 anni mai avuto un problema. Da non esperto mi sembra che anche la macro usata prenda in considerazione un range di celle perchè legge dall'intera colonna.

Vi allego un codice prova, mi sapete dire perchè qualsiasi valore io metta nella cella A1 mi da sempre FALSE? Il riferimento alla cella l'ho trovato su altro forum un pò datato, ma sempre suggerito da patel.

Codice: Seleziona tutto

Sub ExampleIsNumeric
	If IsNumeric(thiscomponent.Sheets.getByName("Foglio1").getCellByPosition(1,1)) then
	Print "True" Else    
        Print "False"
    End If
End Sub 

Re: Macro non funzionante

Inviato: lunedì 12 novembre 2018, 0:32
da Eramad
il riferimeno alla cella A1 è (0,0)

Nel codice che hai scritto fai riferimento alla cella B2

Re: Macro non funzionante

Inviato: lunedì 12 novembre 2018, 9:12
da theirish
Eramad ha scritto:il riferimeno alla cella A1 è (0,0)

Nel codice che hai scritto fai riferimento alla cella B2
Anche mettendo (0,0) da sempre FALSE.

Re: Macro non funzionante

Inviato: lunedì 12 novembre 2018, 9:26
da Eramad
Dalla fretta avevo guardato la macro solo a metà.

Codice: Seleziona tutto

Sub ExampleIsNumeric
   If IsNumeric(thiscomponent.Sheets(0).getCellByPosition(1,1).value) then
   Print "True" Else    
        Print "False"
    End If
End Sub
Devi aggiungere .value per far prendere in considerazione il valore nella cella.

Re: Macro non funzionante

Inviato: lunedì 12 novembre 2018, 9:28
da theirish
@patel :Allego il file che mi hai chiesto con errori sia nella macro "controllaprodotti" sia in quella "controllasomme". L'errore di prodotto è nella cella L18, mentre l'errore di somma è nella cella L25. Eseguendo la macro verranno segnalati altri errori di somma ma non prenderli in considerazione.

Re: Macro non funzionante

Inviato: lunedì 12 novembre 2018, 17:22
da patel
theirish ha scritto:@patel: con IsActualNumeric non lo riconosce
ma hai aggiunto la funzione ? a me sembra che giri bene senza errori

Re: Macro non funzionante

Inviato: lunedì 12 novembre 2018, 21:23
da theirish
Allora, ho aggiunto la funzione, la macro gira, controlla prodotti e somme ma se ci sono degli errori non da il messaggio. La macro che genera i risultati riempie solo parte delle celle dalla T alla X. Che ci sia qualcosa da cambiare nei valori delle funzione inserita? Un passo in avanti comunque è stato fatto.

Re: Macro non funzionante

Inviato: martedì 13 novembre 2018, 9:56
da patel
Purtroppo non è stato fatto alcun passo avanti, i risultati sono diversi e non ho capito perché, inoltre ho controllato e la funzione IsNumber esiste anche in Libre, però evidentemente si comporta in modo diverso da Excel.

Re: Macro non funzionante

Inviato: martedì 13 novembre 2018, 9:59
da theirish
Hai dato un occhiata a quel file excel che ho allegato ieri? Giusto per farti un idea di come funzionano quelle macro.