Condividi:        

[Excel 2013] La macro non "parte"

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 2013] La macro non "parte"

Postdi fastbike73 » 06/11/14 10:35

Buongiorno, chiedo il vostro aiuto per risolvere il seguente problema.
Ho una cartella di lavoro con diversi fogli, tutti uguli come impostazione, formati e formule, cambiano soltanto i dati.
In colonna C (da C13) riporto la lettura mensile dei contatori dell'acqua dei negozi;
in colonna D (range D13:D120) ho la seguente formula
Codice: Seleziona tutto
=SE(E(C14<>"";C13<>"");C14-C13;"")

calcolo il consumo mensile;

in colonna E (range E13:E120) ho la seguente formula
Codice: Seleziona tutto
=SE(C14<>"";SOMMA(D13:D14);"")

calcolo il consumo progressivo;

in colonna F (range F13:F120) ho la seguente formula
Codice: Seleziona tutto
=SE(D14<>"";MEDIA(D13:D14);"")

calcolo la media;

in colonna G (range G13:G120) ho la seguente formula
Codice: Seleziona tutto
=SE(E(D14<>"";D14>=50);"Invia e-mail";"")

calcola se il consumo è superiore ad un valore predefinito (50) e in caso affermativo scrive "Invia e-mail".

Il punto è questo, la macro che dovrebbe leggere se in colonna G è presente la dicitura "Invia e-mail" e trovandola, scatenare la Sub Send_active_sheet (già impostata e perfettamente funzionante!!) non funziona. In pratica se inserisco una nuova lettura in C che produce un consumo superiore a 50 in G appare la dicitura Invia e-mail e a questo punto dovrebbe partire l'e-mail... ma tutto ciò non avviene. Mi potreste aiutare a capire?
Di seguito riporto il codice, specificando che, dovendo funzionare su tutti i fogli presenti nella cartella, è stato scritto su Thisworkbook:

Codice: Seleziona tutto
Option Explicit

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
   Dim rng As Range, Rng2 As Range, rCell As Range
    Dim aRng As Range, aCell As Range
    Dim LRow As Long
    Const sStr As String = "Invia e-mail"

    With Sh
        LRow = .Cells(Rows.Count, "D").End(xlUp).Row
        Set rng = Intersect(Target, .Range("D13:D" & LRow))
        If Not rng Is Nothing Then
        Set Rng2 = rng.Offset(0, 3)
        End If
        On Error GoTo 0
    End With

    If Not Rng2 Is Nothing Then
        For Each rCell In rng.Cells
            On Error Resume Next
            With rCell
                On Error Resume Next
                Set aRng = Intersect(Rng2, .Dependents)
                On Error GoTo 0
                If Not aRng Is Nothing Then
                    For Each aCell In aRng.Cells
                        With aCell
                            If .Value = sStr Then
                                Call Send_Active_Sheet

                                On Error GoTo XIT

                                Application.EnableEvents = False

                                .Value = "e-mail inviato " & Now()
                            End If
                        End With
                    Next aCell
                End If
            End With
        Next rCell
    End If

XIT:

    Application.EnableEvents = True

End Sub


Fiducioso di un vostro aiuto vi ringrazio anticipatamente!!!
fastbike73
fastbike73
Win 10 & Office365
Filemaker Pro v. 13
fastbike73
Utente Senior
 
Post: 256
Iscritto il: 23/04/14 10:54

Sponsor
 

Re: [Excel 2013] La macro non "parte"

Postdi ricky53 » 06/11/14 11:36

Ciao,
se la dicitura "Invia e-mail" viene scritta, in una cella, tramite delle formule gli eventi NON vengono attivati e la tua macro NON partirà perchè rientra tra gli eventi del foglio che vengono attivati solo quando la condizione cui si riferiscono si VERIFICA: nel tuo caso "Cambiamento di dati in un foglio ... comunque va visto il caso specifico per poter affermare qualcosa.

Per poterti aiutare in modo concreto occorre un file di esempio ... senza dati riservati.
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: [Excel 2013] La macro non "parte"

