Condividi:        

EXCEL serve 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

EXCEL serve macro

Postdi sbertan » 10/11/13 16:30

Pc facile


Buongiorno a Tutti,
leggo da qualche tempo il forum cercando di applicare situazioni altrui alle mie necessità, non riesco però a by-passare una situazione e devo chiedere aiuto.

SITUAZIONE':
Eseguo giornalmente un copia/incolla da una tabella generata su pagina Web ed incollo su foglio1 di cartella EXCEL2010.

Il risultato è una tabella EXCEL di colonne da A ad N per circa 300/400 righe in base agli utenti evidenziati per la giornata in corso.

Questi utenti hanno una percentuale in colonna N.

Sulla base di questa percentuale, se superiore ad 1% devo inviare una mail, evitando di ripeterla nei … diciamo … 10 giorni successivi.

Al termine dei 10 gg (od altro periodo) si crea REPORT con grafico ad istogramma e si ricomincia.

Ho eseguito una macro in registrazione e devo dire che funziona per la parte iniziale.

Dopo copia/incolla dati eseguo diversi filtri, elimino i dati di colonne che non interessano, restringo poi queste colonne lasciandole ad elimino le righe che riportano certi dati .
Eseguo salvataggio e calcolo del report giornaliero su base delle righe rimaste.
Ed inizio ad inviare le mail (reperendo da un gestionale i dati del singolo nominativo) manualmente in quanto devo allegare altri dati reperiti con interrogazione singola.
Salvo i dati su foglio1 di file es. 2013.11.02 Warning.xlsm .

Tutto OK, per il primo giorno.

Il giorno successivo si crea altro file 2013.11.03 Warning.xlsm.

Ed ho il seguente problema :
COME EVIDENZIARE i nominativi a cui il giorno prima (oppure 2 o 3 giorni prima nel periodo di 10gg) ho inviato la mail ??
Ho pensato manualmente di inserire ogni volta che invio la mail su colonna aggiunta O ( MAIL) appunto l’ind. mail dei singoli (che tanto devo cercare manualmente) onde eseguire mediante macro una verifica con ritorno di frase tipo GIA' ESEGUITO al campo N.

Mi sono arenato causa le mie inesistenti competenze in materia di VBA per generare una macro completa che esegua tutto, oppure altra da lanciare dopo aver eseguito la prima , già funzionante.

SERVE fare in modo che si possa eseguire ricerca della presenza del nominativo in colonna A e del relativo indirizzo mail in colonna O (vuol dire che l’ho spedita e che non dovrò eseguire doppione).

Questa ricerca deve essere eseguita su più file non aperti che potranno essere contenuti in una FOLDER denominata PERIODO
o similare E CHE VERRà SVUOTATA UNA VOLTA TERMINATO IL PERIODO ED ESEGUITO IL REPORT.

2013.11.02 Warning.xlsm
2013.11.03 Warning.xlsm
2013.11.04 Warning.xlsm

SERVE fare in modo che il report ad istogramma avente 4 range e già presente in ogni file di giornata lavorazione, si possa eseguire per tutto il periodo facendo una media dei dati finali di ogni giornata, lavorando quindi su più file non aperti … ecccc. Eccc.

Cosa ne dite ??
Spero di essere stato chiaro, se il lavoro è stato male analizzato ed impostato credo sia possibile intervenire con variazioni.

La base è il famoso copia/incolla di dati 300/400 righe per colonne da A ad O.

Grazie anticipate per l’attenzione
sbertan
Newbie
 
Post: 4
Iscritto il: 10/11/13 15:43

Sponsor
 

Re: EXCEL serve macro

Postdi Anthony47 » 11/11/13 03:39

Ciao sbertan, benvenuto nel forum.
Secondo me devi creare una tabella di mail log con tutti i nominativi e la data di ultimo invio di mail; questo in un file diverso dai vari xyz.Warning.
Userai questa data per validare il superamento della soglia 1%; cioe' l' evidenza non sara' solo che la soglia e' superiore a 1% ma che anche la data di mail e' inferiore di almeno 10 gg rispetto a "oggi".
Se le email sono note, puoi inserirle nel tuo file e usarle come hyperlink, per aprire automaticamente una mail al click sull' indirizzo. In questo caso potrai usare l' evento Worksheet_FollowHyperlink per memorizzare che stai attivando un invio mail e, una volta che hai completato il processo di invio mail, confermare che l' invio e' andato a buon fine e quindi inserire la data nella tabella di mail log. Ad esempio una macro come questa si innesca quando clicchi su una cella con hyperlink; se il link e' a un indirizzo email chiede se l' invio e' stato eseguito correttamente, e se Si puo' andare a inserire la data di invio mail nella tabella di mail log:
Codice: Seleziona tutto
Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
Dim myType, Rispo
On Error GoTo Esci
myType = Split(Target.Address, ":")
If myType(0) = "mailto" Then
    Rispo = MsgBox("Destinatario: " & myType(1) & vbCrLf & _
        "Invio eseguito?", vbYesNo)
    If Rispo = vbYes Then
        'Istruzioni per marcare la data di invio mail in mail log
    End If
