Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

[Excel] Macro per copiare valori diversi

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

[Excel] Macro per copiare valori diversi

Postdi alanford » 05/04/06 12:35

ho un xls molto grosso composto dai campi: codice;qta;prezzo. nella magg parte il campo qta contiene 1 in altri casi valori diversi. Problema: ad ogni valore diverso (es 5) dovrei replicare la riga (per 5 volte) E' possibile farlo in automatico ? :oops: :eeh:
alanford
Newbie
 
Post: 7
Iscritto il: 17/03/06 09:06

Sponsor
 

[Excel] Macro per copiare valori diversi

Postdi Alexsandra » 05/04/06 13:07

alanford ha scritto:ho un xls molto grosso composto dai campi: codice;qta;prezzo. nella magg parte il campo qta contiene 1 in altri casi valori diversi. Problema: ad ogni valore diverso (es 5) dovrei replicare la riga (per 5 volte) E' possibile farlo in automatico ? :oops: :eeh:

Dovresti essere più chiaro sopratutto nel titolo.
Se hai bisogno di una macro dovresti anche dirci dove vuoi che vengano replicate le righe (nello stesso foglio?? in un range di celle) in un altro foglio?
Ti cambio il titolo, spiega meglio quello che vuoi fare e ti verrà postato il codice
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale.

Win7 + Office 2003 Ita
Avatar utente
Alexsandra
Utente Senior
 
Post: 2358
Iscritto il: 09/01/06 20:31

Postdi Anthony47 » 06/04/06 00:42

Ciao alanford,
insomma vorresti avere sempre righe con qt 1, di qui la richiesta che le righe con quantita' N siano replicate N volte con quantita' 1?
Visto che dici di avere un elenco molto grosso, non e' che poi ci vogliono piu' di 65mila righe? (basta contare il totale delle quantita' che hai).

Il nuovo elenco ti sta bene su un nuovo foglio dello stesso workbook?

Ciao,
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13899
Iscritto il: 21/03/06 16:03
Località: Ivrea

[Excel] Macro per copiare valori diversi

Postdi alanford » 06/04/06 08:46

I dati dovrebbero essere nello stesso excel o indifferente in un altro. In totale le righe non dovrebbero essere successive alle 65k
alanford
Newbie
 
Post: 7
Iscritto il: 17/03/06 09:06

Postdi Anthony47 » 06/04/06 18:55

Ciao alanford,
ti trasmetto questa macro che dovrebbe fare quello che chiedi, anche se in maniera poco sofisticata.
Presuppone che nel tuo workbook ci sia un foglio chiamato USCITA, che viene pulito e poi utilizzato per ricreare la lista, e che il campo Quantita' sia in posizione B1.
Il tracciato che gestisce e' su 3 colonne adiacenti, Campo1 / Quantita' / Campo3; i campi 1 e 2 vengono porati sul foglio di output cos' come sono.

Comunque in testa alla macro e' possibile assegnare altri valori sia per il foglio di output che per l' header di quantita'.

La macro va lanciata avendo attivo il foglio con i dati di origine, che non vengono alterati; comunque "2" copie di backup sono obbligatorie prima del test.

Dimmi se risolve; se qualcuno volesse ottimizzare, e' benvenuto.
Codice: Seleziona tutto
Sub Replica_N()
Dim Cur_QT As Integer
Col_Qt = "B1"
Riga_HD = Right(Col_Qt, 1)
Dest_WS = "USCITA"

Sorg_WS = Range("A1").Worksheet.Name
If Sorg_WS = Dest_WS Then Exit Sub
Riga_ULT = Range(Left(Col_Qt, 1) & "65536").End(xlUp).Row 'calcola l' ultima riga utile

'Azzera il foglio di Output:
    Sheets(Dest_WS).Select
    Cells.Select
    Selection.Clear
    Range("A1").Select

'Copia Header su Uscita
Worksheets(Sorg_WS).Activate
Range(Col_Qt).Select
ActiveCell.Offset(0, -1).Range("A1:C1").Copy
Sheets(Dest_WS).Select
    Range("A1").Select
    ActiveSheet.Paste
    ActiveCell.Offset(1, 0).Select
   
'Copia le righe di dati validi
On Error Resume Next
For riga = 1 To (Riga_ULT - Riga_HD)
Sheets(Sorg_WS).Select
    ActiveCell.Offset(riga, -1).Range("A1:C1").Copy
    Sheets(Dest_WS).Select
    ActiveSheet.Paste
    ActiveCell.Offset(1, 0).Select
    Cur_QT = Int(ActiveCell.Offset(-1, 1).Value)

'Se Qt > 1, crea tante righe con Qt=1
If Cur_QT > 1 Then
For Rip = 2 To Cur_QT
    ActiveCell.Offset(-1, 1) = 1
    ActiveSheet.Paste
    ActiveCell.Offset(0, 1) = 1
    ActiveCell.Offset(1, 0).Select
    Next Rip
End If
Salta:
    Cur_QT = 0
    Next riga
    Application.CutCopyMode = False
End Sub


Ciao dal TNT,
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13899
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi alanford » 07/04/06 13:04

grazie anthony per l'attenzione.
tieni conto che di macro me ne intendo x niente. ho salvato in .txt la tua risposta, ho poi aperto un xls con dati di prova avendo cura di mettere il campo qta in colonna b. ho creato un secondo foglio nella cartella chiamandolo uscita. ho creato una macro con le istruzioni che mi hai dato. devo aver fatto qualcosa che non va xchè non ottengo nessun risultato (il foglio uscita rimane bianco) e nella macro viene evidenziato l'istruzione col_qt="b1" :undecided:
alanford
Newbie
 
Post: 7
Iscritto il: 17/03/06 09:06

Postdi Anthony47 » 07/04/06 13:42

Ciao,
sembra che la macro vada in errore e quindi in debug.
Se e' cosi', ferma l' esecuzione della macro (tasto stop, col simbolo quadrato sul menu, io ce l' ho sotto la scritta Debug).

