Condividi:        

Aiuto Macro Excel 2007 in VBA

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

Aiuto Macro Excel 2007 in VBA

Postdi fuser1982 » 10/02/10 17:30

Ho un foglio dove sono contenuti, in una colonna un codice alfanumerico e in un'altra un numero;
devo realizzare una macro in excel che mi permetta di estrarre casualmente e senza ripetizioni, n valori dalla colonna contenente i numeri e mi deve fornire anche il codice alfanumerico relativo al numero estratto.
Ki mi aiuta?
Sono disperato.
Mi spiego meglio:
...ID............Valore..................ID Random............Valore Random
A001...........150.38.......................A655.. .................159.00
A002...........151.73.......................A007.. .................150.22
A003...........152.88.......................A001.. .................150.38
A004...........149.38.......................A006.. .................152.08
A005...........135.17.......................A002.. .................151.73
A006...........152.08.......................A005.. .................135.17
A007...........150.22.......................A004.. .................149.38
... ... ... ...
A655...........159.00.......................A003.. .................152.88
Quindi, se:
n=2
deve riportarmi soltanto:
..ID Random............Valore Random
.....A655........................159.00
.....A007........................150.22
fuser1982
Utente Junior
 
Post: 29
Iscritto il: 10/02/10 17:25

Sponsor
 

Re: Aiuto Macro Excel 2007 in VBA

Postdi Flash30005 » 10/02/10 23:30

Ciao Fuser e benvenuto

Se La colonna ID è in A
Valore in B
ID Valore in C
Valore Random in D
e i dati iniziano dalla riga 2 (la riga 1 usata come testata)
puoi utilizzare questo codice
Codice: Seleziona tutto
Sub Cerca()
Dim VID As String
VN = Range("F2").Value
Ln = Len(VN)
RT = Worksheets("Foglio1").Range("A" & Rows.Count).End(xlUp).Row
For RR = 2 To RT
   VID = Range("A" & RR).Value
   If VID = "" Then GoTo salta
   IDN = Val(Mid(VID, Len(VID) - Ln + 1, Ln))
   If VN = IDN Then
      [G2] = Range("C" & RR).Value
      [H2] = Range("D" & RR).Value
   End If
salta:
Next RR
End Sub


Devi solo inserire il valore da cercare in F2
otterrai in G e H i dati corrispondenti

Fai sapere
Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Aiuto Macro Excel 2007 in VBA

Postdi fuser1982 » 11/02/10 11:27

Prima di tutto ti ringrazio per la celerità della risposta.
Forse mi sono espresso male nel descrivere il problema, allora:
I valori che ho sono soltanto
ID in A, Valori in B ed n in C
a me occorre cambiare in qualche modo l'ordine di questi valori cioè, se nella prima riga della colonna "ID" ho per esempio "A001" e nella prima riga della colonna "Valori" ho "100", nella prima riga della colonna della riga "ID Random" mi deve restituire un valore random che va a pescare dalla colonna "ID" e nella colonna "Valore Random" mi deve riportare il valore che corrisponde alla colonna "Valore" che si trova nella stessa riga dove è stato estratto "ID Random".
Cioè:
ID Valore n ===============> ID Random Valore Random
A001 150 6 ===============> A655 170
A002 151 ===============> A250 100
A003 152 ===============> A001 150
A004 153 ===============> A305 138
A005 154 ===============> A002 151
A006 155 ===============> A004 153
...... ....... ........ .......
A655 170
Spero di essere stato un po più chiaro
fuser1982
Utente Junior
 
Post: 29
Iscritto il: 10/02/10 17:25

Re: Aiuto Macro Excel 2007 in VBA

Postdi Anthony47 » 11/02/10 16:17

I tuoi dati sono in col A e B, da riga 1 a riga 100.
In una colonna adiacente, es la D, inserisci la formula
Codice: Seleziona tutto
=casuale()
da D1 in giu'.
Poi in E1 usa una formula tipo
Codice: Seleziona tutto
 =INDICE(A$1:A$100;RANGO($D1;$D$1:$D$100))
