Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

copia e incolla SE e altre 2 macro

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 e incolla SE e altre 2 macro

Postdi christianghz » 02/05/15 10:02

Ciao Ragazzi,
ho un file di richiesta ritiro per spedizionieri in cui devo inserire 3 macro .

qui il file: http://we.tl/Jfs9x84OHT

Penso sia semplice ma per me che non so niente di VBA è difficile.
Ecco le 3 cose che devo fare:

1) quando clicco il pulsante "Home" della parte "RITIRO" il file deve copiare i dati del cliente dall'intestazione in alto (1,2,3,4,5) e incollarli nelle celle della descrizione del ritiro;
al contempo, se il cliente aveva già inserito i suoi dati nella parte "CONSEGNA", deve cancellare dalla parte "CONSEGNA" (in pratica non può avere ritiro e consegna nella stessa azienda, quindi come riferimento basta che veda se il nome della ditta è uguale in rit e cons).
Stessa cosa ma al contrario per il tasto Home della Consegna
Se possibile cliccando il pulsante Home una prima volta dovrebbe copiarli, ripremendolo cancellarli.

2) il pulsante "Mail" se cliccato dovrebbe allegare il modello a una mail e compilare in automatico il campo A, l'oggetto, e inserire un testo (es. Oggetto: richiesta ritiro; Testo: richiesta ritiro del cliente xxxx, per 11 plt da Treviso a Milano -prendendo i dati dal file-)

3)Se provo a stampare o salvare il foglio, deve uscirmi un avviso se non ho compilato le celle importanti (decido io quali)
Di questa avevo anche trovato una macro esistente nel forum che non trovo più, se sapete dov'è inviatemi il link senza riscrivere il codice!

e poi una domanda:
vorrei far uscire un calendario pop up nelle due celle "Data", ma ho letto che ci sono problemi tra Office 32 e 64 bit, e non funzionerebbe su tutti i pc.
Ho "risolto" con Convalida Dati mettendo obbligatorio un valore Data, voi conoscete un calendario pop up che possa funzionare su tutti i pc?

Grazie mille!
christianghz
Utente Junior
 
Post: 72
Iscritto il: 03/02/14 17:58

Sponsor
 

Re: copia e incolla SE e altre 2 macro

Postdi Anthony47 » 02/05/15 15:53

Vedo che l' estetica e' curata, il contenuto ancora da inventare... Io invece in genere faccio l' opposto, ed evito di creare dei fogli elettronici che hanno l' aspetto di un modulo cartaceo, separando cioe' nettamente la parte di input ed elaborazione dalla parte presentazione; altrimenti l' utente si chiedera' dov'e' la matita e la carta copiativa.

1) quando clicco il pulsante "Home" della parte "RITIRO" il file deve copiare i dati del cliente dall'intestazione in alto (1,2,3,4,5) e incollarli nelle celle della descrizione del ritiro;
al contempo, se il cliente aveva già inserito i suoi dati nella parte "CONSEGNA", deve cancellare dalla parte "CONSEGNA" (in pratica non può avere ritiro e consegna nella stessa azienda, quindi come riferimento basta che veda se il nome della ditta è uguale in rit e cons).
Questa parte la puoi ottenere con una macro autoregistrata; non sara' ottimizzata ma funzionera'.
Associerai poi la macro alla tua icona

Stessa cosa ma al contrario per il tasto Home della Consegna
Non capisco in dettaglio le cose da fare, ma immagino che anche qui bastera' una macro autoregistrata.

Se possibile cliccando il pulsante Home una prima volta dovrebbe copiarli, ripremendolo cancellarli.
Immagino che la richiesta coinvolga le due macro di prima, che supponiamo si chiamino Macro1 e Macro2.
Anche qui procedi con due macro autoregistrate, in cui inserisci le istruzioni per cancellare le celle che ti interessa. Supponiamo che si chiamino Macro3 e Macro4.
Adesso vai in testa a Macro1 e inserisci queste istruzioni:
Codice: Seleziona tutto
Sub Macro1()
'LE PROSSIME RIGHE SONO DA AGGIUNGERE:
If Range("E45").value <> "" then     '<<< Vedi Testo
    Call Macro3
    Exit Sub