Postdi fastbike73 » 06/11/14 11:57

ricky53 ha scritto:Ciao,
.....
Per poterti aiutare in modo concreto occorre un file di esempio ... senza dati riservati.


Ciao Ricky, ti invio il file. Per precisione, la macro per l'invio è stata "costruita" per l'utilizzo di Lotus Notes e non outlook.

https://www.dropbox.com/s/8qzcg29f2qp5upi/Monitoraggio%20consumi%20idricii.xlsm?dl=0

Grazie per l'interesse...
fastbike73
Win 10 & Office365
Filemaker Pro v. 13
fastbike73
Utente Senior
 
Post: 256
Iscritto il: 23/04/14 10:54

Re: [Excel 2013] La macro non "parte"

Postdi ricky53 » 06/11/14 12:47

Ciao,
guardando il codice e analizzando le tue formule avevo notato che nel codice facevi riferimento alla colonna "D" come colonna di inserimento letture invece nel foglio tu inserivi le letture in colonna "C" più altre cose ...
Comunque ho modificato il codice adattando le colonne e stavo costruendomi un file di esempio per provare le modifiche quando ho visto che hai inviato il file. Ho provato le mie modifiche sul tuo file ed ho ottenuto ...

PROVA TU !!!

Ecco una parte del codice con le mie modifiche
Codice: Seleziona tutto
        With Sh
            LRow = .Cells(Rows.Count, "C").End(xlUp).Row '<<===== Modificata
            Set rng = Intersect(Target, .Range("C13:C" & LRow)) '<<===== Modificata
            If Not rng Is Nothing Then
                Set Rng2 = rng.Offset(0, 4) '<<===== Modificata
            End If
            On Error GoTo 0
        End With
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: [Excel 2013] La macro non "parte"

Postdi fastbike73 » 06/11/14 14:45

ricky53 ha scritto:Ciao,
guardando il codice e analizzando le tue formule avevo notato che nel codice facevi riferimento alla colonna "D" come colonna di inserimento letture invece nel foglio tu inserivi le letture in colonna "C" più altre cose ...
Comunque ho modificato il codice adattando le colonne e stavo costruendomi un file di esempio per provare le modifiche quando ho visto che hai inviato il file. Ho provato le mie modifiche sul tuo file ed ho ottenuto ...

PROVA TU !!!

Ecco una parte del codice con le mie modifiche
Codice: Seleziona tutto
        With Sh
            LRow = .Cells(Rows.Count, "C").End(xlUp).Row '<<===== Modificata
            Set rng = Intersect(Target, .Range("C13:C" & LRow)) '<<===== Modificata
            If Not rng Is Nothing Then
                Set Rng2 = rng.Offset(0, 4) '<<===== Modificata
            End If
            On Error GoTo 0
        End With



Ricky, come al solito hai fatto centro!!! Mannaggia non me ne ero accorto.... adesso funziona bene.
Una domanda, come anticipato nella cartella ho diversi fogli per quanti sono i negozi. Ogni negozio però ha un consumo differente di acqua (non tutti hanno un reparto pescheria), quindi quel valore "fisso" di 50 può andare bene per un negozio, al più per due o tre. E per gli altri?? Si potrebbe percentualizzare?? Della serie, se il consumo è superiore del 50% rispetto alla media (colonna F) allora invia l'e-mail...
fastbike73
Win 10 & Office365
Filemaker Pro v. 13
fastbike73
Utente Senior
 
Post: 256
Iscritto il: 23/04/14 10:54

Re: [Excel 2013] La macro non "parte"

Postdi ricky53 » 06/11/14 15:57

Caio,
SI, con una cella di appoggio in cui scriverai la formula che meglio si avvicina alla situazione che tu conosci.
Ovviamente la formula te la devi inventare tu.
Poi nelle formule
sostituisci il ">50"
con ">" Tua cella di appoggio
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: [Excel 2013] La macro non "parte"

