LoginRegistrati
Stai vedendo 11 articoli - dal 1 a 11 (di 11 totali)
  • Autore
    Articoli
  • #16908 Risposta

    mancino
    Partecipante

      Ciao a tutti carissimi amici della comunità è da circa un mese che vi seguo da non iscritto. Sto entrando adesso nel mondo della programmazione delle macro in vba e ho bisogno del vostro aiuto per una macro in Outlook. Praticamente sto creando a scopo di esercizio una macro che estrae i dati da una mail (quindi mittente, destinatario, oggetto..) e li va a mettere nelle textBox di un form. Ho capito che per il mio scopo devo usare l'oggetto MailItem e usare le sue properties e l'oggetto Outlook.Explorer per la mail selezionata. Il problema è che non funziona nulla.  Vi posto un frammento di codice per l'estrazione del mittente.

      Dim mail As MailItem

      Dim Explorer As Outlook.Explorer

      Set Explorer = Application.ActiveExplorer

      Set mail = m

      mittente = m.SenderEmailAddress

       

      Non capisco che cosa sto sbagliando, mi potete dare una dritta?

      #16909 Risposta

      vecchio frac
      Senior Moderator
      • Sfida #1
        145 pts

        Hai postato proprio un frammento di codice, mentre sarebbe bene vederlo nella sua interezza: da qui non si può ricavare se hai correttamente dichiarato tutte le variabili, per esempio.

        Potrei chiederti da dove salta fuori la variabile "m": la assegni a un oggetto mailItem ma non è nè dichiarata nè valorizzata.

        Puoi postare la sub intera? (e anticipo una cosa che sai già se ci segui da un pochino, metti sempre Option Explicit in testa a i moduli)

        #16910 Risposta

        mancino
        Partecipante
          Public Sub archiviaMail1()
          
          'dichiarazione
          Dim destinatario, mittente, utente As String
          Dim mail As MailItem
          Dim m As MailItem
          Dim olApp As New Outlook.Application
          Dim olMail As Object
          Dim Explorer As Outlook.Explorer
          Dim mySel As Outlook.Selection
          Dim x, n As Integer
          Dim objMail As Outlook.MailItem
          Dim objItem As Outlook.ItemProperty
          
          Set Explorer = Application.ActiveExplorer
          Set mySel = Explorer.Selection
          
          For x = 1 To mySel.Count
          mittente = mySel.Item(x).SenderName
          Next x
          
           
          
          ArchiviaForm1.MittenteText.Text = mittente
          ArchiviaForm1.DestinatarioText.Text = destinatario
          ArchiviaForm1.NoteText.Text = "Archiviato da " + utente + " il " + Str(Now())
          
          'chiedo conferma per iniziare l'archiviazione della mail
          If MsgBox("Vuoi archivare una mail? ", vbOKCancel, "Archiviazione Mail") = vbOK Then
          
          ArchiviaForm1.Show
          
          End If
          
          End Sub

           

          Ecco qui c'è il codice che ho elaborato nel frattempo e con il quale riesco ad estrarre il mittente. Ma il destinatario non riesco. non riesco ad usare l'oggetto mailItem.

          Comunque hai ragione m era un oggetto che avevo dichiarato come mailItem

           

           [Edit by admin: per inserire il codice formattato cliccare sul pulsante nell'editor (codice VBA)]

          #16917 Risposta

          vecchio frac
          Senior Moderator
          • Sfida #1
            145 pts

            In un oggetto mailItem i destinatari sono contenuti in una collezione chiamata Recipients.

            msgbox mySel.Item(x).Recipients(1)

            nel tuo caso restituisce il primo dei destinatari (quelli separati da punto e virgola nel campo "A:")

            Il tuo codice ha un problemino nel recupero del mittente, se tu cicli da uno a tutti gli elementi di mySel, alla fine del ciclo solo l'ultimo mittente viene conservato nella variabile omologa.

            Anche la dichiarazione

            Dim destinatario, mittente, utente As String

            non è scritta bene, perchè solo "utente" è dichiarato as String, gli altri sono Variant per default.

            Nota: grazie Admin per aver cambiato l'etichetta del pulsante che permette di inserire codice VBA, era una cosa che volevo richiamare 🙂

            #16961 Risposta

            mancino
            Partecipante

              Ciao ragazzi alla fine con i vostri consigli ce l'ho fatta.  Volevo utilizzare la discussione per chiedervi un consiglio su come fare un'altra operazione. Praticamente quando si apre il form compilato con i dati della mail parte una funzione che fa una query ad una tabella su un database SQL. I risultati sono visualizzati in una comboBox e io vorrei che al cambio del record nella comboBox si aggiornasse anche il valore in una listBox.

              vi posto il codice della funzione

              `Let ad.ConnectionString = "Provider=sqloledb;" & "Persist Security Info=False; User ID=****; Password=****; " & "Initial Catalog=prova;" & "Server=server"
                  
                  ad.Open
                  
                  Set ar = New ADODB.Recordset
                  ' apro la connessione
                  ar.Open "SELECT Codice, Società, Commerciale FROM " + tableSearch + _
                  " Where UPPER(" + fieldSearch + ") like '%" + UCase(textSearch) + "%'", ad, adOpenDynamic, adLockOptimistic
                  
                  DittaBox.Clear
                  i = 1
                  If Not ar.EOF Then
                      DittaBox.Text = CStr(ar.Fields("Società").Value)
                      commercialeText.Text = CStr(ar.Fields("Commerciale").Value)
                      'operatoreText.Text = CStr(ar.Fields("Operatore").Value)
                      sqlSearch = True
                  Else
                      DittaBox.AddItem "Assente in anagrafica"
                      DittaBox.Text = "Assente in anagrafica"
                      commercialeText.Text = "Assente in anagrafica"
                      'operatoreText.Text = "Assente in anagrafica"
                      sqlSearch = False
                  End If
                  
                  While (Not ar.EOF) And (i < 100)
                      DittaBox.AddItem CStr(ar.Fields("Società").Value)
                      i = i + 1
                      ar.MoveNext
                  Wend
                  ' chiuso la connessione
                  ad.Close
              
              End Function
              
              `
              #17068 Risposta

              mancino
              Partecipante

                Ciao a tutti! Sono ancora alle prese con il mio applicativo in vba per outlook. Avevo una domanda da farvi per risolvere un altro problema. Praticamente ho una vista in sql dove ci sono dei valori 1, 2, 3, 4. Questi valori attraverso una query li visualizzo in una combobox. Quello che vorrei fare è che anzichè visualizzare 1, 2, 3, 4 fossero visualizzati a, b, c, d. Avevo pensato di utilizzare un select case ma non riesco a capire dove lo potrei scrivere, se dentro la query o dopo. Mi date una mano?

                #17070 Risposta

                vecchio frac
                Senior Moderator
                • Sfida #1
                  145 pts

                  mancino ha scritto:

                  vorrei che al cambio del record nella comboBox si aggiornasse anche il valore in una listBox.

                  Questa l'hai risolta? Non è chiaro per niente cosa intendi.

                  mancino ha scritto:

                  anzichè visualizzare 1, 2, 3, 4 fossero visualizzati a, b, c, d

                  Questi numeri sono i codici numerici dei valori associati? Come è costruita la query? La combobox deve essere impostata multicolonna, la colonna associata è la prima, la seconda la costruisci con il punto e virgola:

                  Set ar = New ADODB.Recordset
                     
                  ar.Open "select codice, descrizione from mytable", ad, adOpenDynamic, adLockOptimistic
                  
                  while not ar.eof and not ar.bof
                      combobox.additem ar("codice") & ";" & ar("descrizione")
                      ar.movenext
                  wend

                  Poi tieni presente che il combobox espone anche la proprietà Column con cui puoi accedere a una singola colonna di una riga del combobox.

                  #17079 Risposta

                  mancino
                  Partecipante

                    Grazie del tuo prezioso aiuto. In effetti devo sistemare anche l'altra questione. Il problema è il seguente. Ho un tasto "cerca" che fa partire la query ad una tabella sql dove ho caricato dei nomi di alcune aziende e di alcuni ipotetici dipendenti per prova. I risultati della query delle ditte vanno su una combobox che le visualizza, mentre in una textbox va il nome del dipendente. Se cambio il nome della ditta nella comboBox però vorrei che si aggiornasse anche la textbox con il nome del dipendete associato alla ditta. 

                    Per la questione attuale invece ti posto il codice.

                    Public Function searchIn(textSearch As String, fieldSearch As String, tableSearch As String) As Boolean
                        'parametri di connessione
                        Dim ad As ADODB.Connection
                        Dim ar As ADODB.Recordset
                    
                        Dim DatabaseName As String
                        Dim UserName As String
                        Dim UserPassword As String
                        
                        Dim ws As Workspace
                        Dim db As Database
                        Dim strConnection As String
                         
                        Set ad = New ADODB.Connection
                        ' stringa di connessione
                        Let ad.ConnectionString = "Provider=sqloledb;" & "Persist Security Info=False; User ID=Luca; Password=abc; " & "Initial Catalog=Therefore;" & "Server=THESERVER"
                        
                        ad.Open
                        
                        Set ar = New ADODB.Recordset
                        ' apro la connessione
                        ar.Open "SELECT KeywordNo, Id FROM " + tableSearch + _
                        " Where UPPER(" + fieldSearch + ") like '%" + UCase(textSearch) + "%'", ad, adOpenDynamic, adLockOptimistic
                        
                       
                        i = 1
                        ComboBox1.Clear
                        i = 1
                        If Not ar.EOF Then
                            ComboBox1.Text = CStr(ar.Fields("KeywordNo").Value)
                            End If
                        While (Not ar.EOF) And (i < 10)
                            ComboBox1.AddItem CStr(ar.Fields("KeywordNo").Value)
                            i = i + 1
                            ar.MoveNext
                        Wend
                    
                    
                    

                     

                    Questa è la funzione che fa la query. KeywordNo è il nome della colonna che ha come valori 1, 2, 3, 4. 

                    searchIn ComboBox1.Text, "Id", "TheKeywords35"

                    Questa è la chiamata nella combobox. 

                    #17085 Risposta

                    vecchio frac
                    Senior Moderator
                    • Sfida #1
                      145 pts

                      mancino ha scritto:

                      I risultati della query delle ditte vanno su una combobox che le visualizza, mentre in una textbox va il nome del dipendente

                      L'altro giorno però invece di textbox parlavi di listbox, forse più correttamente, perchè immagino che ci siano più di un dipendente per ogni ditta. Comunque non vedo grandi difficoltà, la query filtra il recordset per ditta, e il set di record filtrato lo associ alla proprietà rowsource della listbox (e se hai una textbox, puoi farla multilinea ma allora devi scorrere il contenuto del set di record e concatenare i risultati con newline per inserire tutto nella textbox... meglio la listbox).

                      Nel resto del codice:

                      - il doppio i = 1 è ridondante, togline uno;

                      - perchè recuperi solo dieci record in quel modo? non puoi fare SELECT TOP 10 ?

                      - fai molte ricerche su campi e tabelle diverse o sempre solo sulla stessa tabella e campo? perchè potresti impostare una connessione persistente fuori dalla routine e avere sempre la connessione aperta e disponibile, senza doverla aprire e chiudere ogni volta che fai una ricerca

                      Comunque se imposti la combobox con due colonne, associ la prima, imposti la larghezza dei campi a 0cm e poi la popoli con l'istruzione:

                      ComboBox1.AddItem ar("Id") & ";" & ar("KeywordNo") 

                      dovresti ottenere una combo che mostra solo i valori nel campo KeywordNo, mentre i valori nel campo id ne costituiscono la chiave univoca (ed è anche il valore restituito dalla combo quando selezioni una riga)

                      #17098 Risposta

                      mancino
                      Partecipante

                        Buongiorno! Grazie come sempre dell'aiuto, sei gentilissimo. 

                        Allora io ho una textbox perchè in realtà essendo un esercizio che mi serve per fare pratica e prendere confidenza l'ho fatto con pochi record. Quindi il dipendente inserito è uno. Adesso cerco di saltarci fuori. 

                        Per la connessione hai ragione, la connessione è sulla stessa tabella quindi non ho bisogno di aprire la connessione ogni volta!

                        Per la combobox in effetti il tuo metodo funziona ma penso che dovrò ricorrere ad un select case perchè KeywordsNo ha i valori di 1, 2, 3, 4 mentre id ha valori che in realtà non mi servono. Quindi devo trovare il modo di fare 1; a, 2;b, 3;c, 4;d.

                        #17099 Risposta

                        vecchio frac
                        Senior Moderator
                        • Sfida #1
                          145 pts

                          mancino ha scritto:

                          KeywordsNo ha i valori di 1, 2, 3, 4 mentre id ha valori che in realtà non mi servono

                          Scusa ma mi sento un po' confuso adesso. Se il campo id ha valori che non ti servono, non inserirlo nella query: siccome da questa devi ottenere i valori con cui devi popolare la listbox, devi assicurarti che la query ti restituisca i dati che ti servono. AL limite potresti sfruttare l'indice i che scorre i record nel mentre li accodi alla listbox:

                          While (Not ar.EOF) And (i < 10)
                                  i = i + 1
                                  ComboBox1.AddItem i & ";" & ar("KeywordNo")
                                  ar.MoveNext
                              Wend
                        LoginRegistrati
                        Stai vedendo 11 articoli - dal 1 a 11 (di 11 totali)
                        Rispondi a: Vba e outlook
                        Gli allegati sono permessi solo ad utenti REGISTRATI
                        Le tue informazioni:



                        vecchio frac - 2136 risposte

                        albatros54
                        albatros54 - 650 risposte

                        patel
                        patel - 510 risposte

                        Marius44
                        Marius44 - 409 risposte

                        Luca73
                        Luca73 - 373 risposte