Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Routine in VBA e Macro

132 views
Skip to first unread message

Sandro

unread,
Aug 19, 2003, 7:23:20 AM8/19/03
to
Quando studiare un po di excel se non nelle ferie? :-)

Aprofitto ancora di voi per risolvere alcuni quesiti:

1) ho due fogli di lavoro in cui nel primo [Foglio1] ho un elenco molto
esteso di dati, nel secondo [Foglio2] un'altro elenco di dati.
Ora vorrei approntare una routine in VBA che mi confronti i dati del
Foglio2 con il Foglio1 e trovando dei dati doppi (come chiave di confronto
uso la colonna A) li copi e/o sposti (tutta la riga) nel Foglio3.

Ho trovato questa routine per trovare i campi doppi ed eliminarli:


Sub EliminaDoppioni()
'Questo codice ordina i dati nella seconda
'colonna del foglio Dati ed elimina le righe che
'contengono dati duplicati.
Application.ScreenUpdating = False
Range("B4:B800").Select
Selection.Sort Key1:=Range("B4"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal

Set currentCell = Worksheets("Dati").Range("B4")
Do While Not IsEmpty(currentCell)
Set nextCell = currentCell.Offset(1, 0)
If nextCell.Value = currentCell.Value Then
currentCell.EntireRow.Delete
End If
Set currentCell = nextCell
Loop
Range("B4").Select

End Sub


Pensavo di adattarna al mio scopo, ma non sono ancora riuscito!

2) Sempre nello stesso esempio di prima ho creato delle formule che eseguono
un confronto riga x riga nel Foglio3 ricopiando il contenuto se è un
doppione e lasciando bianco in caso contrario (metodo molto pesante, per
questo sto tentando di risolvere con la routine in VBA).
Esiste un modo per fare una macro che ricopi la riga campione (la prima!)
tante volte quanti record (righe piene) esistono nel Foglio2?


Grazie!
Buone vacanze!


Barbara

unread,
Aug 19, 2003, 11:52:18 AM8/19/03
to

"Sandro" <k@k.k> ha scritto nel messaggio
news:IMn0b.250948$lK4.7...@twister1.libero.it...

> Quando studiare un po di excel se non nelle ferie? :-)
>
> Aprofitto ancora di voi per risolvere alcuni quesiti:
>
> 1) ho due fogli di lavoro in cui nel primo [Foglio1] ho un elenco molto
> esteso di dati, nel secondo [Foglio2] un'altro elenco di dati.
> Ora vorrei approntare una routine in VBA che mi confronti i dati del
> Foglio2 con il Foglio1 e trovando dei dati doppi (come chiave di confronto
> uso la colonna A) li copi e/o sposti (tutta la riga) nel Foglio3.
>
>
> 2) Sempre nello stesso esempio di prima ho creato delle formule che
eseguono
> un confronto riga x riga nel Foglio3 ricopiando il contenuto se č un

> doppione e lasciando bianco in caso contrario (metodo molto pesante, per
> questo sto tentando di risolvere con la routine in VBA).
> Esiste un modo per fare una macro che ricopi la riga campione (la prima!)
> tante volte quanti record (righe piene) esistono nel Foglio2?
>
>
Ciao, ti chiedo qualche precisazione.
1. per "dati doppi", intendi quelli che sono presenti sia nel foglio1 che
nel foglio2? (a prescindere, quindi, dal fatto che si ripetano all'interno
dello stesso foglio?)
cioč, nell'esempio:
foglio1 foglio2
a b
b f
a g
c
e

qual č il dato doppio? b? o anche a?
2. i dati sono numeri o testo?
[non č che tu non ti sia spiegato bene, voglio solo essere sicura di aver
capito!]

Facci sapere.
Barbara


Sandro

unread,
Aug 19, 2003, 5:48:33 PM8/19/03
to

"Barbara" <giuliano.anton...@libero.it> ha scritto nel messaggio
news:e1kc7nmZ...@TK2MSFTNGP09.phx.gbl...

>
> "Sandro" <k@k.k> ha scritto nel messaggio
> news:IMn0b.250948$lK4.7...@twister1.libero.it...

> Ciao, ti chiedo qualche precisazione.


> 1. per "dati doppi", intendi quelli che sono presenti sia nel foglio1 che
> nel foglio2? (a prescindere, quindi, dal fatto che si ripetano all'interno
> dello stesso foglio?)
> cioč, nell'esempio:
> foglio1 foglio2
> a b
> b f
> a g
> c
> e
>
> qual č il dato doppio? b? o anche a?

Nello stesso foglio non ci sono dati doppi (almeno considerando solo la
colonna A, che č poi la chiave ti tutto, come una sorta di codice cliente
per fare un esempio)
quindi di dato doppio č solo b.


> 2. i dati sono numeri o testo?
> [non č che tu non ti sia spiegato bene, voglio solo essere sicura di aver
> capito!]


I dati sono misti, come campi di un database

es.

colonna A colonna B colonna C colonna D

AA1AAA Via Milano 15 Rossi Emilio
BB2BBB Corso Torino 40 Bianchi Giuseppe
CC3CCC Piazza Verona 60 Alvaro Pino


Il mio archivio si estende dalla colonna A a P, ma non credo sia rilevante,
posso modificare il codice o va bene anche ricopiare/spostare l'intera riga!

Sandro

unread,
Aug 20, 2003, 7:03:55 AM8/20/03
to

