Condividi:        

copia automatica record in excel

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

copia automatica record in excel

Postdi Karl1968 » 03/11/09 18:10

Salve a tutti,
sto costruendo un report di carico per una centrale di produzione calcestruzzo.
Tale report (per farla semplice) propone delle ricette di dosaggio (acqua, cemento ecc) secondo un archivio precostituito e selezionabile da un menu a discesa (già fatto e funzionante); in tal modo l'operatore puo' richiamare la ricetta da lui voluta e visualizzarla sullo schermo tramite una maschera creata ad hoc (già fatta e funzionante).
Compito dell'operatore di impianto è quello di "caricare" il prodotto nelle autobetoniere (mezzi di trasporto per calcestruzzo) , in altre parole dosare, tramite l'impianto di carico, la ricetta di calcestruzzo voluta, in maniera conforme a quanto previsto dalle ricette in archivio e quindi dosare le corrette quantità di prodotto (acqua, cemento ecc) nei mezzi adibiti al trasporto.
Sulla maschera prevista dal report di carico, oltre alla visualizzazone della ricetta di carico (e dei suoi componenti) sono previste delle caselle dove l'operatore inserisce manualmente le quantità dosate dall'impianto (lette visivamente sulle bilance di carico) , al fine di avere rintracciabilità dei carichi effettuati.
Quello che vorrei poter fare è creare un pulsante (macro) tramite il quale i singoli valori delle pesate (cemento, acqua, data, ora, pesate visualizzate ecc) possano essere registrati in un altro foglio contenente il report di tutte le pesate effettuate (a partire da una certa riga in poi) e far si che in automatico la registrazione proceda senza sovrascrivere le righe già scritte ma andandosi a posizionare sulla prima riga vuota utilizzabile.
Il secondo problema è quello di associare a questa operazione di "copia" dei valori (del momento), un controllo (ad esempio se si è inserito già un dato numero di bolla) e bloccare le registrazioni effettuate (evitare di poter cancellare i dati scritti).
Spero di aver esposto il mio problema al meglio, grazie in anticipo a chi vorrà e potrà aiutarmi

Karl
La vita puo' essere capita solo all'indietro e vissuta solo in avanti.........
Karl
Avatar utente
Karl1968
Newbie
 
Post: 3
Iscritto il: 03/11/09 16:24

Sponsor
 

Re: copia automatica record in excel

Postdi Anthony47 » 04/11/09 03:49

Ciao Karl e benvenuto nel forum.
Per il primo problema, creati un foglio Riepilogo, su cui in riga 10 metti le intestazioni dei campi che salverai.
Da excel apri l' editor delle macro con Alt-F11, poi Menu /Inserisci /Modulo
Copia questo codice e incollalo nel frame di destra:
Codice: Seleziona tutto
Sub Storico()
If Range("G20").value = "" then
Msgbox("Compilare cella G20") : Exit Sub
End If
Range("G20:K20").Copy Destination:= Sheets("Riepilogo").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
End Sub