End If
'FINE DELLE RIGHE AGGIUNTE
'etc etc

Che la cella da controllare sia E45 e' la mia migliore interpretazione di quanto scritto nel tuo messaggio, non escludo che sia errata; correggi come da situazione reale.
Analoga modifica la farai in testa a Macro2

2) il pulsante "Mail" se cliccato dovrebbe allegare il modello a una mail e compilare in automatico il campo A, l'oggetto, e inserire un testo (es. Oggetto: richiesta ritiro; Testo: richiesta ritiro del cliente xxxx, per 11 plt da Treviso a Milano -prendendo i dati dal file-)
Prendiamo una delle tane Sub InvioEmail che sono state pubblicate, ad esempio viewtopic.php?f=26&t=83835&start=20#p479791
e la adattiamo al tuo caso, ottenendo:
Codice: Seleziona tutto
Sub Invioemail()
Dim OutApp As Object
Dim OutMail As Object
Dim EmailAddr As String
Dim Subj As String
Dim BodyText As String
'  (a)
Set OutApp = CreateObject("Outlook.Application")
'compilazione di un testo standard di accompagnamento
BDT = "Richiesta ritiro del cliente " & Range("CellaColNomeDelCliente")     '<<<
BDT = BDT & vbCrLf & Range("CellaConAltreInfo")                             '<<<
BDT = BDT & vbCrLf & "Cordiali saluti" & vbCrLf                             '<<<
BDT = BDT & "Pippo"                                                         '<<<
''  (b)
''Nominat = Sheets("Scheda").Range("C5").Value
ActiveWorkbook.Save
OutFile = ActiveWorkbook.FullName
EmailAddr = ""
Subj = "Richiesta ritiro"
'
Set OutMail = OutApp.CreateItem(0)
With OutMail
.To = EmailAddr
.CC = ""
.BCC = ""
.Subject = Subj
.Attachments.Add OutFile
.Body = BDT
.Display 'or use .send
'.send
End With
'  (c)
Set OutMail = Nothing
'
'  (d)
Set OutApp = Nothing

''    Application.Wait (Now + TimeValue("0:00:04"))
''    Application.SendKeys "%a"
''    Application.Wait (Now + TimeValue("0:00:04"))
'
''Rename Image files
''Name "C:\ESITI\" & Nominat & "_ScrSh.jpg" As "C:\ESITITX\ " & Nominat & "_ScrSh.jpg"

End Sub

Da associare all'icona
Le righe marcate <<< vanno personalizzate con i tuoi dati.
Le righe che cominciano con due apostrofi erano presenti nella macro di esempio ma possono essere eliminate in questa versione.

3)Se provo a stampare o salvare il foglio, deve uscirmi un avviso se non ho compilato le celle importanti (decido io quali)
Di questa avevo anche trovato una macro esistente nel forum che non trovo più, se sapete dov'è inviatemi il link senza riscrivere il codice!
Inserisci nel modulo "ThisWorkbook" del vba una Sub Workbook_BeforePrint e una Sub Workbook_BeforeSave che contengano queste istruzioni:
Codice: Seleziona tutto
If Application.WorksheetFunction.CountA(Range("A1, B2, C3")) < 3 Then
    MsgBox ("Compilare prima le celle A1-B2-C3; operazione abortita")
    Cancel = True
End If
Invece di "A1, B2, C3" userai le celle che vanno compilate, e invece del <3 il numero di celle.

Non conosco i dettagli di compatibilita'/incompatibilita' tra i vari calendari, quindi mi astengo.

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: 13892
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: copia e incolla SE e altre 2 macro

Postdi christianghz » 03/05/15 11:20

Grazie mille Anthony,
come premesso non so usare Vba quindi anche le minime modifiche che ho provato ad apportare ai tuoi codici non mi funzionano.
Provo a spiegare meglio.

Con la macro l'oggetto della mail è ok, ma nel testo della mail ho bisogno che esca:
"Richiesta ritiro del cliente" ("G14") "codice:" ("Q14")
"N° Pallet: " ("Q20")
"Ritiro:" ("E48") "Provincia:" ("E49")
"Consegna:" ("N48") "Provincia:" ("N49")
"Cordiali Saluti"