'XXX
End If
Beep
Esci:
End Sub
La macro e' da inserire nel "modulo di codice" del foglio che contiene gli indirizzi di mail come hyperlink:
-tasto dx sul tab col nome foglio
-scegli Visualizza codice; ti si apre l' editor delle macro sul modulo giusto
-copia il codice e incollalo nel frame di dx
Per prova, torna su Excel, inserisci un indirizzo di email in una cella accertandoti che venga inserito come hyperlink, clicca sull' hyperlink e vedi l' effetto.
Il codice per inserire la data va impostato in base all' organizzazione della mail log: ad esempio potrebbe essere una tabella con le email di tutti i possibili destinatari in colonna A e la data in colonna B. In questo caso le "istruzioni per marcare la data" potrebbero essere:
Codice: Seleziona tutto
        mymatch = Application.Match(myType(1), Sheets("mail_log").Range("A:A"), False)
        If IsError(mymatch) Then
            MsgBox ("L' indirizzo " & myType(1) & " manca in tabella" & vbCrLf _
                & "Inserire l' indirizzo e la data odierna di invio email")
        Else
            Sheets("mail_log").Cells(mymatch, 2) = Int(Now())
            Sheets("mail_log").Cells(mymatch, 2).NumberFormat = "dd-mmm-yy"
        End If

Inoltre potresti automatizzare l' estrazione della tabella dalla pagina web usando una web query, oppure l' estrazione diretta dalla pagina web; per come impostare una web query guarda l' help on line di Excel; in inea di massima:
-Ribbon /Dati /Da Web
-inserisci l' url da cui prelevare la tabella, Vai
-scegliere quale tabella importare, premi Importa
-scegliere la posizione in cui importare la tabella, Ok
L' importazione potrebbe aggiungere o eliminare righe sul foglio di lavoro, quindi suggerisco di eseguire l' importazione su un foglio non usato per altri scopi; poi copi l' intera tabella su altro foglio dove fai tutte le elaborazioni del caso. Per questo potresti usare una macro come questa:
Codice: Seleziona tutto
Sub Refresh()
With Sheets("Foglio1")
    .Range("H10").QueryTable.Refresh BackgroundQuery:=False
    .Range(.Range("H10").QueryTable.Name).Copy _
        Destination:=Sheets("Foglio2").Range("A1")
End With
End Sub
Ho immaginato che la query sia impostata su Foglio1, e che importi la tabella in H10 e successive; la tabella viene quindi integralmente copiata in Foglio2. Adatta al tuo caso.
Poi magari in Foglio2 disegni un pulsante (la versione piu' semplice la trovi in Menu /Sviluppo /Inserisci, Controlli Modulo) e gli associ la macro Refresh (ti verra' chiesto esplicitamente quale macro associalre al pulsante); in questo modo per ottenere la tabella aggiornata ti bastera' premere il pulsante: la macro si preoccupera' di aggiornare il contenuto della tabella e copiarlo in Foglio2.

Spero che tra questi spunti trovi qualcosa di utile.

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

Re: EXCEL serve macro

Postdi sbertan » 11/11/13 21:09

Ciao e complimenti per la tempestività !!
Non riesco a gestire il collegamento per import in quanto la pagina web necessita di digitazione PWD e successiva scelta opzioni per rendere i dati).

Dunque ho predisposto il file con le mail ed i nominativi :
col. A è nominativo
col. B è indirizzo mail conosciuto
col. C è valorizzata dalla data quando spedita mail.

Ora devo capire come filtrare la tabella giornaliera abbinando il controllo se maggiore 1% + assenza mail inviata.

In pratica:
import tabella con le precedenti verifiche per filtri vari
qualora tra i filtrati sia presente DATA precedente mail inserire data
qualora tra i filtrati sia ASSENTE DATA precedente mail inserire indirizzo che poi se utilizzato possa rendere la condizione mail inviata (cioè la data) per le successive giornate.
il tutto in colonna O ...

