Condividi:        

Da Function a Sub

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Da Function a Sub

Postdi Ricky0185 » 08/11/22 13:21

Buongiorno,
chiedo se è possibile inibire una funzione posizionata in un foglio poiché interferisce con altra macro rendendola inutilizzabile. La funzione somma tutti i valori delle celle che si trovano in una colonna e che tutte hanno lo lo stesso colore dello sfondo ed è

Codice: Seleziona tutto
Function SommaCellePerColore(rData As Range, cellRefColor As Range)
        Dim indRefColor As Long
        Dim cellaCorrente As Range
        Dim sumRes, noVal As Boolean    '
        Application.Volatile
        sumRes = 0
        indRefColor = cellRefColor.Cells(1, 1).Interior.Color
        For Each cellaCorrente In rData
            If indRefColor = cellaCorrente.Interior.Color Then
                sumRes = WorksheetFunction.Sum(cellaCorrente, sumRes)
                noVal = False
            Else
                noVal = True
            End If
        Next cellaCorrente
        If noVal Then
            SommaCellePerColore = ""
        Else
            SommaCellePerColore = sumRes
        End If
   End Function


Poi nella cella dove voglio il risultato scrivo
Codice: Seleziona tutto
=SommaCellePerColore($D$503:D2617;F2617)

Dove D:D è l’area della colonna D in esame ed F è il colore dello sfondo della cella campione.

O se non è possibile trasformare la Function in una Sub, da lanciare con un bottone, che mi metta il risultato in
Range("B504").End(xlDown).Offset(0, 10) = SommaCellePerColore.Value
Cordiali saluti
R
Ricky0185
Utente Senior
 
Post: 259
Iscritto il: 10/12/19 20:38

Sponsor
 

Re: Da Function a Sub

Postdi Anthony47 » 08/11/22 15:45

Togli Application.Volatile dal codice della Function.
Togli la formula che usa la funzione

Aggiungi questa Sub:
Codice: Seleziona tutto
Sub CpC()
Range("Z1") = SommaCellePerColore(Range("$D$503:D2617"), Range("F2617"))
End Sub

Sostituisci Range("Z1") con la destinazione in cui vuoi scrivere il risultato

Aggancia questa sub a un pulsante

Tutto questo dando per scontato che la Function originale faccia proprio quello che ti serve

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Da Function a Sub

Postdi Ricky0185 » 08/11/22 18:35

Tutto questo dando per scontato che la Function originale faccia proprio quello che ti serve

Funziona funziona, vedi il file dove ci sono le due soluzioni.
Ciao e grazie 1000, come sempre risolutivo.
R
Ricky0185
Utente Senior
 
Post: 259
Iscritto il: 10/12/19 20:38

Re: Da Function a Sub

Postdi Anthony47 » 09/11/22 14:33

La mia domanda sul corretto funzionamento della Function nasceva da questo codice:
Codice: Seleziona tutto
        For Each cellaCorrente In rData
            If indRefColor = cellaCorrente.Interior.Color Then
                sumRes = WorksheetFunction.Sum(cellaCorrente, sumRes)
                noVal = False
            Else
                noVal = True
            End If
        Next cellaCorrente
        Next cellaCorrente
        If noVal Then
            SommaCellePerColore = ""
        Else
            SommaCellePerColore = sumRes
        End If

In pratica, se l'ultima cella non ha il colore in esame allora tutto il conteggio e' azzerato, e mi sembra strano che debba essere così
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Da Function a Sub

Postdi Ricky0185 » 10/11/22 09:42

In effetti si ingarbugliava tutto, dopo aver lanciato quella macro altre macro non funzionavano più, quella stessa anche, etc. tanto è vero che sono passato alla
Codice: Seleziona tutto
Function SumByColor(CellColor As Range, rRange As Range)
Dim cl As Range
Dim cSum As Double
Dim ColIndex As Integer
ColIndex = CellColor.Interior.ColorIndex
For Each cl In rRange
 If cl.Interior.ColorIndex = ColIndex Then
 cSum = WorksheetFunction.Sum(cl, cSum)
 End If