Ho provato a modificare ma sbaglio qualcosa.

Poi:

Anthony47 ha scritto:Questa parte la puoi ottenere con una macro autoregistrata; non sara' ottimizzata ma funzionera'.
Associerai poi la macro alla tua icona

Stessa cosa ma al contrario per il tasto Home della Consegna
Non capisco in dettaglio le cose da fare, ma immagino che anche qui bastera' una macro autoregistrata.

Se possibile cliccando il pulsante Home una prima volta dovrebbe copiarli, ripremendolo cancellarli.
Immagino che la richiesta coinvolga le due macro di prima, che supponiamo si chiamino Macro1 e Macro2.
Anche qui procedi con due macro autoregistrate, in cui inserisci le istruzioni per cancellare le celle che ti interessa. Supponiamo che si chiamino Macro3 e Macro4.

Allora, ho provato a registrarla, infatti nel file dovresti trovare 2 mie macro preregistrate che però non funzionano molto bene, devono unzionare così:
1)Se i campi della consegna e del ritiro sono vuoti, cliccando il tasto"Home" deve riempire gli spazi sottostanti con i dati del cliente.
Esempio, vado sulla parte del ritiro, schiaccio Home e mi compila i campi. Se lo rischiaccio li deve cancellare.
2) Se il campo ritiro (per esempio) è compilato con i dati del cliente, se clicco il tasto Home della parte CONSEGNA deve cancellare i dati dalla sezione del ritiro e incollarli su Consegna. E viceversa.
non ho idea di come registrare una macro che controlli i valori delle celle.

Grazie infinite
christianghz
Utente Junior
 
Post: 72
Iscritto il: 03/02/14 17:58

Re: copia e incolla SE e altre 2 macro

Postdi Anthony47 » 04/05/15 00:26

Per quanto riguarda il messaggio, si tratta di "concatenare" i testi e i valori di cella che ti interessano; ti ho fatto un esempio di testo con
Codice: Seleziona tutto
BDT = "Richiesta ritiro del cliente " & Range("CellaColNomeDelCliente")     '<<<
BDT = BDT & vbCrLf & Range("CellaConAltreInfo")                             '<<<
BDT = BDT & vbCrLf & "Cordiali saluti" & vbCrLf                             '<<<
BDT = BDT & "Pippo"                                                         '<<<

Visto che vuoi ottenere
"Richiesta ritiro del cliente" ("G14") "codice:" ("Q14")

allora modificherai la prima riga in
Codice: Seleziona tutto
BDT = "Richiesta ritiro del cliente " & Range("G14") & "codice: " & Range("Q14")

Il resto pero' lo fai tu ricopiando questa variazione; il simbolo "&" significa "Concatena i testi", mentre "vbCrLf" significa "testo a capo".

Quanto alle macro che copiano i dati, assumendo che le macro che avevi inserito nel file gia' copiano i dati giusti nella posizione giusta, in che cosa non funzionano? Hai registrato la Macro3 e la Macro4? Hai modificato le tue macro aggiungendo "le righe che sono da aggiungere"? Che codice hai ottenuto? Quale e' il comportamento che ti aspettavi e che cosa invece succede?

Insomma non basta dire "ho provato ma sbaglio qualcosa"...
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: 13892
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: copia e incolla SE e altre 2 macro

Postdi christianghz » 04/05/15 07:21

Anthony47 ha scritto:Insomma non basta dire "ho provato ma sbaglio qualcosa"...


Scusa ANthony
sicuramente non mi sono spiegato bene,
io ho provato a modificare il codice per l'invio mail,
ma non ho nemmeno provato a fare macro 3 e macro 4 per la seconda domanda, perchè:
ho registrato una macro che copia e incolla i valori-> ok
posso registrare una macro che cancella i valori-> ok

ma quando clicco il tasto Home sulla SEZIONE RITIRO -ad esempio-
non ho assolutamente idea di come fare per dirgli:
"controlla le caselle N45, N46, N47, N48 e N49 (sezione CONSEGNA),
se sono uguali ai dati del cliente (in alto)
allora cancellali da queste celle perchè li stai incollando su Ritiro." -e viceversa-
:eeh:
christianghz
Utente Junior
 