Poi prova questo:
apri il vb editor (Alt-F11), dovresti trovare la macro sul "Modulo 1" (vedi finestra Progetto, a sx), aggiungi "Dim Col_Qt As String" (senza virgolette) in terza riga subito dopo l' esistente Dim Cur_QT As Integer.

Poi vai col cursore sul titolo (Sub Replica()) e premi F8; F8 e' il tasto "passo-passo", cosi' vedi il procedere delle istruzioni e (se mantieni la finestra del vb editor non massimizzata) vedi contemporaneamente il suo effetto sul foglio xls.
Procedi con F8 e guarda l' avanzamento delle istruzioni sulla finestra vb editor.
Se esce un errore prendi nota del messaggio (in genere esce un pop up che dice l' errore, poi chiede circa "che fai, temini o vai in debug") e quale istruzione lo genera.
Se invece t' accorgi che non ba in errore, puoi comandare la continuazione automatica col tasto a forma di triangolo accanto al tasto stop.

Facci sapere l' esito, ciao.
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13899
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi Alexsandra » 07/04/06 16:30

Correggi quì
Dest_WS = "USCITA": Dest_WS = "foglio2" ' non avevi dichiarato la destinazione
Application.ScreenUpdating = False' eviti lo sfarfallio tra i fogli
Sorg_WS = Range("A1").Worksheet.Name
If Sorg_WS = Dest_WS Then Exit Sub
'Riga_ULT = Range(Left(Col_Qt, 1) & "65536").End(xlUp).Row 'calcola l' ultima riga utile
Riga_ULT = Sheets(1).[A2].End(xlDown).Row 'calcolo l'ultima riga scritta
'Azzera il foglio di Output:

Le correzioni sono in rosso,così funziona.ho messo il codice in un quote per varti vedere le correzioni
PS. ho preso il codice che hai postato e non ho fatto le modifiche del tuo ultimo post
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale.

Win7 + Office 2003 Ita
Avatar utente
Alexsandra
Utente Senior
 
Post: 2358
Iscritto il: 09/01/06 20:31

Postdi Anthony47 » 07/04/06 17:00

Ciao alexandra,
poiche' il foglio di output per prima cosa viene azzerato, ho volutamente evitato di assegnargli un nome comune, pretendendo che invece avesse un nome specifico, salvo poterlo cambiare editando la riga nel vba (come era detto nel messaggio).

Per quanto riguarda il calcolo dell' ultima riga valida, mi pare che i 2 metodi siano analoghi; io l' ho fatto sulla colonna delle qt.
Infine lo "sfarfallio" io lo blocco quando tutto funziona, e in genere non e' al primo colpo, soprattutto quando si lavora su fogli di altri (e ti e' sfuggito l' Application.ScreenUpdating = True subito prima dell' End Sub).

Le ultime modifiche le ho proposte piu' che altro per vedere se alanford non ha un settaggio che obbliga alle definizioni di tutte le variabili; ho capito che va in debug alla prima istruzione...

Bye,
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13899
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi Alexsandra » 07/04/06 19:39

Io non credo che tu ti debba giustificare Antony hai fatto un buon lavoro,sono solo intervenuta perchè c'erano dei problemi,ho corretto 2 righe e il prog. funziona.Il mio intervento non voleva sminuire quello che hai fatto tu,anzi ho solo implementato il tuo lavoro,ne consegue che collaborando abbiamo risolto il problema dell'utente.

Ti pare poco?? :) :) :)

Ciao :) :lol:
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale.

Win7 + Office 2003 Ita
Avatar utente
Alexsandra
Utente Senior
 
Post: 2358
Iscritto il: 09/01/06 20:31


Torna a Applicazioni Office Windows


Topic correlati a "[Excel] Macro per copiare valori diversi":


Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti