Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    Macro Excel per copia e a capo

    Ciao a tutti...sono nuovo e avrei bisogno di una semplice dritta.
    Mi servirebbe il codice di una macro che mi permetta di copiare una riga di un foglio excel e che me la incolli in un altro foglio facendo in modo che al prossimo copia e incolla riparta dalla riga successiva, come fosse un registro.

  2. #2
    Vi prego aiutatemi, lo so che è una stupidagine ma ne ho proprio bisogno. Attendo vostre risposte. Grazie!

  3. #3
    Ciao,
    sai perché non ti risponde nessuno?
    Perche le macro in excel si fanno in un linguaggio che si chiama VBA, diretta derivazione del visual basic, e c'è una sezione apposita per questo.
    Chi frequenta questa sezione probabilmente ne sa poco di programmazione, io stesso passavo di qui per caso.

    Quindi chiedo al moderatore di spostare il 3D.

    Detto questo, come vuoi selezionare il foglio e la riga? Cioè, vuoi una input box o clicchi sul numero di riga e la selezioni così?
    E immagino che tu voglia un pulsante per attivarla, vero? O pensavi a qualcos'altro? E il processo deve riguardare una riga alla volta, quindi un click sul pulsante per ogni riga, oppure dev'essere automatico per tutte le righe a partire da quella selezionata? E quante sono le righe? C'è un motivo per copiare una riga alla volta e non tutto un blocco?
    E le righe hanno una lunghezza?
    E quando si fa "l'incolla" la riga in arrivo deve ricoprire quella esistente con lo stesso numero o inserirsi da qualche parte? E dove?

    Se, oltre a questo, ti vengono in mente altre informazioni da darci, non esitare.

    Ciao
    La democrazia rappresentativa ha fatto il suo tempo, è ora di passare alla democrazia diretta.
    www.beppegrillo.it

  4. #4
    Allora grazie innanzitutto per la risposta. In pratica devo fare un mini magazzino su excel da mettere poi disponibile online. Devo fare il Foglio 1 con tutti i prodotti e a fianco una form di prelievo con nome del titolare, quantità e data. Questi dati dovranno poi essere copiati in un altro foglio (Foglio 2) che deve funzionare da registro, ovvero, deve tenere conto dei prelievi riga per riga senza cancellare i precedenti. La macro dovrebbe copiare una sola riga alla volta (in caso di più prelievi si avvierà la macro più volte), le righe hanno lunghezza fissa. Riassumendo non mi serve altro che un copia/incolla che però alla successiva parta dalla riga successiva del foglio di registro e che non sovrascriva i valori precedenti. Se solo potessi allegare la bozza creata in Excel sarebbe molto più chiaro il problema. Grazie.

  5. #5
    Ciao,
    adesso è tutto un po' più chiaro.

    Mi sembra di capire che tu abbia già gestito l'input dei dati, l'individuazione dell'articolo prelevato e della riga in cui si trova.
    Quindi c'è un punto del tuo programma in cui una variabile contiene il numero della riga da copiare.

    Io, per arrivare a questa stessa situazione, ho usato una inputbox e una find e ho caricato il numero della riga da copiare nella variabile RigaDa. Riporto anche queste due istruzioni solo per documentazione ma tu non tenerne conto, mi sono servite solo per simulare nei miei test la tua situazione reale.

    codice:
       Valore = InputBox(articolo)
       RigaDa = Range("A:A").Find(Valore).Row
    Questa istruzione carica la variabile Ultima col numero dell'ultima riga che contiene qualcosa nella colonna A del foglio2.

    codice:
       Ultima = Worksheets(2).Range("A:A").End(xlDown).Row
    Purtroppo la funzione End ha un comportamento un po' strano, cioè se il numero di righe valorizzate è superiore a 1 restituisce il numero corretto di righe mentre se nessuna riga è valorizzata o se ne è valorizzata solo una restituisce il valore 1048576.
    Chiederò al forum di vbscript se qualcuno sa come risolvere questa cosa. In attesa di una soluzione più ortodossa si può risolvere mettendo un valore qualsiasi nella cella A1 del foglio 2, per esempio un titolo di colonna o qualcos'altro a tua scelta e inserendo la if che segue. In questo modo il tuo registro partirà dalla riga 2. Purtroppo non sono riuscito a trovare una soluzione migliore.

    codice:
       If Ultima = 1048576 Then Ultima = 1
    Infine quest'istruzione copia la riga indicata nella variabile RigaDa e la inserisce nel foglio2 sotto l'ultima riga esistente, cioè alla posizione Ultima+1

    codice:
       Worksheets(1).Rows(RigaDa).Copy Destination:=Worksheets(2).Cells((Ultima + 1), 1)

    Spero che questo possa aiutarti.
    Facci sapere
    Ciao
    La democrazia rappresentativa ha fatto il suo tempo, è ora di passare alla democrazia diretta.
    www.beppegrillo.it

  6. #6
    Ok grazie di tutto, ma adesso posto un immagine di quello che è la mia bozza...non devo copiare una riga intera ma parte di una riga..è una bozza molto semplice...scusa nn pensavo che fosse una cosa così difficile xke pensavo che la macro la si ricavava registrandola, ma evidentemene non è così..grazie ancora..
    Immagini allegate Immagini allegate

  7. #7
    Ciao! Trovato niente?

  8. #8
    Ciao,
    se prima mi sembrava chiaro adesso sono tornato nella nebbia.

    Sono stato tratto in inganno da un po' di cose, per esempio chiedevi del codice ma poi vedo che non sai come utilizzarlo perché tre righe di codice le consideri troppo complicate, poi hai parlato di un form dicendo che il tuo problema era "solo" il copia incolla per cui pensavo che tutte le problematiche legate al form (inserimento, invio e trattamento dei dati) le avessi già gestite invece mi sembra di capire che con "form" tu intenda delle semplici celle excel ...

    Insomma, non avevo capito.

    E rileggendo bene continuo a non capire alcune cose, una fra tutte: perché vuoi usare excel?

    Secondo me, in vista di un inserimento su web, l'excel ti complicherà enormemente la vita, io farei un form di raccolta dati in html e un programmino php di memorizzazione su file di testo.

    Comunque, ammettendo che tu voglia usare proprio excel e che sia in grado di utilizzarlo su web, quello che segue è il codice di una macro che fa quello che vuoi (puoi associarlo ad un pulsante o ad una macro registrata, come preferisci):

    codice:
       Worksheets(2).[A1] = "Registro"
       Worksheets(2).[A2] = "-----------"
    
       For Each Casella In Worksheets(1).Range("E3:E1000")
          If Casella.Value <> "" Then
             Ultima = Worksheets(2).Range("A:A").End(xlDown).Row
             Casella.Offset(0, -4).Copy Destination:=Worksheets(2).Cells((Ultima + 1), 1)
             Casella.Copy Destination:=Worksheets(2).Cells((Ultima + 1), 2)
             Casella.Offset(0, 1).Copy Destination:=Worksheets(2).Cells((Ultima + 1), 3)
             Casella.Offset(0, 2).Copy Destination:=Worksheets(2).Cells((Ultima + 1), 4)
             Casella.Offset(0, -1) = Casella.Offset(0, -1) - Casella.Offset(0, 1)
             Casella.Value = ""
             Casella.Offset(0, 1).Value = ""
             Casella.Offset(0, 2).Value = ""
          End If
       Next
    
       MsgBox "Fatto"
    Te lo spiego nel dettaglio per metterti in grado di utilizzarlo e personalizzarlo come vuoi.

    Le prime due righe non fanno altro che inserire un contenuto qualsiasi nelle celle A1 e A2 del foglio 2. Questo serve a superare il problema che ti dicevo l'altra volta (e a cui non ho trovato soluzione). Puoi anche inserire tu, a mano, una volta per tutte qualcosa in quelle celle, per esempio l'intestazione del registro e togliere quelle due istruzioni.

    L'istruzione For Each apre un ciclo di esame di tutte le celle da E3 a E1000 per vedere se contengono qualcosa cioè se qualcuno ha effettuato un prelievo. Ho indicato la colonna E perché nell'immagine che hai postato è quella in cui colui che preleva un prodotto indicherà il suo nome, quindi trovare quella casella piena significa che quel prodotto è stato prelevato. Ho limitato la ricerca alle righe dalla 3 alla 1000 perché ho immaginato che fosse sufficiente per il numero di articoli che puoi avere. Adatta pure questo range alle tue esigenze.

    L'istruzione seguente, la if, è quella che si chiede se la casella in esame contiene qualcosa cioè se il suo valore è diverso dalla stringa vuota (rappresentata dalla coppia di doppi apici). Questo serve a copiare nel foglio 2 solo le righe che sono state riempite e non anche quelle vuote.

    Per inciso, non sarà necessario effettuare un prelievo alla volta, sarà possibile, se lo si desidera, indicare anche più prelievi contemporaneamente e poi cliccare sul pulsante o attivare la macro, e tutti verranno copiati nel foglio 2.

    A questo punto la logica elaborativa è esaurita, si tratta solo di eseguire una sequenza di istruzioni di copia e di ripulitura delle celle.

    Prima però si carica nella variabile Ultima il numero dell'ultima casella della colonna A del foglio 2 che contiene qualcosa.

    Si passa poi alle quattro istruzioni di copia. Sono quattro perché i valori da copiare sono quattro, cioè Prodotto, Titolare, Quantità e Data. Il puntamento è fatto per Offset cioè indicando di quante colonne spostarsi rispetto alla casella in esame (che appartiene alla colonna E, ricordi?) quindi la casella "-4" corrisponde al nome prodotto, quella senza offset è proprio quella in esame, cioè il titolare, quella con offset 1 è la quantità e quella con offset 2 è la data.

    Le celle in cui questi valori devono essere inserite sono indicate utilizzando la notazione Cells(riga, colonna). La riga è per tutte (Ultima +1), cioè la prima libera, mentre le colonne sono la 1, la 2, la 3 e la 4 in modo che i quatto dati vengano scritti in sequenza nelle colonne da A a D del foglio 2.

    Tanto per fare una cosa più completa ho aggiunto un'ulteriore istruzione (se non ti serve toglila) che aggiorna la giacenza (nel foglio 1) sottraendole il valore prelevato. La giacenza si trova infatti all'offset -1 rispetto alla solita colonna E e il valore prelevato all'offset 1. Sottraendo il secondo dalla prima si ottiene il nuovo valore della giacenza da inserire all'offset -1.

    Fatte le copie si possono ripulire le celle riempite dal prelevatore in modo che siano pronte per il prossimo prelievo. Questo si fa assegnando il valore vuoto (la coppia di doppi apici) alla cella in esame e alle due che sono alla sua destra (stesso puntamento per offset già visto prima).

    Le istruzioni End If e Next chiudono la If e il ciclo For Each che sono stati aperti prima.

    E infine, tanto per dare un riscontro a chi ha effetuato l'inserimento, ho inserito un piccolo pop-up (MsgBox) col messaggio "Fatto". Anche questo puoi tranquillamente toglierlo se non ti piace.

    Spero che spiegato così ti risulti più semplice, comunque se hai bisogno sono qui.

    Ciao
    La democrazia rappresentativa ha fatto il suo tempo, è ora di passare alla democrazia diretta.
    www.beppegrillo.it

  9. #9
    Mamma mia che spiegazione! Sei un grande! Lo proverò domani forse e ti farò sapere. Intanto grazie, hai fatto anche più di quello che avevo chiesto. Uso excel perchè tanto nel sito che farò i clienti scaricheranno il file e lo riupperanno nell ftp direttamente tramite excel. Non chiedermi perchè uso excel, ma prendo ordini da posizioni superiori Poi x assegnare la macro a un bottone lo trovo benissimo anche sulla guida, l'unica cosa che ti chiedo è per la dichiarazione delle variabili? le crea in automatico quando le si usano o bisogna crearle precedentemente? Grazie.

  10. #10
    Non serve dichiarare le variabili, lo fa in automatico, il codice così com'è funziona già senza nient'altro.

    Più che assegnare il codice ad una macro e poi la macro ad un bottone, assegna direttamente il codice ad un bottone, è più semplice.

    Per inserire un bottone nel foglio cerca la barra "strumenti di controllo" (se ricordo bene si chiamava così in excel 2003) oppure, in excel 2007, vai nella scheda sviluppo - inserisci - controlli activeX e clicca sulla prima iconcina.

    Una volta inserito il pulsante (che si chiamerà CommandButton1) cliccaci due volte sopra, si aprirà l'editor di VBA, inserisci il codice fra le due righe che trovi già scritte (cioè fra Private ... ed End Sub) poi torna nel foglio e clicca su Modalità di progettazione (sei entrato in MdP inserendo il bottone, ora cliccando ne esci) in questo modo il pulsante diventa attivo e quando lo clicchi (una volta) esegui il codice.

    Come vedi è molto facile.

    Mi raccomando solo che le prime due celle della colonna A del foglio 2 devono contenere qualcosa e nel registro, cioè nel foglio due non devono esserci buchi, cioè righe vuote perché altrimenti la macro non funziona. Questo lo sottolineo perché non avevo capito che quel foglio sarebbe andato in mano a più persone.

    Comunque sono veramente basito da quello che mi dici. Clienti che scaricano il foglio e lo ricaricano via FTP

    Anche con clienti estremamente evoluti la cosa è decisamente pericolosa. Distribuisci la password per l'ftp? Oppure impazzisci con i permessi da assegnare ad ognuno?

    E come gestite la concorrenza di accessi? Cioè se, per esempio, alle 10 un cliente scarica il foglio e lo ricarica alle 10.15 dopo aver inserito i suoi prelievi e intanto alle 10.05 un altro cliente scarica il foglio e lo ricarica alle 10.10 il primo cliente, quando riporta su il suo foglio, ricopre quanto inserito dal secondo cliente.

    Io andrei dal capo e gliene direi quattro

    Buona fortuna !!!
    La democrazia rappresentativa ha fatto il suo tempo, è ora di passare alla democrazia diretta.
    www.beppegrillo.it

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.