Next cl
SumByColor = cSum
End Function

inserendo nelle celle in esame
Codice: Seleziona tutto
=SUMBYCOLOR(F505;$D$503:D505)

tirata giù fino a fine lista.
Ora tutto funziona, ma vorrei cancellare i doppioni nella colonna dove sono riportate le somme a scalare, la L e dove cioè c'è la SUMBYCOLOR.
Ho provato con
Codice: Seleziona tutto
Set currentCell = Worksheets("Libro Cassa").Range("D504")
Do While Not IsEmpty(currentCell)
Set nextCell = currentCell.Offset(1, 0)
If nextCell.Value = currentCell.Value Then
currentCell.Value.Delete
End If
Set currentCell = nextCell
Loop
ma resta immobile, con la formattazione condizionale idem, etc.
Con il TRUE/FALSE nella colonna accanto, ma poi dovrei inserire altra macro per cancella i valori del FALSE nella colonna in esame.
Insomma sto cercando come cancellare i doppioni in una colonna dove in tutte le celle c'è una formula.
Ti ringrazio dell'interessamento.
Ciao
R
Sempre XP + Excel2003
Ricky0185
Utente Senior
 
Post: 259
Iscritto il: 10/12/19 20:38

Re: Da Function a Sub

Postdi Anthony47 » 10/11/22 11:02