Postdi fastbike73 » 07/11/14 17:46

Buonasera Ricky,
ho seguito il tuo suggerimento e adesso per ogni foglio ho una "tolleranza" differente. Ho utilizzato una cella d'appoggio (H8)... Adesso ti volevo chiedere, vorrei che il file temporaneo che si crea per l'invio dell'e-mail possa essere "posteggiato" nella stessa directory in cui si trova il file "originale". Questo perchè il foglio potrebbe essere gestito da più utilizzatori. MI potresti gentilmente indicare quali parametri cambiare e in che modo?
Per facilitarti ti riporto il codice nella parte interessata...

...

Codice: Seleziona tutto
Option Explicit
Const EMBED_ATTACHMENT As Long = 1454
Const stPath As String = "c:\excel\Consumi Idrici"
Const stSubject As String = "Monitoraggio consumo idrico negozi"
Const vaMsg As Variant = "Ciao Toni, ho rilevato un consumo anomalo"
Const vaCopyTo As Variant = "fastbike73@outlook.it"

Sub Send_Active_Sheet()
    Dim vaRecipients As Variant
    Dim noSession As Object
    Dim noDatabase As Object
    Dim noDocument As Object
    Dim noEmbedObject As Object
    Dim stFileName As String
    Dim noAttachment As Object
    Dim stAttachment As String
   
    'Copy the active sheet to a new temporarily workbook.
    With ActiveSheet
      .Copy
      stFileName = .Range("A1").Value
    End With
   
    stAttachment = stPath & "\" & stFileName & ".xlsx"
   
    'Save and close the temporarily workbook.
    With ActiveWorkbook
      .SaveAs stAttachment
      .Close
    End With

    'Create the list of recipients.
    vaRecipients = VBA.Array("fleggio73@gmail.com")
   
    'Instantiate the Lotus Notes COM's Object.
    Set noSession = CreateObject("Notes.NotesSession")
    Set noDatabase = noSession.GETDATABASE("", "")
   
    'If Lotus Notes is not open then open the mail-part of it.
    If noDatabase.IsOpen = False Then noDatabase.OPENMAIL
   
    'Create the e-mail and the attachment.
    Set noDocument = noDatabase.CreateDocument
    Set noAttachment = noDocument.CreateRichTextItem("stAttachment")
    Set noEmbedObject = noAttachment.EmbedObject(EMBED_ATTACHMENT, "", stAttachment)
   
    'Add values to the create e-mail proprerties.
    With noDocument
      .Form = "Memo"
      .SendTo = vaRecipients
      .CopyTo = vaCopyTo
      .Subject = stSubject
      .Body = vaMsg
      .SaveMessageOnSend = True
      .PostedDate = Now()
      .Send 0, vaRecipients
    End With
   
    'Delete the temporarily workbook.
    Kill stAttachment
   
    'Release object from memory.
    Set noEmbedObject = Nothing
    Set noAttachment = Nothing
    Set noDocument = Nothing
    Set noDatabase = Nothing
    Set noSession = Nothing
   
    MsgBox "L'e-mail è stata creata e spedita con successo", vbInformation

End Sub
fastbike73
Win 10 & Office365
Filemaker Pro v. 13
fastbike73
Utente Senior
 
Post: 256
Iscritto il: 23/04/14 10:54

Re: [Excel 2013] La macro non "parte"

Postdi ricky53 » 08/11/14 00:44

Ciao,
per salvare nello stesso percorso nel quale hai il file attivo che contiene la macro "Send_Active_Sheet" opera nel seguente modo:

1. elimina l'istruzione Const stPath As String = "c:\excel\Consumi Idrici"

2. aggiungi
Codice: Seleziona tutto
 Dim stPath As String
    stPath = ActiveWorkbook.Path
nella tua macro

Prova e ... sono QUI
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


Torna a Applicazioni Office Windows


Topic correlati a "[Excel 2013] La macro non "parte"":


Chi c’è in linea

Visitano il forum: Nessuno e 35 ospiti

cron