Crea un pulsante (lo trovi nella barra degli strumenti Moduli) e assegnagli la macro Storico (c' e' uno step in cui ti chiedera' quale macro assegnare al pulsante).

Il codice descritto assume che le informazioni da copiare siano nelle celle G20:K20, e le copia nel foglio Riepilogo da col A da riga 11 in giu'. Ogni dato viene accodato al precedente. La macro si interrompe con messaggio di errore se G20 non e' stata compilata, perche' la prima colonna e' usata come calcolo della prima riga vuota quindi e' obbligatorio che abbia un valore.

Il secondo problema secondo me lo hai impostato male: se non vuoi errori di compilazione devi impostare un controllo per evitare all' origine l' inputazione di valori errati.
Poiche' ho capito che questi valori sono caricati tramite una form, dovrai inserire nel codice di gestione della form una verifica che quanto introdotto non sia gia' presente in Riepilogo.
Se ad esempio nel Textbox1 inserisci il numero di bolla, che e' ad esempio in col A di Riepilogo, aggiungerai nel codice di gestione dell' evento TextBox1_BeforeUpdate la verifica che il valore non esiste gia', ad esempio usando:
Codice: Seleziona tutto
If Application.WorksheetFunction.CountIf(Sheets("Riepilogo").Range("A:A"), TextBox1.Text) > 0 Then
MsgBox ("esiste gia'")
Cancel = True
End If

Purtroppo come fare in dettaglio dipende dalla logica attualmente utilizzata; se non ti basta lo spunto dovremo analizzare piu' in dettaglio la situazione che hai.

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

Re: copia automatica record in excel

Postdi Karl1968 » 05/11/09 14:48

Ciao Anthony, grazie per la risposta, anche in privato,
allora...cerchero' ri ricapitolare i problemi avuti fino a qui.

Esiste una maschera di inserimento dove appunto l'operatore inserisce dei dati, tali dati devono essere archiviati.
All'inizio credevo di poter registrare "archiviare" con una macro, una sola stringa "riga" di dati utili all'archivio, cio' si è rivelato impossibile ed i dati di riepilogo devono essere necessariamente racchiusi in una tabella (tot colonne tot righe).
Al fine di semplificarmi la vita, ho creato una tabella di appoggio, che esiste nel foglio di archivio (report), alla quale tutti i dati inseriti dall'operatore nella maschera principale sono collegati.
La macro (registra) , si apre facendo un controllo (esiste un valore nella tot cella ?) con questo codice :

Sub Registra()
' controlla se il numero di bolla è stato inserito
If Range("C9").Value = "" Then
MsgBox ("Inserisci il numero di BOLLA"): Exit Sub
End If
' controlla se il numero di autobetoniera è stato inserito
If Range("F9").Value = "" Then
MsgBox ("Inserisci il numero di AUTOBETONIERA"): Exit Sub
End If
' controlla se anagrafica cliente è stato inserito
If Range("C11").Value = "" Then
MsgBox ("Inserisci ANAGRAFICA CLIENTE"): Exit Sub
End If
' controlla se anagrafica cantiere è stato inserito
If Range("C13").Value = "" Then
MsgBox ("Inserisci ANAGRAFICA CANTIERE"): Exit Sub
End If
' controlla se umidità sabbia 1 è stata inserita
If Range("L19").Value = "0" Then
MsgBox ("Inserisci almeno umidità SABBIA 1"): Exit Sub
End If
' controlla se metri cubi è stata inserita
If Range("P19").Value = "0" Then
MsgBox ("Inserisci i metri cubi"): Exit Sub
End If
' controlla se è stata inserita la pesata del cemento
If Range("H57").Value = "0" Then
MsgBox ("DEVI INSERIRE LA PESATA DEL CEMENTO"): Exit Sub
End If
' controlla se è stata inserita la pesata dell'acqua
If Range("H68").Value = "0" Then
MsgBox ("DEVI INSERIRE LA PESATA DELL'ACQUA"): Exit Sub
End If

A questo punto la macro deve andarsi a copiare i valori dalla tabella di appoggio (che cambia ad ogni carico effettuato), ed incollarli (in realtà copia ed incolla la tabella), costituendo cosi' di fatto uno storico consultabile.
Il problema è che non posso operare una copia semplice, ma bensi' una copia dei valori, che pensavo di fare con questo codice :
' seleziona il foglio
Sheets("report").Select
'seleziona area tabella di appoggio
Range("b2:q25").Select
Selection.Copy
'seleziona la prima casella dalla quale partiranno i report in archivio
Range("b29").Select
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, operation:=xlNone, skipblanks:=False, Transpose:=False

ed il tutto funziona.... il problema nasce quando devo "istruire" la macro ad "incollare" la tabella, accodandola a quella già esistente... Anthony47 mi avevi suggerito il codice :

Range("b29").Copy Destination:=Sheets("Riepilogo").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)

codice che peraltro funzionava su un dato valore di una data cella, che veniva archiviato nel foglio "riepilogo" ed accodato in colonna....esattamente quello che mi serviva.
Come fare pero' a gestire non una cella..ma un intervallo di celle ? dandogli l'intervallo...ok, ma a me serve una copia dei valori e dei formati (altrimenti si sballa tutto e copia le formule che rimangono collegate alla tabella di appoggio).

Altro problema (perdonami ma cerco di esporre al meglio i problemi che ho incontrato)...
Nella maschera di inserimento, esiste un campo "bolla" dove appunto l'operatore inserisce manualmente il numero di bolla relativo al documento di trasporto che sta per emettere, tale numero è univoco.
La Macro, come abbiamo visto controlla che ci sia un numero di bolla (altrimenti avvisa e chiude la routine), dovrebbe pero' controllare che tale numero non esista, o meglio non sia mai stato inserito.
Ora, non esistendo una colonna di numeri di bolla, ma bensi' delle tabelle (report) storici che vengono registrati appunto in un dato intervallo di celle "tabella di appoggio", pensavo di crearmi in automatico e con la stessa stringa usata sopra :

Range("campo_bolla").Copy Destination:=Sheets("archivio bolle").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)

un archivio di numeri di bolla utilizzati; come fare pero' a far effettuare un controllo su quella data colonna, confrontando tutti i numeri di bolla utilizzati (alfanumerico), con quello attualmente inserito ?

ho altri problemi ma preferisco non metterne troppi in ballo risolvendoli (spero) step by step, spero con il vostro aiuto

grazie 1000 !

Karl
La vita puo' essere capita solo all'indietro e vissuta solo in avanti.........
Karl
Avatar utente
Karl1968
Newbie
 
Post: 3
Iscritto il: 03/11/09 16:24

Re: copia automatica record in excel

Postdi Karl1968 » 05/11/09 15:51

Per semplicità e per chiarezza di quanto esposto sopra, inserisco i link delle seguenti immagini del programmino :

Maschera di inserimento dati principale :

http://public.blu.livefilestore.com/y1p ... schera.gif

i campi data ed ora sono "adesso()" autoaggiornanti
i campi bolla, atb, cliente, cantiere, sono inseriti dall'operatore manualmente, cosi' come i campi fondo bianco testo rosso; le tabelle invece sono selezionabili dal menu a tendina e prese da un foglio a parte, il campo sottostante riporta l'ID della ricetta piu' grande e leggibile.