Visto che mi serve un file REPORT di periodo, potrei inserire l'elenco nominativi e le date in un foglio di questo file mentre su altro foglio metto i totali per il mio istogramma ??

RIEPILOGO:
diversi file giornalieri che riportano la condizione DATA o EMAIL per ogni nominativo che supera il 1% , aggiornandosi dal file REPORT che in foglio10 contiene i dati aggiornati di volta in volta dai vari file giornalieri che a loro volta puntano anche per estrarre il dato.

Forse sto perdendo la bussola ........
sbertan
Newbie
 
Post: 4
Iscritto il: 10/11/13 15:43

Re: EXCEL serve macro

Postdi Anthony47 » 11/11/13 23:30

Non conosco il tuo processo e quindi vado a tentoni...
Ho capito che hai creato un nuovo foglio, con email, nominativi e data di invio mail.
Immagino che questa anagrafica sia inserita nel tuo file "master", quello con cui esegui le elaborazioni e crei i file "Data-warning.xlsm".
Ho capito che i dati estratti possono essere incrociati con questa anagrafica; meglio: io affiancherei alle tre colonne dell' anagrafica le 14 colonne della tabella estratta, a ogni nominativo la sua riga dati (oppure riga vuota se il nominativo non e' in tabella); per questo potrai usare formule Cerca.Vert, usando il nominativo (o altra chiave univoca presente sia nella tua anagrafica che nella tabella).
Se le colonne A:C sono di anagrafica, allora le colonne A:N della tabella finiranno diciamo in E:R (col D lasciata vuota).
La percentuale (ex colonna N) e' ora in colonna R.
In colonna T ti costruisci il flag di "attenzione", usando una formula tipo
Codice: Seleziona tutto
=SE(E(R2>0,01;(OGGI()-C2)>10);R2;"")

Mettere in T2 e copiare verso il basso per tutte le righe dell' anagrafica.

A questo punto applichi il filtro automatico sulla colonna T filtri per Diverso da Nullo; visualizzerai cosi' solo le righe che hanno sia una percentuale >1% che una data piu' vecchia di 10 gg rispetto a oggi.
Cliccando sull' indirizzo email (colonna B) avvierai la compilazione della mail e, con la Private Sub Worksheet_FollowHyperlink, la composizione della nuova data di invio email.
Avendo modificato le colonne che contengono email e data (le hai messe in colonna B e C, mentre il mio codice se le aspettava in A e B) il codice di inserimento della data va leggermente modificato per riflettere il nuovo tracciato;
Codice: Seleziona tutto
        mymatch = Application.Match(myType(1), Sheets("mail_log").Range("B:B"), False)
        If IsError(mymatch) Then
            MsgBox ("L' indirizzo " & myType(1) & " manca in tabella" & vbCrLf _
                & "Inserire l' indirizzo e la data odierna di invio email")
        Else
            Sheets("mail_log").Cells(mymatch, 3) = Int(Now())
            Sheets("mail_log").Cells(mymatch, 3).NumberFormat = "dd-mmm-yy"
        End If

Da modificare anche il nome foglio, se non si chiama "mail_log".