"Sandro" <k@k.k> ha scritto nel messaggio
news:IMn0b.250948$lK4.7...@twister1.libero.it...

>


> 2) Sempre nello stesso esempio di prima ho creato delle formule che
eseguono
> un confronto riga x riga nel Foglio3 ricopiando il contenuto se è un
> doppione e lasciando bianco in caso contrario (metodo molto pesante, per
> questo sto tentando di risolvere con la routine in VBA).
> Esiste un modo per fare una macro che ricopi la riga campione (la prima!)
> tante volte quanti record (righe piene) esistono nel Foglio2?

ho trovato una solozione parziale:

Sub SelezionaEincolla()
'

Application.ScreenUpdating = False 'serve per evitare i saltellamenti a
schermo

Sheets("Foglio.Dati1").Select
Dim righe As Integer
righe = 1
Dim CEL As Object
Dim fine As Object

Set zona = Range(Range("A2"), Range("A2").End(xlDown))
For Each CEL In zona
If CEL.Offset(0, 0) <> "" Then
righe = righe + 1
End If
Next

MsgBox " " & righe, vbInformation ' mi dice quante righe ha trovato nel
primo foglio

Sheets("Foglio.Dati2").Select
Range("A3:S3").Select
Selection.Copy

Range("A4:S1000").Select ' questa riga seleziona dove copiare i dati


'ActiveSheet.Paste ' incolla

End Sub


Ora la variabile righe riporta quante righe occupate nel primo foglio vanno
ricopiate nel secondo, ma come faccio a sostituire nella riga di codice

Range("A4:S1000").Select ' questa riga seleziona dove copiare i dati

il valore "S1000" con la variabile righe ?


Barbara

unread,
Aug 20, 2003, 11:06:59 AM8/20/03
to

"Sandro" <k@k.k> ha scritto nel messaggio
news:RWw0b.252271$lK4.7...@twister1.libero.it...

>
> "Barbara" <giuliano.anton...@libero.it> ha scritto nel
messaggio
> news:e1kc7nmZ...@TK2MSFTNGP09.phx.gbl...
> >
> > "Sandro" <k@k.k> ha scritto nel messaggio
> > news:IMn0b.250948$lK4.7...@twister1.libero.it...
>
> > Ciao, ti chiedo qualche precisazione.
> > 1. per "dati doppi", intendi quelli che sono presenti sia nel foglio1
che
> > nel foglio2? (a prescindere, quindi, dal fatto che si ripetano
all'interno
> > dello stesso foglio?)
> > cioè, nell'esempio:

> > foglio1 foglio2
> > a b
> > b f
> > a g
> > c
> > e
> >
> > qual è il dato doppio? b? o anche a?

>
> Nello stesso foglio non ci sono dati doppi (almeno considerando solo la
> colonna A, che è poi la chiave ti tutto, come una sorta di codice cliente
> per fare un esempio)
> quindi di dato doppio è solo b.
>

Volevo proporti una soluzione alla domanda 1, senza l'uso di VBA.
Chiamiamo "dati" la prima colonna del tuo database del Foglio1 dove hai i
dati, e "chiave" quella del Foglio2.
Seleziona l'intervallo di destinazione e scrivi (o incolla) questa formula
nella barra della formula premendo poi CTRL+MAIUSC+INVIO per inserirla come
matriciale:
=INDICE(dati;PICCOLO(NON(VAL.ERRORE(CONFRONTA(dati;chiave;)))*(RIF.RIGA(dati
)+1-MIN(RIF.RIGA(dati)));RIF.RIGA(dati)+1-MIN(RIF.RIGA(dati))+SOMMA(1*VAL.ER
RORE(CONFRONTA(dati;chiave;))));)

Per semplicità, puoi definire i nomi "dati" e "chiave" come ho fatto io,
altrimenti sostituiscili con i tuoi riferimenti.
Questa ti dà i dati doppi della prima colonna. Per le altre basta un
CERCA.VERT() o INDICE()+CONFRONTA().

Per VBA sicuramente riceverai consigli dagli altri.
Ciao
Barbara

Sandro

unread,
Aug 28, 2003, 5:47:35 PM8/28/03
to
> Volevo proporti una soluzione alla domanda 1, senza l'uso di VBA.
> Chiamiamo "dati" la prima colonna del tuo database del Foglio1 dove hai i
> dati, e "chiave" quella del Foglio2.
> Seleziona l'intervallo di destinazione e scrivi (o incolla) questa formula
> nella barra della formula premendo poi CTRL+MAIUSC+INVIO per inserirla
come
> matriciale:
>
=INDICE(dati;PICCOLO(NON(VAL.ERRORE(CONFRONTA(dati;chiave;)))*(RIF.RIGA(dati
> )+1-MIN(RIF.RIGA(dati)));RIF.RIGA(dati)+1-MIN(RIF.RIGA(dati))+SOMMA(1*VAL.
ER
> RORE(CONFRONTA(dati;chiave;))));)
>
> Per semplicità, puoi definire i nomi "dati" e "chiave" come ho fatto io,
> altrimenti sostituiscili con i tuoi riferimenti.
> Questa ti dà i dati doppi della prima colonna. Per le altre basta un
> CERCA.VERT() o INDICE()+CONFRONTA().
>
> Per VBA sicuramente riceverai consigli dagli altri.
> Ciao
> Barbara

Non ho capito bene come applicare le formule.
Sono riuscito a arragiarmi un pò! :-) ho risolto con il VBA

Cmq grazie anche a te per l'aiuto!


0 new messages