Purtroppo non resco a immaginare la struttura dei tuoi dati (il file che avevi allegato qualche giorno fa era solo dimostrativo), quindi non riesco a proporre nulla di utile.
Tieni presente, a proposito della formattazione condizionale, che con la tua versione XL non hai chance di leggere i colori da formattazione condizionale (leggi cioe' quelli di partenza); dovresti sapere le condizioni di formattazione e lavorare su quelle.
Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Da Function a Sub

Postdi Ricky0185 » 10/11/22 13:32

La Formattazione l’ho tirata in ballo poiché è uno dei metodi per reperire i doppioni nella colonna L.
Mettendo nella prima cella della colonna (d’appoggio) M (la M504) la formula =L504=L503 (L503 è vuota) che ti da Falso poiché non è un doppione e Vero se fosse un duplicato e copiando la formula fino a fine colonna avrai questa situazione
Immagine
Quidi vorrei, magari con macro, eliminare tutti i valori che sono a sinistra di VERO, che ti ricordo sono il risultato di formule, ma senza intervenire sull'intera riga.
Poi cancello la colonna d'appoggio
Ricky0185
Utente Senior
 
Post: 259
Iscritto il: 10/12/19 20:38

Re: Da Function a Sub

Postdi Anthony47 » 10/11/22 14:31

Quidi vorrei, magari con macro, eliminare tutti i valori che sono a sinistra di VERO, che ti ricordo sono il risultato di formule, ma senza intervenire sull'intera riga.
Quindi vorresti cancellare la formula? Che pero' quandi ti servira' non ci sarebbe piu'...

Non puoi invece modificare la formula, tipo, in L504
Codice: Seleziona tutto
=Se(TuaFormula<>Max(L$503:L503);TuaFormula;"")


Oppure puoi usare la formattazione condizionale per nascondere il contenuto di una cella se e' pari a quello della cella precedente
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Da Function a Sub

Postdi Ricky0185 » 10/11/22 18:40

Non puoi invece modificare la formula, tipo, in L504
=Se(TuaFormula<>Max(L$503:L503);TuaFormula;"")

Qui non ho capito dove mettere la formula dato che in L504 c'è già la SUMBYCOLOR.
La formattazione condizionale in Excel2003 non consente di eliminare o nascondere il contenuto, solo colorare.
Immagine
Altra prova con questa macro da completare, che per ora li trova elencandoli su nuovo foglio.
Codice: Seleziona tutto
Sub Elimina_Duplicati()
Dim rCell As Range
Dim colUnique As Collection
Dim sh As Worksheet
Dim i As Long
If TypeName(Selection) = "Range" Then
Set colUnique = New Collection
For Each rCell In Selection.Cells
On Error Resume Next
colUnique.Add rCell.Value, CStr(rCell.Value)
On Error GoTo 0
Next rCell
Set sh = ActiveWorkbook.Worksheets.Add
For i = 1 To colUnique.Count
sh.Range("A1").Offset(i, 0).Value = colUnique(i)
Next i
sh.Range(sh.Range("A2"), sh.Range("A2").End(xlDown)) _
.Sort sh.Range("A2"), xlAscending, , , , , , xlNo
End If
End Sub

La macro per pulire o nascondere la cella a sinistra di quella che contiene VERO è semplicissima, ma non funziona. Idem la formattazione condizionale non colora, idem il filtro avanzato (poi il filtro nascondebbe l'intera riga, io invece vorrei vederle tutte).
Insomma credo che quella formula SUMBYCOLOR non voglia permettere nessuna manipolazione delle celle in cui regna.
Il filone di lavoro richiederebbe troppo tempo per spersonalizzarlo, ma comunque continuerò con le prove.
E ti terrò informato.
Ciao
R
Ricky0185
Utente Senior
 
Post: 259
Iscritto il: 10/12/19 20:38

Re: Da Function a Sub

Postdi Anthony47 » 10/11/22 19:44

La formattazione condizionale in Excel2003 non consente di eliminare o nascondere il contenuto, solo colorare.

Non e' vero:
Quando devi scegliere il formato, clicca sul Tab Carattere; qui avrai la possibilita' di scegliere tra l'altro un colore, e invece che il colore impostato sceglierei "Bianco" se lo sfondo delle celle e' bianco (o grigino su vuoi far vedere che c'e' qualcosa che pero' non vuoi vedere)


Qui non ho capito dove mettere la formula dato che in L504 c'è già la SUMBYCOLOR
In L504 userai:
Codice: Seleziona tutto
=Se(TuaFormulaFattaConSUMBYCOLOR<>Max(L$503:L503);TuaFormulaFattaConSUMBYCOLOR;"")
NB: Questo e' basato sul fatto mostrato dai tuoi allegati che in colonna L i valori calcolati con l'attuale formula siano crescenti
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Da Function a Sub

Postdi Ricky0185 » 10/11/22 21:30

Ecco il file molto dimagrito, ho lasciato un centinaio di righe. Dovrebbero diventare bianche le celle che contengono i doppioni in colonna C lasciando però visibile la relativa riga.
Ciao
R
Ricky0185
Utente Senior
 
Post: 259
Iscritto il: 10/12/19 20:38

Re: Da Function a Sub

Postdi Anthony47 » 10/11/22 23:47

Ho applicato il metodo =Se(TuaFormulaFattaConSUMBYCOLOR<>Max(L$503:L503);TuaFormulaFattaConSUMBYCOLOR;"") adattandola alla colonna C del file che hai allegato e ottengo quanto in immagine:
Immagine

Cos'e' che non quadra?
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Da Function a Sub

Postdi Ricky0185 » 11/11/22 08:36

Mi sono già dato una noce in testa (a Bologna=un cricco con le nocche del pugno chiuso).
Copiavo la formula suggerita pari pari, cioè
Codice: Seleziona tutto
=Se(TuaFormulaFattaConSUMBYCOLOR<>Max(L$503:L503);TuaFormulaFattaConSUMBYCOLOR;"")
e per forza risultava sempre #NOME?
Ora tutto a posto. Scusami per l'insistenza.
Ti ringrazio e saluto
R
Ricky0185
Utente Senior
 
Post: 259
Iscritto il: 10/12/19 20:38

Re: Da Function a Sub

Postdi Anthony47 » 11/11/22 08:42

Mi sono già dato una noce in testa (a Bologna=un cricco con le nocche del pugno chiuso).
Bravo, così si fa...
:D :D
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "Da Function a Sub":

function
Autore: giorgioa
Forum: Applicazioni Office Windows
Risposte: 42

Chi c’è in linea

Visitano il forum: Nessuno e 84 ospiti