Per tutto il resto (come creare il file Data_Warning.xlsm, il file Report di periodo, i dati e l' istogramma), non ho capito se sei "a buon punto" o che cosa.
Infine se ti servono dati dei giorni precedenti, per me la cosa piu' semplice e' che li mantieni sul file di cui stiamo parlando; questo ti evitera' di andare a cercarli in archivio su file dei giorni precedenti.

Spero che ci sia qualche spunto utile.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19438
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re3: EXCEL serve macro

Postdi sbertan » 14/11/13 10:11

Eccomi,
ho provato ad eseguire ed ho anche reperito qualcosa in rete che però funziona singolarmente ed andrebbe impacchettato insieme.
Chiedo scusa se ripeterò richieste già inserite in post precedente, ma preferisco evitare rimandi ed effettuare le richieste totali di volta in volta, potri aver cambiato parte dell'impostazione di processo.
--------------------------
Al termine del tutto vorrei strutturare il processo come segue con 3 tipologie di file:
elenco NOMINATIVI.xlsm file unico già predisposto manca solo import data vedi sotto
2013.11.gg Warning.xlsm file giornaliero da completare
2013.11.gg Warningz REPORT.xlsm file unico già predisposto


file unico elenco NOMINATIVI.xlsm
lo implemento con i nominativi che di volta in volta entrano a far parte del gruppo
Non vorrei che fosse un nuovo foglio in ambito stesso file , preferirei avere un file singolo al quale attingere e che riporti i seguenti dati su 3 colonne

col. A è elenco nominativi
col. B è email del nominativo
col. C riceve input da alto foglio e riporta le date relative ad invio ultima mail (vedi sotto)

Questo foglio/file sarà copiato su un foglio del file 2013.11.gg Warning.xlsm che sarà il vero “motore” sul quale lavorare.

file giornaliero 2013.11.gg Warning.xlsm
la copia delle colonne (ex B-C) sarà eseguita in O-P
devo copiare solo le email e le date per i nominativi risultanti in col. A a fine operazioni filtro e cancellazione righe successive al copia/incolla da WEB.

col. O è email dei nominativi
è ad input operatore e se clikkata deve in colonna P apporre data del giorno
inoltre se clikkata deve aprire mail OUTLOOK ricavando il testo da un bodymail preimpostato altrove con testo a piacere, uguale per tutti.


col. P se cella riporta data prelevata da elenco NOMINATIVI.xlsm è data di eventuale precedente mail e non procederò all’invio in data oggi.
col. P se inserita data in cella causa email odierna deve essere riportata anche su elenco NOMINATIVI.xlsm col.C pari nominativo.


SVOLGIMENTO
copio il mio elenco WEB manualmente su foglio1 di 2013.11.gg Warning.xlsm
lo filtro con 1 o 2 macro
poi con macro od altro di IMPORT devo avere a disposizione in col. O le email dei nominativi ed in col. P eventuali date di precedenti invii importando da file elenco NOMINATIVI.xlsm

Deciderò poi quali ind. mail inviare eseguendo input su celle di col. O con:

recupero di mail con OGGETTO e TESTO preimpostati
successiva valorizzazione di data del giorno su cella col. P che sarà riportata anche su col.C di elenco NOMINATIVI.xlsm per le verifiche del giorno successivo.


e via così
sbertan
Newbie
 
Post: 4
Iscritto il: 10/11/13 15:43

Re2: EXCEL serve macro ++ AGGIUNTA ++

Postdi sbertan » 14/11/13 15:59

Salve, aggiungo i codici dell'attuale MACRO per file 2013.11.gg Warning.xlsm la quale:
ordina-filtra-formatta-cancella-riformatta-riordina le varie COLONNE da a fino ad N.

----------------

Sub MACROfoglioORDINAcancELIMINA()
'
' MACROfoglioORDINAcancELIMINA Macro
' Dopo import dati ordina colonna C ordine 2013,Si,2007,No E ordine Si,No N colonna Dal più grande al più piccolo cancella CONTENUTI colonne B-D-F-G-I-J-K-L-M restringi colonne B-D-F-G-I-J-K-L-M lanciare macro ELIMINA RIGHE
'
ActiveWorkbook.Worksheets("Foglio1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Foglio1").Sort.SortFields.Add Key:=Range("C2:C1000" _
), SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _
"2013,Si,2007,No", DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Foglio1").Sort.SortFields.Add Key:=Range("E2:E1000" _
), SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:="Si,No", _
DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Foglio1").Sort.SortFields.Add Key:=Range("N2:N1000" _
), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
Range("A2:O1000").Select
ActiveWindow.ScrollRow = 525
ActiveWindow.ScrollRow = 454
ActiveWindow.ScrollRow = 379
ActiveWindow.ScrollRow = 326
ActiveWindow.ScrollRow = 275
ActiveWindow.ScrollRow = 222
ActiveWindow.ScrollRow = 161
ActiveWindow.ScrollRow = 103
ActiveWindow.ScrollRow = 47
ActiveWindow.ScrollRow = 13
ActiveWindow.ScrollRow = 1
ActiveWorkbook.Worksheets("Foglio1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Foglio1").Sort.SortFields.Add Key:=Range( _
"C2:C1000"), SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _
"2013,Si,2007,No", DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Foglio1").Sort.SortFields.Add Key:=Range( _
"E2:E1000"), SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _
"Si,No", DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Foglio1").Sort.SortFields.Add Key:=Range( _
"N2:N1000"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("Foglio1").Sort
.SetRange Range("A2:O500")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Columns("B:B").Select
Selection.ClearContents
Range("B:B,D:D,F:F,G:G,I:I,J:J,K:K,L:L,M:M").Select
Range("M1").Activate
With Selection.Interior
.Pattern = xlNone
.TintAndShade = 0
.PatternTintAndShade = 0
End With
Selection.ClearContents
Selection.ColumnWidth = 4.29
Selection.ColumnWidth = 2.43
Selection.ColumnWidth = 2.14
Selection.ColumnWidth = 1.57

