Condividi:        

colleg.ipertestuale

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

Re: colleg.ipertestuale

Postdi ricky53 » 26/01/15 20:51

ciao,
prova con questo codice
Codice: Seleziona tutto
Private Declare Function ShellExecute Lib "Shell32.dll" _
Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, _
ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long

Sub Macro_Ricky53()
    Dim URL As String
    URL = "mailto:" & [A1] & "?subject=" & [D1] & "&body=" _
      & Replace("Testo del messaggio da inviare", Chr(10), "/" & vbCrLf & "\")
    URL = Left(URL, 2025)
    MsgBox URL
    ShellExecute 0&, vbNullString, URL, vbNullString, vbNullString, vbNormalFocus
End Sub


Attenzione prima della macro ci sono delle istruzioni importanti che devi copiare.
inserisci un nuovo modulo e copia tutto quello che ti ho inviato ed esegui la macro "Macro_ricky53"

Commento: al posto di "Testo del messaggio da inviare" puoi utilizzare un'altra cella (esempio [D2]) in cui scrivi quello che ti occorre
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Sponsor
 

Re: colleg.ipertestuale

Postdi Gianpa12 » 26/01/15 23:27

Uao hai fatto un eccellente lavoro!

Ci sono ancora due cose da risolvere:

1) Quando aziono la macro "Macro_ricky53" mi esce un messaggio di Excel prima che la macro venga eseguita. Se non non clicco Ok su tale finestra Excel la macro non parte. Il messaggio recita: "mailto:pluto@gmail.com?subject=Prova 1&body=Testo del messaggio da inviare". Basta che faccio click su "OK" e il messaggio scompare e la macro parte correttamente. Come si modifica la macro per non far comparire questo messaggio?

2) Se vado alla riga 2, la macro ragiona come se fosse ancora alla riga 1 del foglio Excel. Come si modifica la macro per rendere mobili i riferimenti alle celle A1 e D1? In modo tale che se sono nella riga 2 allora la macro vada a pescare in A2 e D2, se sono alla riga3 allora la macro vada a pescare in A3 e D3, ecc...

Grazie.

Gianpa
Gianpa12
Utente Junior
 
Post: 68
Iscritto il: 28/06/10 10:10

Re: colleg.ipertestuale

Postdi Flash30005 » 27/01/15 00:57

Ho pensato e riflettuto a lungo sul tuo quesito e credo che sia risolvibile con due macro
questa macro da inserire nel Vba del foglio che contiene gli indirizzi (non nel modulo)
Codice: Seleziona tutto
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Column <> 1 Or Target.Value = "" Then Exit Sub
Dest = Target.Value
Oggetto = Range("D" & Target.Row).Value
CorpoM = Range("F" & Target.Row).Value
Macro_Flash
End Sub


e questa seconda macro inseriscila in un modulo
Codice: Seleziona tutto
Public Dest, Oggetto, CorpoM As String
Private Declare Function ShellExecute Lib "Shell32.dll" _
Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, _
ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long