Post: 72
Iscritto il: 03/02/14 17:58

Re: copia e incolla SE e altre 2 macro

Postdi christianghz » 04/05/15 08:32

Intanto grazie delle dritte per la mail,
ora sono riuscito a sistemare il testo!
christianghz
Utente Junior
 
Post: 72
Iscritto il: 03/02/14 17:58

Re: copia e incolla SE e altre 2 macro

Postdi christianghz » 04/05/15 11:04

Anthony47 ha scritto:
3)Se provo a stampare o salvare il foglio, deve uscirmi un avviso se non ho compilato le celle importanti (decido io quali)
Di questa avevo anche trovato una macro esistente nel forum che non trovo più, se sapete dov'è inviatemi il link senza riscrivere il codice!
Inserisci nel modulo "ThisWorkbook" del vba una Sub Workbook_BeforePrint e una Sub Workbook_BeforeSave che contengano queste istruzioni:
Codice: Seleziona tutto
If Application.WorksheetFunction.CountA(Range("A1, B2, C3")) < 3 Then
    MsgBox ("Compilare prima le celle A1-B2-C3; operazione abortita")
    Cancel = True
End If
Invece di "A1, B2, C3" userai le celle che vanno compilate, e invece del <3 il numero di celle.


Dunque,
ho provato anche il tuo suggerimento per il punto 3, ma penso che le indicazioni siano troppo poche per uno poco pratico come me.

a onor del vero:
Ho inserito in "Visual BAsic -> Questa_cartella_di_lavoro" il tuo codice modificato con le mie celle
Codice: Seleziona tutto
If Application.WorksheetFunction.CountA(Range("G14 , Q14, E24, G24, I24, K24, M24, E36, E45, E46, E47, E48, E49, N45, N46, N47, N48, N49")) < 18 Then
    MsgBox ("Compilare prima le celle A1-B2-C3; operazione abortita")
    Cancel = True
End If

ma non mi funziona.

Allora ho provato alla stessa maniera col codice di questo topic che era più completo: viewtopic.php?t=94737

Codice: Seleziona tutto
Sub Workbook_BeforePrint()
Area2 = "G14,Q14,E24,G24,I24,K24,M24,E36,E45,E46,E47,E48,E49,N45,N46,N47,N48,N49"
    For Each cella In Range(Area2)
        If cella.Value = "" Then
        Application.ScreenUpdating = True
            MsgBox Prompt:="La cella " & cella.Address & " è vuota! ", _
                      Buttons:=vbCritical, _
                      Title:="Avvertimento!"
                      cella.Select
                      'Errore = 1
            Exit Sub
        End If
    Next
End Sub

ma non riesco comunque a farlo funzionare.
Il file mi va in stampa preavvisandomi di un errore di compilazione.
Avevo trovato un topic dove evidenziavano anche le celle obbligatorie non compilate ma non lo trovo più, se lo avete passatemelo per favore.
Poi se per la mia quasi nulla preparazione in Visual Basic è troppo difficile riuscire a guidarmi posso capire, cercherò di risolvere in altro modo.
Intanto grazie.
christianghz
Utente Junior
 
Post: 72
Iscritto il: 03/02/14 17:58

Re: copia e incolla SE e altre 2 macro

Postdi Anthony47 » 05/05/15 00:39

grazie delle dritte per la mail, ora sono riuscito a sistemare il testo!
Prego; pero' lo vedi che la necessita' aguzza l' ingegno?