Dim ur As Integer, riga As Integer
Dim col As String

col = "C"
If col = "" Then Exit Sub
ur = Cells(Rows.Count, col).End(xlUp).Row
If ur = 1 Then Exit Sub
For riga = ur To 1 Step -1
If IsError(Cells(riga, col)) Then Rows(riga).Delete
If Cells(riga, col).Value = "2007" Then Rows(riga).Delete
If Cells(riga, col).Value = "No" Then Rows(riga).Delete
Next

col = "E"
If col = "" Then Exit Sub
ur = Cells(Rows.Count, col).End(xlUp).Row
If ur = 1 Then Exit Sub
For riga = ur To 1 Step -1
If IsError(Cells(riga, col)) Then Rows(riga).Delete
If Cells(riga, col).Value = "No" Then Rows(riga).Delete
Next

col = "N"
If col = "" Then Exit Sub
ur = Cells(Rows.Count, col).End(xlUp).Row
If ur = 1 Then Exit Sub
For riga = ur To 1 Step -1
If IsError(Cells(riga, col)) Then Rows(riga).Delete
Range("N1000").Activate
Selection.NumberFormat = "0.00"
If Cells(riga, col).Value < 0.01 Then Rows(riga).Delete
Selection.NumberFormat = "0.00%"


Next
Range("A2:N1000").Select
ActiveWorkbook.Worksheets("Foglio1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Foglio1").Sort.SortFields.Add Key:=Range("A2:A999" _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Foglio1").Sort
.SetRange Range("A2:N999")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

End Sub
---------------------------

ed in un qualche modo mi funziona !!!!

SERVIREBBE ora lo svolgimento di cui a
poi con macro od altro di IMPORT devo avere a disposizione in col. O le email dei nominativi ed in col. P eventuali date di precedenti invii importando da file elenco NOMINATIVI.xlsm

Deciderò poi quali ind. mail inviare eseguendo input su celle di col. O con:

recupero di mail con OGGETTO e TESTO preimpostati
successiva valorizzazione di data del giorno su cella col. P che sarà riportata anche su col.C di elenco NOMINATIVI.xlsm per le verifiche del giorno successivo.



Per il lanciare mail PRECOMPILATA ho trovato:
-----------
Public Sub InviaMail33()

Dim WIn As Worksheet
Dim destinatario As String
Dim ws As Worksheet
Dim BodyMail As String

Dim j As Integer
Dim Primo As Boolean

j = 4

Set WIn = ThisWorkbook.Worksheets("DistributionTable")
Set OutApp = CreateObject("Outlook.Application")
BodyMail = WIn.Cells(j, 3).Value

Set OutMail = OutApp.CreateItem(0)

With OutMail
.to = WIn.Cells(j, 1).Value
.cc = WIn.Cells(j, 2).Value
.Subject = "OVERWARNING - "
.Body = BodyMail
.Display

End With

Set OutMail = Nothing
Set OutApp = Nothing

End Sub

-----------
ma non riesco ad estrapolarla dal file (che ho scaricato) per applicarlo al mio [color=#0000BF]2013.11.gg Warning.xlsm[/color] [/color]


INOLTRE
questa è la formula applicata all'intero Foglio1 del file elenco AVVOCATI.xlsm
però servirebbe che venisse applicata alle colonne O eP di 2013.11.gg Warning.xlsm

Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
Dim myType, Rispo
On Error GoTo Esci
myType = Split(Target.Address, ":")
If myType(0) = "mailto" Then
Rispo = MsgBox("Destinatario: " & myType(1) & vbCrLf & _
"Invio eseguito?", vbYesNo)
If Rispo = vbYes Then

End If

mymatch = Application.Match(myType(1), Sheets("Foglio1").Range("B:B"), False)
If IsError(mymatch) Then
MsgBox ("L' indirizzo " & myType(1) & " manca in tabella" & vbCrLf & "Inserire l' indirizzo e la data odierna di invio email")
Else
Sheets("Foglio1").Cells(mymatch, 3) = Int(Now())
Sheets("Foglio1").Cells(mymatch, 3).NumberFormat = "dd/mm/yyyy"
End If
Beep
Esci:
End If

End Sub


--------------------------

Ringrazio molto per l'aiuto
sbertan
Newbie
 
Post: 4
Iscritto il: 10/11/13 15:43


Torna a Applicazioni Office Windows


Topic correlati a "EXCEL serve macro":


Chi c’è in linea

Visitano il forum: papiriof e 9 ospiti