Sub Macro_Flash()
    Dim URL As String
    URL = "mailto:" & Dest & "?subject=" & Oggetto & "&body=" _
      & Replace(CorpoM, Chr(10), "/" & vbCrLf & "\")
    URL = Left(URL, 2025)
    ShellExecute 0&, vbNullString, URL, vbNullString, vbNullString, vbNormalFocus
End Sub


Ho pensato che il corpo del messaggio potrai inserirlo nella colonna F (F1, F2, F3) a seconda del destinatario
appena cliccherai in una riga della colonna A (cella non vuota) si avvierà la macro in maniera automatica

Fai sapere se questa soluzione soddisfa la tua esigenza

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: colleg.ipertestuale

Postdi Gianpa12 » 27/01/15 01:17

Sto provando ad inserirla ma non mi è chiaro una cosa. Quando mi dici di inserire la prima macro nel foglio che contiene gli indirizzi (non nel modulo) e invece la seconda macro la dovrei inserire nel modulo; vuoi dire che ci sono due livelli di scrittura in VBA? Cioé quello che non capisco è che gli indirizzi email sono nella colonna A dello stesso foglio su cui gira la macro, quindi'?

Qui credo che i miei limiti nella programmazione possono diventare un ostacolo. Per evitarlo potresti provare ad inserire queste due macro che hai creato nel foglio excel di esempio che ti ho inviato e poi rimandarmelo con http://www.filedropper.com?
Grazie mille.
Gianpa
Gianpa12
Utente Junior
 
Post: 68
Iscritto il: 28/06/10 10:10

Re: colleg.ipertestuale

Postdi ricky53 » 27/01/15 01:35

Ciao,
il mio era un esempio da cui partire per produrre un codice che fosse rispondente alle tue esigenze.

L'esempio di Flash è molto rispondente alle tue esigenze con la modifica che lui ha scelto come colonna sui fare "click" per far partire la macro la colonna "A" tu avevi la colonna "E" se non erro, ma è cosa semplice lavorare sulla "E", ... però, a mio avviso, NON ti serve più il collegamento ipertestuale quindi neanche la colonna "E" e lascerei tutto come te lo ha proposto Flash.


Io avrei utilizzato il "Doppio Click" piuttosto che il "Cambio di Selezione" di una cella in modo da evitare errori se si cambia cella ma non è quella dalla quale inviare l'e-mail.

Ecco la mia proposta
Codice: Seleziona tutto
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
' QUI va il codice suggerito da Flash
    If Target.Column <> 1 Or Target.Value = "" Then Exit Sub
    Dest = Target.Value
    Oggetto = Range("D" & Target.Row).Value
    CorpoM = Range("F" & Target.Row).Value
    Call Macro_Flash
End Sub


La macro "Worksheet_BeforeDoubleClick" va copiata nel foglio ossia sul foglio ove lavori fai tasto destro sul "Tab" del foglio (in basso dove è scritto il nome del foglio)


la macro "Macro_Flash" va copiata in un Modulo: Alt+F11 quando sei sul foglio excel, poi seleziona un Modulo o inseriscine uno e copia il codice.
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Re: colleg.ipertestuale

Postdi Gianpa12 » 27/01/15 23:18

Grazie a tutti. Purtroppo non funziona ma è quasi sicuro perchè non le sto inserendo correttamente.

Per ricky: potresti riscrivere le due macro complete anche della tua ultima correzione? Le due macro per intero, cioè esattamente quello che devo copaire e incollare.

Grazie ancora.

Gianpa
Gianpa12
Utente Junior
 
Post: 68
Iscritto il: 28/06/10 10:10

Re: colleg.ipertestuale

Postdi Gianpa12 » 27/01/15 23:27

No aspetta. Ci sono.

Non riesco pero' a far uscire i campi dell'email già precompilati (indirizzo email, oggetto, testo). Come posso fare?
Gianpa12
Utente Junior
 
Post: 68
Iscritto il: 28/06/10 10:10

Re: colleg.ipertestuale

Postdi Gianpa12 » 27/01/15 23:40

Riassumo i problemi che mi rimangono da risolvere:
1) la pagina email che si apre ha i campi (indirizzo email, oggetto, testo) totalmente bianchi.
2) supponiamo che sono nella cella H1 e aziono la macro. Dopo l'esecuzione della macro il cursore dovrebbe andare in automatico nella cella H2.

Qui sotto vi scrivo le macro esattamente come le ho inserite:

Macro del foglio di lavoro:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Column <> 1 Or Target.Value = "" Then Exit Sub
Dest = Target.Value
Oggetto = Range("D" & Target.Row).Value
CorpoM = Range("F" & Target.Row).Value
Macro_Flash
End Sub


Macro nel modulo:

Public Dest, Oggetto, CorpoM As String
Private Declare Function ShellExecute Lib "Shell32.dll" _
Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, _
ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long