DOSAGGIO DEI COMPONENTI DA RICETTA :
riporta la tabella selezionata per il volume di 1000 litri (un metro cubo) e permette di assegnare a ciascun componente inerte (sabbia ecc) un'umidità realtiva rilevata da apposite sonde presenti in impianto, il campo metri cubi poi permette l'inserimento dei metri cubi totali da caricare sulla autobetoniere (solitamente 8,0)

DOSAGGIO DEI COMPONENTI CON CORREZIONE UMIDITA'
ricalcola le pesate dei singoli componenti per i metri cubi voluti e con la correzione dell'umidità (al fine di lasciare inalterato il rapporto acqua/cemento di progetto); l'operatore carica (dosa) i componenti in impianto tramite bilance elettroniche secondo quanto questo programmino gli indica, ed inserisce nel campo in bianco testo rosso, la lettura del dosaggio per ogni singolo componente dosato, al fine di avere rintracciabilità di quello che ha fatto e poter valutare gli eventuali errori compiuti.

il pulsante REGISTRA ha associato il codice postato sul mio precedente intervento.

questa maschera è collegata con questa tabella di appoggio :

http://cqbjgg.blu.livefilestore.com/y1p ... report.gif

nella quale i campi in testo blu sono dei collegamenti con la maschera di inserimento principale (tranne l'ultima colonna di dati percentuali che sono formule).

questo è quanto volevo esporre, per altri chiarimeti a disposizione con un grande GRAZIE a chi mi vorrà e potrà aiutare.
Karl
La vita puo' essere capita solo all'indietro e vissuta solo in avanti.........
Karl
Avatar utente
Karl1968
Newbie
 
Post: 3
Iscritto il: 03/11/09 16:24

Re: copia automatica record in excel

Postdi Anthony47 » 05/11/09 17:25

Vorrei prima capire se il problema della storicizzazione puo' essere riportato alla memorizzazione di 1 riga per ogni salvataggio.
Mi pare di capire che vuoi salvare il range B2:Q25 perche' qui hai creato una copia leggibile del report di operazione (tra l' altro: perche' B2:Q25 e non A2:P25?); ma se e' questo il motivo, allora tieni presente che nella storicizzazione devi solo salvare i dati variabili, soprattutto se nel report ci sono gia' tutti gli ingrdienti compreso quelli che nella ricetta prescelta non sono richiesti (quelli in qt "0").
Pertanto il mio suggerimento e' questo:
-con santa pazienza, su un foglio libero (chiamalo Libero) creati da A5 verso destra il riepilogo dei dati che vuoi salvare in fase di storicizzazione con formule del tipo =report!A2 (per la data) Non riporterei le descrizioni se essa puo' essere implicitamente associata alla posizione del dato, ne' le unita' di misura perche' certamente dipendenti dal tipo di informazione (la sabbia sara' in Kg, l' acqua sara' in litri, ...).
Alla fine avrai 100/150 celle contenenti tutti i dati che ti servono; questa e' la riga che andra' copiata sul foglio Storico, che quindi e' diventato 1 riga per ogni operazione, e potrai gestire la copia in modo semplice come descritto.
Per promemoria metti in riga 1-4 sia del foglio Libero che del foglio Storico tutte le intestazioni che possono servire a descrivere l' informazione sottostante.

Per copiare /incollare valori questa riga userai una sintassi del tipo
Codice: Seleziona tutto
Sheets("Libero").Range("A5:GG5").copy     'Il range e' di esempio
Sheets("Storico").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial _
    Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False


Cosi' facendo avrai tutti i numeri di bolla nel foglio Storico Colonna (mettiamo ) G; userai pertanto per la cella C9 di Maschera una convalida di tipo Personalizzato, con formula =CONTA.SE(Storico!A:A;C9)=0 Come Messaggio di input scriverai N° Bolla (o altro; verra' visualizzato quando C9 e' selezionata), come Messaggio di errore scriverai "Questo numero di bolla e' gia' utilizzato" (ti comparira' ovviamente se quel numero e' gia' esistente in Storico)
Se hai bisogno di dettagli sulla convalida ovviamente basta chiedere.

E' possibile che ti dia fastidio visualizzare lo storico su 100/150 colonne... In questo caso non ti preoccupare perche' si puo' fare una maschera come il tuo attuale "report", dove o con formule o con macro si va a riportare in modo facile da leggere le 100/150 colonne; ma questo lo faremmo subito dopo aver completato la storicizzazione, e per questo ti chiedero' quale metodo di consultazione dello storico vuoi implementare (per data, per bolla, per cliente...).

Se la storicizzazione per riga non va bene allora nelle istruzioni di sopra bastera' cambiare Sheets("Libero").Range("A5:GG5").copy in Sheets("report").Range("B2:Q25").copy , mentre la formula di convalida risultera' leggermente piu' complicata ma lo vedrei solo se ha senso vederlo.

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


Torna a Applicazioni Office Windows


Topic correlati a "copia automatica record in excel":


Chi c’è in linea

Visitano il forum: Nessuno e 63 ospiti