Per quanto riguarda evitare la stampa /salvataggio, il codice che comincia con
If Application.WorksheetFunction.CountA(Range("G14 , Q14, E24, G24, etc etc a me funziona.
Ovviamente va inserito in una macro di Sub Workbook_BeforePrint e una Sub Workbook_BeforeSave; cioe' il codice completo sara':
Codice: Seleziona tutto
Private Sub Workbook_BeforePrint(Cancel As Boolean)
    If Application.WorksheetFunction.CountA(Range("G14 , Q14, E24, G24, I24, K24, M24, E36, E45, E46, E47, E48, E49, N45, N46, N47, N48, N49")) < 18 Then
        MsgBox ("Compilare prima le celle Obbligatorie; operazione abortita")
        Cancel = True
    End If
End Sub


Codice: Seleziona tutto
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    If Application.WorksheetFunction.CountA(Range("G14 , Q14, E24, G24, I24, K24, M24, E36, E45, E46, E47, E48, E49, N45, N46, N47, N48, N49")) < 18 Then
        MsgBox ("Compilare prima le celle Obbligatorie; operazione abortita")
        Cancel = True
    End If
End Sub

(vanno inserite in "Questa_cartella_di_lavoro")

La macro derivata da viewtopic.php?t=94737 e' sintatticamente errata nelle dichiarazioni dell' evento; la prima riga deve essere come quella che ti ho dato e va inserita in "Questa_cartella_di_lavoro", e poi il corpo deve gestire Cancel qualora l'evento (stampa oppure Salva) siano da bloccare (come fatto nel codice che ti ho riepilogato sopra). Cioe':
Codice: Seleziona tutto
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Area2 = "G14,Q14,E24,G24,I24,K24,M24,E36,E45,E46,E47,E48,E49,N45,N46,N47,N48,N49"
    For Each cella In Range(Area2)
        If cella.Value = "" Then
        Application.ScreenUpdating = True
            MsgBox Prompt:="La cella " & cella.Address & " è vuota! ", _
                      Buttons:=vbCritical, _
                      Title:="Avvertimento!"
                      cella.Select
                      'Errore = 1
                      Cancel = True
            Exit Sub
        End If
    Next
End Sub


Altri esempi sul tema:
viewtopic.php?f=26&t=77282
viewtopic.php?t=101659

Volendo evitare il vba, potresti pensare di usare la formattazione condizionale per formattare in rosso le celle a compilazione obbligatoria se sono ancora vuote; poi in un' altra cella ben visibile inserisci la formula
Codice: Seleziona tutto
=SE(CONTA.VALORI(G14;Q14;E24;G24;I24;K24;M24;E36;E45;E46;E47;E48;E49;N45;N46;N47;N48;N49)<18;"ERRORE: Ci sono ancora celle da compilare";"")

E magari usi il testo Rosso

Certo che se a chi usa il foglio gliene importa poco avrai sempre problemi.


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: 13892
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: copia e incolla SE e altre 2 macro

Postdi christianghz » 05/05/15 07:53

christianghz ha scritto:ho registrato una macro che copia e incolla i valori-> ok
posso registrare una macro che cancella i valori-> ok

ma quando clicco il tasto Home sulla SEZIONE RITIRO -ad esempio-
non ho assolutamente idea di come fare per dirgli:
"controlla le caselle N45, N46, N47, N48 e N49 (sezione CONSEGNA),
se sono uguali ai dati del cliente (in alto)
allora cancellali da queste celle perchè li stai incollando su Ritiro." -e viceversa-
:eeh:


Grazie mille Anthony, provo subito con i codici Before_save e Before_print!

Per favore puoi anche indicarmi come fare quanto sopra riportato?
Grazie
christianghz
Utente Junior
 
Post: 72
Iscritto il: 03/02/14 17:58

Re: copia e incolla SE e altre 2 macro

Postdi Anthony47 » 06/05/15 00:18

ma quando clicco il tasto Home sulla SEZIONE RITIRO -ad esempio-
non ho assolutamente idea di come fare per dirgli:
"controlla le caselle N45, N46, N47, N48 e N49 (sezione CONSEGNA),
se sono uguali ai dati del cliente (in alto)
allora cancellali da queste celle perchè li stai incollando su Ritiro."
Ma questa e' non e' la richiesta di copiare se la destinazione era vuota o cancellare la destinazione se non era vuota? Se Si, io ti avevo suggerito di registrare una Macro3 e una Macro4 e poi di aggiungere alcune righe in testa alle due macro di copia; vedi primo messaggio, viewtopic.php?f=26&t=104590&p=610359#p610230

E' andato storto il suggerimento o e' un'altra cosa?
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: 13892
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "copia e incolla SE e altre 2 macro":


Chi c’è in linea

Visitano il forum: PcBase e 10 ospiti