Copia poi in F1, poi copia E1:F1 verso il basso.

Il tuo elenco verra' presentato in ordine casuale, cambiando pero' a ogni "Ricalcolo" eseguito da excel. Se vuoi congelare questi risultati, usa una di queste opzioni:
-copi i numeri casuali e li Incolli come valori
-imposti il ricalcolo in Manuale (Menu /Strumenti /Opzioni, tab Calcolo, spunta Manuale; in questo modo la sequenza cambiera' quando premi F9 (Ricalcola)

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

Re: Aiuto Macro Excel 2007 in VBA

Postdi fuser1982 » 12/02/10 10:34

Ho provato con la soluzione suggerita da Anthony ma non funziona perchè in alcune celle da valori nulli, cosa che nè capisco e nemmeno posso accettare.
Aspetto nuovi consigli o dritte.
fuser1982
Utente Junior
 
Post: 29
Iscritto il: 10/02/10 17:25

Re: Aiuto Macro Excel 2007 in VBA

Postdi Anthony47 » 12/02/10 11:46

Hai quel problema perche' usi le celle unite, di conseguenza il 50% di celle e' vuoto.
Elimina le celle unite (ed evitale per il fituro) e funzionera':
-seleziona le colonne A:G; Menu /Formato /Celle, tab Allineamento, togli la spunta a Unione celle, Ok
-metti il filtro sulla colonna A, scegli Vuote
-Seleziona le righe visibili, quelle che hanno il "Numero riga" in blu; Menu /Modifica /Elimina righe
Ti rimarranno solo le celle coi dati, compreso (se li hai gia' inseriti) i numeri e le estrazioni Casuali.

Poi se hai problemi estetici cambi l' altezza delle celle.

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

Re: Aiuto Macro Excel 2007 in VBA

Postdi fuser1982 » 13/02/10 14:37

Grazie mille, sei veramente GRANDE!!!
Avevo intuito che il problema era causato dall'unione delle celle, ho provveduto ad eliminare le celle unite e quindi di conseguenza quelle vuote e il problema non lo da più.
Grazie ancora
fuser1982
Utente Junior
 
Post: 29
Iscritto il: 10/02/10 17:25

Re: Aiuto Macro Excel 2007 in VBA

Postdi fuser1982 » 13/02/10 15:41

La soluzione consigliata da Anthony, quella relativa al disaccoppiamento delle celle è perfetta, ma per la ricerca casuale non posso implementarla tramite formule, ma deve essere contenuta dentro una macro, perchè questo lavoro deve essere ripetuto per più di cento fogli di calcolo, questo calcolo non deve essere eseguito per tutte le 655 righe ma solo per N righe determinate dal numero che viene inserito nella cella D2.
Inoltre, mi occorre questa macro per applicarla nella redazione della mia tesi di laurea.
fuser1982
Utente Junior
 
Post: 29
Iscritto il: 10/02/10 17:25

Re: Aiuto Macro Excel 2007 in VBA

Postdi Flash30005 » 13/02/10 16:15

Avevo iniziato ad esaminare il problema e ora ho adattato alle ultime specifiche (esclusa quella dei cento fogli :eeh: )
controlla se va bene per un foglio poi semmai...
Codice: Seleziona tutto
Sub CompRandom()
Dim VS As String
UR = Range("A" & Rows.Count).End(xlUp).Row
    Range("E2:F656").ClearContents
    Range("G2:G656").ClearContents
    'Range("D4").Select
NR = [D2] + 1
Application.Calculation = xlManual
TRoutine = Timer
TI = Timer
Rit = Range("I2").Value
Pausa:
Calculate
TF = Timer
If TF < TI + Rit Then GoTo Pausa
URE = Range("E" & Rows.Count).End(xlUp).Row + 1
VR = Range("C3").Value
VS = "A" & Format(VR, "000")
For I = 2 To URE
    If VS = Range("E" & I).Value Then GoTo Pausa
Next I
Range("E" & URE).Value = VS
Calculate
If Val(Range("G1")) >= [D2] Then GoTo Esci
TI = TF
GoTo Pausa
Esci:
For RE = 2 To Range("D2").Value + 1
    VE = Range("E" & RE).Value
    For VI = 2 To UR
        If VE = Range("A" & VI).Value Then
            Range("F" & RE).Value = Range("B" & VI).Value
            GoTo salta
        End If
    Next VI
salta:
Next RE
Application.Calculation = xlAutomatic
End Sub

Fai sapere
Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Aiuto Macro Excel 2007 in VBA

Postdi fuser1982 » 13/02/10 17:59

Questa macro è proprio quello che mi occorreva, se la volessi applicare a più fogli, 100 nello specifico, posso inserire questa istruzione all'interno della macro:
Sheets("Foglio1").Select
ovviamente cambiando ("Foglio1") con il nome del relativo foglio di calcolo?
fuser1982
Utente Junior
 
Post: 29
Iscritto il: 10/02/10 17:25

Re: Aiuto Macro Excel 2007 in VBA

Postdi Flash30005 » 13/02/10 18:12

Potresti anche utilizzare una sola macro per tutti i fogli con un for .. next
esempio
Codice: Seleziona tutto
Sub CompRandom()  '<<<<macro esistente
Dim VS As String  '<<<<riga esistente

For I = 1 To ActiveWorkbook.Worksheets.Count  '<<<<riga da aggiungere
Sheets(I).Select            '<<<<riga da aggiungere

UR = Range("A" & Rows.Count).End(xlUp).Row   '<<<<riga esistente
'... esecuzione intera macro esistente
Next RE    '<<<<riga esistente
Application.Calculation = xlAutomatic    '<<<<riga esistente

Next I             '<<<<riga da aggiungere prima di terminare

End Sub


Fai sapere
Ciao

P.s così eseguita vedrai i fogli apparire man mano che vengono elaborati se non vuoi avere queste schermate dovrai mettere il codice
Codice: Seleziona tutto
Application.ScreenUpdating = False

all'inizio della macro (subito sotto il nome macro)
e
Codice: Seleziona tutto
Application.ScreenUpdating = True

alla fine (prima dell End Sub)
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Aiuto Macro Excel 2007 in VBA

Postdi fuser1982 » 13/02/10 19:35

Utilizzare una sola macro sarebbe il massimo, ma non posso perche la dimensione campionaria in ogni foglio è differente quindi a mio avviso sono costretto ad applicare una macro a foglio, non potendo definire univocamente la matrice dei valori. Oppure esiste un metodo pure per ovviare a questo "problema"?
fuser1982
Utente Junior
 
Post: 29
Iscritto il: 10/02/10 17:25

Re: Aiuto Macro Excel 2007 in VBA

Postdi Flash30005 » 13/02/10 21:02

Forse non ci siamo capiti la macro unica valuta foglio per foglio sia la matrice che il N. di righe da estrarre quindi se ogni foglio ha tutti i dati strutturati come il primo foglio:
colonne A e B matrice (indipendentemente dal numero righe)
n. in D2 (qualsiasi numero purché compreso entro il numero righe colonna A del foglio in esame)
in G1 di ogni foglio deve esserci la formula
Codice: Seleziona tutto
=CONTA.VALORI(E2:E656)

che è possibile inserirla automaticamente con la stessa macro del ciclo for... next in questa maniera
Codice: Seleziona tutto
For I = 1 To ActiveWorkbook.Worksheets.Count   '<<<< ciclo for next precedentemente postato
Sheets(I).Select   ' <<<<< riga già esistente ciclo for ... next
UR = Range("A" & Rows.Count).End(xlUp).Row   '<<<< riga esistente
Range("G1").FormulaR1C1 = "=COUNTA(R[1]C[-2]:R[" & UR & "]C[-2])"   '<<<<< riga da aggiungere
'... <<< continua la  macro

Ripeto, se tutto è così saranno compilati perfettamente tutti i fogli (1, 10, 100, 1000) con una singola macro inserita su un modulo e attivata da un qualsiasi comando (pulsante, selezione, doppio click, tasto di scelta rapida etc)

Fai sapere
Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Aiuto Macro Excel 2007 in VBA

Postdi fuser1982 » 13/02/10 21:40

Sto modificando la macro con le ultime direttive che mi hai dato, l'ho provata in un file "campione" e devo dire che funziona alla grande, ora apporto le giuste modifiche e vedo che succede.
Non appena l'avrò ultimata ti farò sapere.
Ciao
fuser1982
Utente Junior
 
Post: 29
Iscritto il: 10/02/10 17:25

Re: Aiuto Macro Excel 2007 in VBA

Postdi fuser1982 » 14/02/10 12:55

Ciao, ho applicato la macro alla mia cartella di lavoro, ma ho un problema, nel primo foglio funziona tutto perfettamente, ma dal secondo in poi non mi da i dati relativi al consumo, cioè mi lascia una colonna vuota, ho inserito il codice postato in precedenza, apportando le modifiche necessarie per il mio file, ma non capisco il motivo per cui deve succedere una cosa così (i fogli hanno tutti la stessa struttura, non sono presenti celle unite) e poi, visto che ho applicato soltanto una macro per tutti i fogli se ci fosse qualcosa di sbagliato, secondo me non doveva funzionare nemmeno ne primo foglio, o mi sbaglio?
fuser1982
Utente Junior
 
Post: 29
Iscritto il: 10/02/10 17:25

Re: Aiuto Macro Excel 2007 in VBA

Postdi Flash30005 » 14/02/10 15:05

fuser1982 ha scritto:i fogli hanno tutti la stessa struttura,

Si ma nella colonna A il codice (prima lettera) cambia da foglio a foglio
nella prima versione costruivo il codice con il numero random e la lettera A (fissa)
Codice: Seleziona tutto
VR = Range("C3").Value  '<<<numero random
VS = "A" & Format(VR, "000") '<<<< costruzione codice random es. A245

e andava bene per il foglio1 ma nel foglio2 troviamo il codice Bxxx
cosicché la macro non trovando corrispondenza tra gli ID randomici e il codice iniziale non compilava la colonna relativa al Consumo.
Inoltre avevi completamente dimenticato di mettere la formula (tramite macro) in G1 poi divenuto R1
Comunque sostituisci l'intera macro con questa
Codice: Seleziona tutto
    Sub CompRandom1Abitante()
    Dim VS As String
    For K = 1 To ActiveWorkbook.Worksheets.Count
        Sheets(K).Select
        UR = Range("A" & Rows.Count).End(xlUp).Row
        Range("P2:Q" & UR).ClearContents
        Range("R1").FormulaR1C1 = "=COUNTA(R[1]C[-2]:R[" & UR & "]C[-2])"   '<<< formula mancante nella tua macro
            Range("N3").FormulaR1C1 = "=ABS(INT(RAND()*" & UR & "))"
        VSI = Mid(Range("A2").Value, 1, 1)  '<<< con questa riga la lettera potrà essere variabile per ogni foglio ma dovrà rimanere identica per tutto il foglio
        Application.Calculation = xlManual
        TRoutine = Timer
        TI = Timer
        Rit = Range("T2").Value
Pausa:
        Calculate
        TF = Timer
        If TF < TI + Rit Then GoTo Pausa
        URE = Range("P" & Rows.Count).End(xlUp).Row + 1
        If Range("N3").Value = 0 Then GoTo Pausa
        VR = Range("N3").Value
        VS = VSI & Format(VR, "000")
        For I = 2 To URE
            If VS = Range("P" & I).Value Then GoTo Pausa
        Next I
        Range("P" & URE).Value = VS
        Calculate
        If Val(Range("R1")) >= [O2] Then GoTo Esci
        TI = TF
        GoTo Pausa
Esci:
    For RE = 2 To Range("O2").Value + 1
        VE = Range("P" & RE).Value
        For VI = 2 To UR
            If VE = Range("A" & VI).Value Then
                Range("Q" & RE).Value = Range("C" & VI).Value
                GoTo salta
            End If
        Next VI
salta:
    Next RE
    Application.Calculation = xlAutomatic
    Next K
    End Sub


La macro darà un ulteriore problema con codici superiori a 999 es. B1025, quindi se le righe dovessero essere più di 1000 dovremmo modificare la macro, comunque ora provala e fai sapere

Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Aiuto Macro Excel 2007 in VBA

Postdi fuser1982 » 14/02/10 17:20

Ho applicato la macro e funziona perfettamente, il problema delle mille righe non si pone perchè il valore massimo delle righe si aggira attorno a 850.
Gtazie ancora
Ciao
fuser1982
Utente Junior
 
Post: 29
Iscritto il: 10/02/10 17:25

Re: Aiuto Macro Excel 2007 in VBA

Postdi fuser1982 » 16/02/10 21:37

E' possibile implementare dentro la stessa macro una funzione che mi generi automaticamente?
Cioè, una volta che ho estratto tutti gli n dati relativi a ciascun foglio e messi tutti in un'altro foglio, mi interesserebbe generare quest'ultimo foglio n-volte dove, i valori derivanti dell'estrazione casuale dovrebbero essere diversi da foglio a foglio. Si può fare una cosa di queste?
fuser1982
Utente Junior
 
Post: 29
Iscritto il: 10/02/10 17:25

Re: Aiuto Macro Excel 2007 in VBA

Postdi Flash30005 » 16/02/10 21:58

Si possono fare un'infinità di cose con le formule e le macro in excel ma...
ho riletto più volte ciò che hai scritto e mi risulta difficile capire cosa si dovrebbe fare.
Supponiamo che tu abbia 5 fogli
il codice nel foglio1 ha
A001
A002
Axxx
e con n impostato da te estrai n righe casuali del foglio1
il foglio2 hai il codice
B001
B002
Bxxx
estrai n righe casuali del foglio2
etc
fino al foglio5
e questo, mi sembra di capire, funziona
fuser1982 ha scritto:...una volta che ho estratto tutti gli n dati relativi a ciascun foglio


ora dici...
fuser1982 ha scritto:e messi tutti in un'altro foglio

Chi li ha messi questi dati su un altro foglio?
Lo hai creato tu?
e poi...
fuser1982 ha scritto: mi interesserebbe generare quest'ultimo foglio n-volte dove, i valori derivanti dell'estrazione casuale dovrebbero essere diversi da foglio a foglio.

:?:

Spiega meglio (anche con un foglio che simuli il risultato finale) per piacere
Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Aiuto Macro Excel 2007 in VBA

Postdi fuser1982 » 25/02/10 15:27

Allora, cerco di essere più chiaro, la macro che mi interesserebbe implementare dovrebbe generarmi n-volte il foglio "verifica 99%", però ogni volta che si genera i valori contenuti nelle colonne "Codice utente" e "Consumi", che provengono dall'estrazione casuale, devono cambiare da foglio a foglio inoltre, questi fogli si dovrebbero generare tutti assieme in un file *.xls nuovo.
fuser1982
Utente Junior
 
Post: 29
Iscritto il: 10/02/10 17:25


Torna a Applicazioni Office Windows


Topic correlati a "Aiuto Macro Excel 2007 in VBA":


Chi c’è in linea

Visitano il forum: Ricky0185 e 46 ospiti