Sub Macro_Flash()
'
' Macro3 Macro
'
' Scelta rapida da tastiera: CTRL+e
'
Dim URL As String
URL = "mailto:" & Dest & "?subject=" & Oggetto & "&body=" _
& Replace(CorpoM, Chr(10), "/" & vbCrLf & "\")
URL = Left(URL, 2025)
ShellExecute 0&, vbNullString, URL, vbNullString, vbNullString, vbNormalFocus
End Sub


Dove si potrebbero modificare per risolvere i due problemi che vi ho descritto all'inizio del messaggio.

Un saluto e grazie.

Gianpa
Gianpa12
Utente Junior
 
Post: 68
Iscritto il: 28/06/10 10:10

Re: colleg.ipertestuale

Postdi ricky53 » 28/01/15 00:05

Ciao,
NON hai letto con attenzione quanto ti ho scritto in merito alla macro di Flash:
... L'esempio di Flash è molto rispondente alle tue esigenze con la modifica che lui ha scelto come colonna sui fare "click" per far partire la macro la colonna "A" tu avevi la colonna "E" se non erro ...


DEVI lavorare sulla colonna "A" e non su altre colonne come vedi in questa parte del suo codice:
Codice: Seleziona tutto
If Target.Column <> 1 ...
.


Ho visto che hai utilizzato l'evento "Doppio Click": bene.

Prova ed aggiornaci
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Re: colleg.ipertestuale

Postdi Flash30005 » 28/01/15 00:13

Molto probabilmente la struttura dei tuoi dati non è come definita nella macro ma puoi adattarla vedendo questo esempio

Se gli indirizzi email non sono nella colonna A devi modificare le riga-codice che hai nel vba del foglio
da:
If Target.Column <> 1 Or Target.Value = "" Then Exit Sub
cambi il valore <> 1 in <>2 se li hai in colonna B, <>3 se li hai in colonna C etc

se non hai nessun oggetto cambi la riga che trovi nella stessa macro
da
Oggetto = Range("D" & Target.Row).Value (colonna D)
a
Oggetto = Range("TuaLetteraColonna" & Target.Row).Value

Idem per il copro del messaggio
attuale F
CorpoM = Range("F" & Target.Row).Value
con la lettera della tua colonna

Ciao

N.B se hai gli indirizzi in H e avvii da H1 perché vorresti andare in H2?
Non mi dire per avviare di nuovo la macro e inviare la seconda email (???)
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: colleg.ipertestuale

Postdi ricky53 » 28/01/15 00:31

Ciao Flash,
nel suo file l'indirizzo e-mail è in colonna "A" e, quindi, il tuo codice fa bene quanto deve fare.

Deve essere lui a fare il "Doppio Click" su una cella della colonna "A" !!!

Ho fatto una prova: ho copiato il suo ultimo codice nel suo file e tutto funziona a dovere come voluto.
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Re: colleg.ipertestuale

Postdi Flash30005 » 28/01/15 06:41

ricky53 ha scritto:Ciao Flash, nel suo file l'indirizzo e-mail è in colonna "A" e, quindi, il tuo codice fa bene quanto deve fare.

se l'utente dice che
Gianpa12 ha scritto: la pagina email che si apre ha i campi (indirizzo email, oggetto, testo) totalmente bianchi.

ha i dati altrove

@Giampa12 leggi il post del 28/01/15 00:13 dove c'è un file esempio con macro già impostata
perché sono stati aggiunti messaggi e magari passano inosservati i post importanti


A tal proposito, dopo aver inviato un messaggio con una soluzione (risolutiva o no), propongo a tutti di attendere il feedback dell'utente che ha posto il quesito e non aggiungere altri messaggi specialmente se sono senza una soluzione
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: colleg.ipertestuale

Postdi Gianpa12 » 28/01/15 19:49

Grazie mille Flash! Sei un grande! Il file che mi hai messo a disposizione nel post del 28/01 00:13 è esattamente quello di cui avevo bisogno e che mi era sfuggito.

Un ulteriore passo avanti: immaginiamo che sono nella cella A1, vorrei che dopo aver azionato la macro, il cursore vada in automatico nella cella A2. Per fare questo ho provato ad aggiungere la seguente riga di codice nell'ultima riga (l'ultima prima della riga "End Sub") della macro che hai scritto tu (l'ho inserita nel modulo e non nel foglio di lavoro excel che hai inviato). La riga è la seguente:

Sub Macro_Flash()
...
ActiveCell.Offset(1, 0).Range("A1").Select
End Sub

Il risultato è che la macro attiva (correttamente) tutte le email che ci sono nella colonna A. Ma io vorrei che si fermasse solo alla riga successiva a quella di partenza. Ad esempio, se il cursore si trova nella cella A153 vorrei che si spostasse solamente in A154 dopo aver eseguito la macro. Come posso fare?

Un saluto e grazie ancora.

Gianpa
Gianpa12
Utente Junior
 
Post: 68
Iscritto il: 28/06/10 10:10

Re: colleg.ipertestuale

Postdi Gianpa12 » 28/01/15 19:55

Forse è più comodo se riporto tutta la macro:

Public Dest, Oggetto, CorpoM As String
Private Declare Function ShellExecute Lib "Shell32.dll" _
Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, _
ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long

Sub Macro_Flash()
Dim URL As String
URL = "mailto:" & Dest & "?subject=" & Oggetto & "&body=" _
& Replace(CorpoM, Chr(10), "/" & vbCrLf & "\")
URL = Left(URL, 2025)
ShellExecute 0&, vbNullString, URL, vbNullString, vbNullString, vbNormalFocus
ActiveCell.Offset(1, 0).Range("A1").Select
End Sub
Gianpa12
Utente Junior
 
Post: 68
Iscritto il: 28/06/10 10:10

Re: colleg.ipertestuale

Postdi ricky53 » 28/01/15 20:04

Ciao,
una cortesia: leggi sempre tutti gli interventi altrimenti perdi suggerimenti importanti.


La macro fa quello che l'evento che hai attivato chiede: ossia tu hai attivato l'evento di "selezione Cella" e la tua istruzione
Codice: Seleziona tutto
ActiveCell.Offset(1, 0).Range("A1").Select

riattiva l'evento con il risultato che hai descritto.
Puoi "disabilitare gli eventi" in questo modo
Codice: Seleziona tutto
    Application.EnableEvents = False ' <<==== Aggiunta
    Macro_Flash
    Application.EnableEvents = True ' <<==== Aggiunta
per evitare questo problema ma ... rimane sempre il caso della selezione di una cella sbagliata e l'e-mail parte lo stesso.
Per questo motivo ti avevo suggerito di utilizzare l'evento "Doppio Click" ed anche per evitare invii di e-mail per una selezione cella errata,
Infatti il doppio click indica (con il doppio click) proprio la volontà dell'utente di fare quella azione.

Inserisci l'istruzione che sposta di una riga la selezione e utilizza l'evento che ti avevo suggerito.
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Re: colleg.ipertestuale

Postdi ricky53 » 28/01/15 20:24

Ciao,

non ho fatto in tempo ad inserire il codice (ero al telefono ed il tempo per la modifica è terminato) e lo inserisco adesso
Codice: Seleziona tutto
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Target.Column <> 1 Or Target.Value = "" Then Exit Sub
    Dest = Target.Value
    Oggetto = Range("D" & Target.Row).Value
    CorpoM = Range("F" & Target.Row).Value
   
    Application.EnableEvents = False
    Macro_Flash
    Application.EnableEvents = True
   
    Cancel = True
End Sub


Sostituisci la tua macro di "Selezione Cella"
Codice: Seleziona tutto
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
con quella che ti ho allegato ed Il resto rimane uguale
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Re: colleg.ipertestuale

Postdi Gianpa12 » 28/01/15 20:45

Grazie della risposta.

Non funziona bene come prima e la mail esce con tutti i campi vuoti (indirizzo email, oggetto, testo). Il problema del doppio click non lo considero un problema, anzi è un vantaggio per me. Quindi io ripartirei esattamente dalla Macro di Flash e concentrerei lo sforzo solo sull'evitare che tale macro, una volta azionata, mi apra in un colpo tutte le email della colonna A. Quindi se sono nella cella A12 e aziono la macro, vorrei che il cursore si fermi in A13.

L'errore sicuramente verrà dall'unica riga di codice che ho aggiunto io alla macro di Flash. E' possibile modificare solo quella riga per ottenere l'effetto che cerco?

Per comodità riporto qui la macro:

Public Dest, Oggetto, CorpoM As String
Private Declare Function ShellExecute Lib "Shell32.dll" _
Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, _
ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long

Sub Macro_Flash()
Dim URL As String
URL = "mailto:" & Dest & "?subject=" & Oggetto & "&body=" _
& Replace(CorpoM, Chr(10), "/" & vbCrLf & "\")
URL = Left(URL, 2025)
ShellExecute 0&, vbNullString, URL, vbNullString, vbNullString, vbNormalFocus
ActiveCell.Offset(1, 0).Range("A1").Select
End Sub

La riga che ho scritto io è quella prima di "End Sub".

Grazie
Gianpa12
Utente Junior
 
Post: 68
Iscritto il: 28/06/10 10:10

Re: colleg.ipertestuale

Postdi Gianpa12 » 28/01/15 22:04

Sto provando a tentativi e sembra che la riga incriminata (quella scritta da me: ActiveCell.Offset(1, 0).Range("A1").Select) dovrebbe essere

ActiveCell.Offset(1, -1).Range("A1").Select

per poter raggiungere l'obiettivo di scendere solo di una cella. Cioè sembra che quel -1 entri in conflitto con qualcosa. Ma non ho idea cosa. Qualcuno ha qualche idea? Flash sei in zona?
Gianpa12
Utente Junior
 
Post: 68
Iscritto il: 28/06/10 10:10

Re: colleg.ipertestuale

Postdi Anthony47 » 28/01/15 22:23

Non ho seguito questa discussione, ma a uno sguardo veloce mi sembra una replica della domanda gia' posta in altra discussione (viewtopic.php?f=26&t=103517) in cui ho postato un messaggio.

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

Re: colleg.ipertestuale

Postdi ricky53 » 29/01/15 01:07

Ciao,
leggi gli interventi precedenti (Anthony)

Strano perchè il la prova l'ho fatta sul tuo file e non ho avuto problemi ... comunque soprassediamo.

Non hai letto quanto ti avevo scritto sulla macro di FLash.
Lo riporto:
cambia
Codice: Seleziona tutto
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Column <> 1 Or Target.Value = "" Then Exit Sub
    Dest = Target.Value
    Oggetto = Range("D" & Target.Row).Value
    CorpoM = Range("F" & Target.Row).Value
   
    Macro_Flash
End Sub


con
Codice: Seleziona tutto
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Column <> 1 Or Target.Value = "" Then Exit Sub
    Dest = Target.Value
    Oggetto = Range("D" & Target.Row).Value
    CorpoM = Range("F" & Target.Row).Value
   
    Application.EnableEvents = False ' <<==== Aggiunta
    Macro_Flash
    Application.EnableEvents = True ' <<==== Aggiunta
End Sub
Ultima modifica di ricky53 su 29/01/15 01:13, modificato 3 volte in totale.
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

PrecedenteProssimo

Torna a Applicazioni Office Windows


Topic correlati a "colleg.ipertestuale":


Chi c’è in linea

Visitano il forum: Nessuno e 50 ospiti