› Sviluppare funzionalita su Microsoft Office con VBA › calcolare in colonna
-
AutoreArticoli
-
Salve a tutti,
per quanto sto chiedendo ho cercato come farlo in formula
ma non sono riuscito a trovare la formula adatta.
Evidentemente ci vorrebbe un aiuto con VBA.
allego il file per aprire la discussione
con la premessa che in ogni colonna occorre fare dei conteggi
in base a quanto scritto in cella c3 che ora è = 3 ma che può essere cambiato
con 2 oppure 4, 5
Allegati:
You must be logged in to view attached files.Non ho capito niente nè del problema, delle difficoltà che hai incontrato, nè del risultato atteso. Fai un esempi concreto.
Salve Frac,
cerco di spiegare:
1)-la colonna D3 dovrò inserire in numero che può essere 1 oppure 2 quindi 3 eccetera fino
ad un massimo di 6;
2)-del numero indicato in D3 si deve fare la conta dei numeri 1 in modo consecutivo;
3)-quindi contare dalla cella D6 i tre uno come indicato in D3;
4)-il risultato di quando trova i tre uno va messo in colonna E a fianco al terzo uno
e mi sono reso conto che i dati della colonna G sostituiscono i dati di colonna E
e si deve contare dal primo uno che conta in quante celle ha trovato i tre uno,
per esempio a rigo 14 del foglio trova i tre uno da rigo 8 fino a rigo 14 e segnala
in rigo E14 sette;
quando ha trovato i primi tre uno ricomincia il conteggio e segnala sempre in colonna
E quando trova l'altro gruppo di tre uno in quante celle cioè tre;
NB quindi mettendo questi dati in colonna E la colonna G non serve;
5)-la colonna F invece conta tra un gruppo e l'altro quante celle vuote partendo sempre da rigo 6
quindi 6-7 F7 = 2; poi tra il primo gruppo e l'altro D15-D16 conta 2 celle vuote e in
F16 = 2 eccetera ecc
Ripeto che la colonna G viene assorbita dalla colonna E.
....
riporto l'allegato
Allegati:
You must be logged in to view attached files.Ciao
Se ho capito bene cosa vuoi fare, ti suggerisco questa macro (da allegare ad un Controllo Modulo - non ActiveX - oppure all'evento WorkSheet_Change del Foglio interessato)
Option Explicit Sub conta() Dim ur As Long, i As Long, j As Long, x As Long Dim nn As Integer, a As Integer, b As Integer, v As Integer ur = Cells(Rows.Count, 4).End(xlUp).Row nn = Cells(3, 4).Value For i = 6 To ur If a = 0 And Cells(i, 4) = "" Then v = v + 1 If Cells(i, 4) = 1 Then a = a + 1 If a = nn Then For j = i To 6 Step -1 If Cells(j, 4) = 1 Then b = b + 1 If b = 3 Then x = i - j + 1 Cells(i, 5) = x Cells(i - x, 6) = v a = 0: b = 0: x = 0: v = 0 Exit For End If End If Next j End If Next i End Sub
Prova e fai sapere. Ciao,
Mario
Salve Marius,
una comunicazione:
NB c'è stata una assenza del sito per 30-40 minuti circa .
Riguardo al mio quesito:
la macro funziona bene solo per il gruppo di 3 in 3
mentre è da rivedere quella con gruppo di 2 e gruppo di 4
questo vale anche per la colonna F gruppi a 2 e a 4
Salve
Ciao
Hai ragione. E' colpa delle tante prove.
Aggiusta questa riga If b = 3 Then così
If b = nn Then
Dovrebbe andar bene.
Ciao,
Mario
quindi da quello che fanno le 3 emoticons significa che va benissimo.
un altro dato che la macro deve lavorare per più colonne,
cioè la colonna D quella di ora poi la colonna G poi ancora La J eccetera
fino a ad un tot colonne il cui valore della VARIABILE la prende da C3;
l'altra variabile di D3 ora 3 sempre di rigo 3 sarà messa manualmente
anche in G3 poi J3 eccetera.
e poi basta.
Salve Marius,
senza pretesa, chiedo se hai letto il messaggio n 18800
e se è chiaro quanto chiedo.
giorgioantonio1
Ciao
No, non l'avevo letto. Lo leggo adesso.
Se, come dici, la macro va bene, dovrebbe essere sufficiente inserire in una cella - come fatto per D3, cioè cells(3,4) - ed impostare un ciclo per "spazzolare" le colonne interessate.
Al caso allega un file indicando quali sono le colonne che interessano.
Ciao,
Mario
Salve,
non ho saputo mettere mano inserendo un ciclo for
in quanto non mi ci trovo coll'usare celle (come spostare di colonna in colonna) con i dati mentre
l'avrei fatto con range.
Allegati:
You must be logged in to view attached files.Ciao
Stavolta non lo faccio!
Non per fare il duro ma per darti modo di ragionare e capire cosa deve fare il ciclo.
Intanto ti dico che eri partito bene inserendo il ciclo per le colonne PRIMA del ciclo delle righe, però ...
Andiamo con ordine.
Hai detto che non sai a priori quante saranno le colonne. Quindi dobbiamo trovare il modo per sapere fin dove dobbiamo eseguire il ciclo. Questa riga di codice te la dò (è di un amico che l'ha messa a disposizione):
LC = Cells(3, Cells.Columns.Count).End(xlToLeft).Column
Cosa vuol dire?
LC è la variabile alla quale assegneremo il risultato
Cells fa riferimento a tutto il Foglio ma limita la ricerca alla riga 3 (il primo termine) della conta delle colonne partendo dalla fine (end) e procedendo verso sinistra. Il risultato sarà l'ultima colonna della riga 3 occupata.
Adesso potremmo partire col ciclo ma ... non basta. Perchè? Perchè non dobbiamo verificare tutte le colonne dalla 3 fino alla fine perchè alcune colonne sono vuote, quindi dobbiamo dare uno step. Il codice è così:
For y = 4 to LC step 3
In tal modo passerà dalla colonna 3 alla 6, ecc.
Adesso prosegui da solo badando al fatto che la verifica della cella deve tener conto della colonna che cambia (non ci può più stare 4!) e anche del valore che prima era solo in D3 ma che adesso è nelle altre colonne.
Non temere. Sembra difficile (anche a spiegarlo) ma se ci ragioni ci riuscirai.
Tenta. Al caso sai cosa devi fare . Ciao,
Mario
Ciao
Ho notato che ci sono altre cose da tenere presenti (tu cancelli, giustamente, le colonne dove mettere i risultati ma le colonne cambiano; inoltre cambiando colonna alcune variabile devono essere azzerate).
Quand'ero piccolo facevo i "fioretti" (una cosa buona per scontare una monelleria . Ecco, questo è un fioretto!
Option Explicit Sub conta() Dim ur As Long, i As Long, j As Long, x As Long Dim nn As Integer, a As Integer, b As Integer, v As Integer, y As Integer Dim LC As Long ur = Cells(Rows.Count, 4).End(xlUp).Row LC = Cells(3, Cells.Columns.Count).End(xlToLeft).Column For y = 4 To LC Step 3 Range(Cells(6, y + 1), Cells(100, y + 2)).ClearContents nn = Cells(3, y).Value For i = 6 To ur If a = 0 And Cells(i, y) = "" Then v = v + 1 If Cells(i, y) = 1 Then a = a + 1 If a = nn Then For j = i To 6 Step -1 If Cells(j, y) = 1 Then b = b + 1 If b = nn Then x = i - j + 1 Cells(i, y + 1) = x Cells(i - x, y + 2) = v a = 0: b = 0: x = 0: v = 0 Exit For End If End If Next j End If Next i a = 0: b = 0: x = 0: v = 0 Next y ActiveCell.Offset(0, 3).Range("A1").Select End Sub
Prima tenta da solo (come ti ho suggerito) e poi prova la mia macro e dimmi se va bene.
Ciao,
Mario
Salve Marius,
dire che ci sarei arrivato da solo per me sarebbe stato un sogno,
intanto la variabile LC la consideravo o Integer poi Double mentre vedo che è Long.
Senza farti perdere tempo la tua macro la sto osservando e prendendo nota solo
che non ho capito che i dati li deve scrivere in colonna E cioè cells(5, y+1 ) a cells(100,y+2)
per clear poi in fondo alla macro
ActiveCell.Offset(0, 3).Range("A1").Select fa il saltello
come fa a capire che deve cominciare a cancellare e scrivere da colonna 5? cioè E.
2 parole se hai tempo.
Buona giornata
i dati li deve scrivere in colonna E cioè cells(5, y+1 ) a cells(100,y+2)
per clear poi in fondo alla macro
ActiveCell.Offset(0, 3).Range("A1").Select fa il saltello
Ciao
Non ho capito cosa intendi.
Dal file che hai allegato io ho immaginato che tu volessi (ogni tre colonne):
a) leggere il dato che che nella riga 3 per sapere quanti "1" deve contare
b) scrivere nella colonna "adiacente" quante sono le celle (vuote o piene) dove l' "1" raggiunge il numero di volte indicato nella riga 3
c) scrivere nella colonna "successiva" alla adiacente anzidetta quante sono le celle vuote.
Se quanto ho detto sopra è corretto, questo la macro esegue.
Se no, spiegami meglio cosa intendi oppure se vuoi dei commenti alle righe di codice.
Ciao,
Mario
" scrivere nella colonna "adiacente""
adiacente cioè la colonna E
dove si capisce che la colonna adiacente la D è la E?
Marius tutto perfetto la macro fa quello richiesto
No Problem
Ciao
Scusa ma voglio capire meglio.
La colonna adiacente a quella dove sono i dati è, di volta in volta, la E, la H, la K e così via fino alla AC (con le relative F, I, L fino alla AD)
Non solo la E.
Ciao,
Mario
Salve Marius,
non sono fuggito, ma dove vado?
Cortesemente sarebbe da completare il lavoro che da me nel modo
più assoluto potrei portare a termine.
Per esempio le colonne da conteggiare sono 90;
credevo di esserci riuscito ma poi con i controlli mi sono accorto che
per i primi 9 il conteggio (colonna E ed F) lo fa, mentre per il restante il secondo dato
fino a 90 non ne tiene conto dico quello tipo in colonna F non lo calcola;
poi siccome i calcoli che deve fare vertono su 90 colonne x 2 e 3-4 mila righe
e impiega 1, 30.
Domanda non ci sarebbe un codice che sia più veloce di questo?
e ci sarebbe un'altro calcolo che si dovrebbe mettere una riga sotto cioè la prima riga
vuota dopo l'ultimo dato.
Intanto potresti modificare tenendo conto che il calcolo da colonna D va fatto per 90 volte'
poi non saprei sul velocizzare, il poi dopo ne va della tua pazienza
Saluti
Giorgioantonio
Salve Marius,
nel precedente post ho detto una grandissima fesseria,
la macro l'ho riportata nuovamente dal sito e lanciata
funziona al 100%.
E anche come tempo di esecuzione non credo di fare in tempo a prendere il
caffè che la macro in 18-19 SECONDI fa quel che deve fare.
Quindi ti chiedo di accettare le mi scuse.
Allego un nuovo file perchè è la continua di quanto hai fatto prima.
Volendo puoi creare una macro a se che portandosi al primo rigo vuoto
della elaborazione fare quanto spiegato in allegato.
Se puoi - grazie
Giorgioantonio1
Allegati:
You must be logged in to view attached files.Salve Marcus,
forse fra i tanti messaggi ti sarà sfuggito un ulteriore mio S.O.S.
Se e quando puoi intervenire al 18976 dove ho allegato
anche il file e in fondo ultima riga ci sono degli esempi
per ciò che vorrei.
La macro la potresti fare anche separata o se vuoi collegarla
all'altra
Giorgioantonio
Ciao
Ho visto l'allegato ma non ci ho capito nulla!
Perchè nel file non c'è la macro che t'avevo suggerita (e che dici funziona)?
Cosa vorresti che facesse la macro? Spiegalo qui e non nel foglio facendo riferimento alle celle.
Ciao,
Mario
Salve Marcus,
avevo scritto che la macro non funzionava bene
e nello stesso tempo ci impiegava H 1, 30
questo perchè avevo combinato dei pasticci,
ho ripreso tale e quale la TUA macro e
funziona bene e ci impiega appena 19 secondi.L'aiuto che vorrei cioè la macro se la si vuole accodare alla precedente
altrimenti la si può ritenere funzinante da sola.Stando all'allegato la colonna A parte da rigo 6 e vengono alimentati
nel caso la riga dopo l'ultima piena è la riga 2306 riga vuota;-ottenere il conteggio 2 risultati da mettere in E2306 ed F2306;
-scrivo cosa farei con i tasti:(cortesemente usa i tasti come indicato sotto, questa è la migliore spiegazione)
seleziono E2305 CTRL+MAIU+FRECCIA IN SU e scendo di una cella che trova il numero (16)
in questo caso ho selezionato E2305:E2303 con questa selezione
seleziono anche D cioè la colonna D2305:E2303 e conto quanti 1 presenti se zero 1 =0;
e scrivo questo dato in E2306;
da questa selezione ritorno in, freccia a sx e ho riselezionato E2305:E2303 e conto quante
celle vuote di questa selezione e scrivo il dato in F2306.Mi scuso di questa spiegazione ma se lo scrivevo non credo mi sarei spiegato.
Ti è sufficiente rispettare la tastiera per capire ciò che desidero.
Idem con le altre colonne.
Giorgioantoni1Salve Mario,
se hai letto il post, la spiegazione ti è chiara?
giorgioantonio
Ciao GiorgioAntonio
Con la premessa che non ho capito bene cosa vuoi fare,
seguo i tuoi suggerimenti e m'è venuta fuori questa macro
Sub finale() 'individuo l'ultima cella piena della colonna A ur = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row For i = ur To 1 Step -1 'ciclo a ritroso If Cells(i, 4) <> "" Then 'se una cella NON è vuota For j = i To ur 'ciclo da quella cella alla fine If Cells(j, 4) = 1 Then a = a + 1 'conto gli 1 If Cells(j, 4) = "" Then b = b + 1 'conto le vuote Next j 'scrivo i dati ed esco Cells(ur + 2, 5) = a Cells(ur + 2, 6) = b Exit For End If Next i End Sub
Credo che faccia quello che chiedi (SOLO per la colonna D) ma porto a tua conoscenza che il risultato che hai indicato per le celle vuote mi sembra errato in quanto NON va contata la cella 2306; in questa riga ci va il totale.
Io ho indicato il risultato nella riga 2307 per farti notare la differenza (per mettere il risultato nella riga 2306 nelle due righe di codice prima di Exit For invece di +2 metti +1).
Fai sapere. Ciao,
Mario
c'è una cella in meno che conta le vuote.
Cioè partendo da 2305 a 2303 farebbe
2305-2304-2303,
il fatto che il calcolo lo fa alla seconda riga vuota non ha importanza
e comunque il 2 si porta a 1.
Però c'è da vedere come si comporta alla colonna successiva
e se ripete il conteggio di una cella in meno basterebbe fare alla fine +1
e poi perchè non fa il conteggio alle altre colonne?
il passo è sempre di 3 in 3.
Mi pare che ci sia la variabile LC che potresti inserire.
Non te ne volere ma non chiedermi di farlo da solo,
nell'altra macro nel mettere mano avevo combinato
dei grossi pasticci e come innanzi detto oltre a non funzionare bene
ci impiegava un'ora e mezza.
vedi un pò.
ciao
-
AutoreArticoli