Condividi tramite

Estrazione Automatica

Anonimo
2024-12-05T17:00:14+00:00

Ciao, ho un file impostato sempre con le stesse colonne rinominate sempre nello stesso modo.

Questo file ogni settimana lo aggiorno ogni settimana manualmente (copia/incolla) con un elenco di nominativi.

E' possibile fare un estrazione automatica in un foglio separato (che si rinomina con il gg in cui si fa l'estrazione) nel file stesso, dove nel foglio si elencano tutti i nominativi che ha trovato nell'aggiornamento della settimana? Poi ogni settimana si crea un foglio nuovo.

Di seguito un esempio del file Estrazione.xlsx, la colonna "risposta" con le voci selezionabili poi sarà mia premura compilarla, la mia esigenza è solo avere un recap dei nominativi trovati il gg dell'estrazione.

Questo il file sorgente FILE PER SOLLECITI.xlsx dove pesca i nominativi e dove si deve creare il foglio di estrazione, spero di esser stato completo e chiaro.

Grazie mille

Microsoft 365 e Office | Excel | Per il lavoro | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2024-12-13T18:20:17+00:00

Ciao,

per questo normalmente si chiede un esempio del risultato desiderato. Spesso una immagine spiega meglio di molte parole.

E conoscere lo scenario può far modificare in modo sostanziale le procedure.

Ti incollo la procedura che in serie fa queste cose.

  1. cerca di intercettare un file aperto con il nome "ESTRAZIONE.xlsx".
  2. se non è presente un file aperto con quel nome cerca di aprirlo da un percorso predefinito.

Vedi la constante Const sPercorsoFileEstrazioni As String = "C:\Dropbox\Microsoft Community" (dovrai impostare il tuo percorso badando di chiudere il percorso con la barra separatrice dei percorsi).

  1. se il file non esiste allora ne viene creato uno nuovo.

Nel caso di file nuovo verrà rinominato il primo foglio e nello stesso vengono inseriti i nominativi e viene effettuata una eliminazione dei nominativi duplicati, inserita la colonna RISPOSTA, applicati i formati ed applicate le varie formattazioni (ho impostato il carattere Calibri con dimensione 10).

Se il file esiste e non è aperto viene aperto e a questo punto viene verificata l'eventuale esistenza di un foglio già nominato con la data di estrazione (il formato del nome è "gg.mm.aa").

Se viene trovato un foglio che ha già il nome di quel giorno della estrazione viene eseguita una cancellazione totale del foglio (istruzione If bFoglioEstrazioneEsiste Then .UsedRange.Clear) e poi vengono eseguite le varie operazioni di inserimento dati, rimozione duplicati, ecc. ecc.

Se il foglio con quel nome non esiste ne viene creato uno nuovo posizionato come primo foglio della cartella di lavoro.

Quindi man mano il primo è il più recente.

Ma volendo si potrebbe spostare il foglio alla fine, anche se con l'aumentare dei fogli, forse è preferibile avere il più recente per primo e il meno recente per ultimo.

Ma se preferisci l'altra soluzione basta modificare questa istruzione:

Set oFoglioEstrazioni = .Worksheets.Add(Before:=Sheets(1))

con

Set oFoglioEstrazioni = .Worksheets.Add(After:=Sheets(Sheets.Count))

ho previsto entrambe le istruzioni e di basta anteporre la virgoletta singola all'istruzione che desideri disabilitare.

Alla fine il file viene salvato e se non era già aperto viene chiuso.

Anche qui ti basta, se non desideri chiudere il file, disabilitare l'istruzione tramite la virgoletta singola.

Questo il codice:

Sub EsportaNomiFornitori() 

   Const sPercorsoFileEstrazioni As String = "C:\Dropbox\Microsoft Community\" 

   Const sNomeFileEstrazioni = "ESTRAZIONE.xlsx" 

   Dim WbEstrazioni As Workbook 

   Dim bFileEstrazioniAperto As Boolean 

   Dim bNuovoFileEstrazioni As Boolean 

   Dim oFoglioEstrazioni As Worksheet 

   Dim sNomeFoglioEstrazioni As String 

   Dim bFoglioEstrazioneEsiste As Boolean 

   Dim rng As Range 

   Dim UltimaRiga As Long 

   Application.ScreenUpdating = False 

   On Error Resume Next 

   Set WbEstrazioni = Workbooks(sNomeFileEstrazioni) 

   Err.Clear 

   If WbEstrazioni Is Nothing Then 

      Set WbEstrazioni = Workbooks.Open(sPercorsoFileEstrazioni & sNomeFileEstrazioni) 

      If WbEstrazioni Is Nothing Then 

         Set WbEstrazioni = Application.Workbooks.Add(xlWBATWorksheet) 

         bNuovoFileEstrazioni = True 

      End If 

   Else 

      bFileEstrazioniAperto = True 

   End If 

   Err.Clear 

   On Error GoTo GestioneErrori 

   With ThisWorkbook 

      Set rng = .Worksheets("righe da sollecitare totali").Columns("B") 

   End With 

   UltimaRiga = Application.Max(2, rng.Find(What:="*", _ 

                                             After:=rng.Cells(1), _ 

                                             LookIn:=xlValues, LookAt:=xlPart, _ 

                                             SearchOrder:=xlByRows, _ 

                                             SearchDirection:=xlPrevious, _ 

                                             MatchCase:=False, _ 

                                             SearchFormat:=False).Row) 

   Set rng = rng.Resize(UltimaRiga) 

   With WbEstrazioni 

      sNomeFoglioEstrazioni = Format(Date, "dd.mm.yy") 

      If bNuovoFileEstrazioni Then 

         Set oFoglioEstrazioni = .Worksheets(1) 

         oFoglioEstrazioni.Name = sNomeFoglioEstrazioni 

         .SaveAs sPercorsoFileEstrazioni & sNomeFileEstrazioni, xlWorkbookDefault 

      Else 

         On Error Resume Next 

         bFoglioEstrazioneEsiste = CBool(Len(.Sheets(sNomeFoglioEstrazioni).Name)) 

         Err.Clear 

         On Error GoTo GestioneErrori 

         If bFoglioEstrazioneEsiste = False Then 

            Set oFoglioEstrazioni = .Worksheets.Add(Before:=Sheets(1)) 

            'Set oFoglioEstrazioni = .Worksheets.Add(After:=Sheets(Sheets.Count)) 

            oFoglioEstrazioni.Name = sNomeFoglioEstrazioni 

         Else 

            Set oFoglioEstrazioni = .Worksheets(sNomeFoglioEstrazioni) 

         End If 

      End If 

      With oFoglioEstrazioni 

         If bFoglioEstrazioneEsiste Then .UsedRange.Clear 

         With .Range("A1") 

            With .Resize(rng.Rows.Count) 

               .Value = rng.Value 

               .Resize(rng.Rows.Count).RemoveDuplicates Columns:=1, Header:=xlYes 

               .EntireColumn.AutoFit 

               Set rng = .CurrentRegion 

            End With 

            .Value = "FORNITORE" 

            .Font.Bold = True 

            .HorizontalAlignment = xlCenter 

            With .Offset(0, 1) 

               .Value = "RISPOSTA" 

               .Font.Bold = True 

               .HorizontalAlignment = xlCenter 

            End With 

            With .Resize(rng.Rows.Count, 2) 

               .Borders.LineStyle = xlContinuous 

               With .Font 

                  .Size = 10 

                  .Name = "Calibri" 

               End With 

            End With 

         End With 

      End With 

      .Save 

      If bFileEstrazioniAperto = False Then .Close 'chiude il file excel se non era già aperto 

   End With 

RiprendiErrore: 

      Application.ScreenUpdating = False 

Exit Sub 

GestioneErrori: 

   MsgBox "Errore n. " & Err.Number & vbNewLine & _ 

          Err.Description, vbCritical, "Errore VBA" 

   Resume RiprendiErrore 

End Sub 

ciao

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2024-12-11T13:47:11+00:00

alcune domande:

  1. La macro quando l'avvio apre un nuovo file rinominandolo con la data di estrazione odierna, è possibile fare un file generico quindi unico diciamo che chiamo"ESTRAZIONE" e tutte le estrazioni che faccio di settimana in settimana si salvano in questo file rinominado e creando solo il foglio con la data dell'estrazione?

Questa ultima istruzione legata al nome del file completo di percorso assegna il nome del file vero e proprio:

sFileName = sFileName & "Estrazione_" & Format(Date, "yyyymmdd") & ".xlsx"

Se non vuoi la data, tenendo presente che i file precedenti verranno sovrascritti, ti basta modificare in questo modo: sFileName = sFileName & "Estrazione.xlsx"

  1. Dove posso modificare carattere e dimensione dell'estrazione nella macro, ad esempio impostare Calibri 10?

Se tu volessi impostare il tipo di carattere e dimensione sia alla colonna dei dati dei fornitori che quella di fianco potresti modificare questa istruzione:

.Resize(rng.Rows.Count, 2).Borders.LineStyle = xlContinuous

che potrebbe diventare

With .Resize(rng.Rows.Count, 2)

   .Borders.LineStyle = xlContinuous
   With .Font
      .Name="Calibri"
      .Size=10
   End Wiht
End With
  1. Ultima domanda di chiusura, nel file ipotetico di estrazione, se volessi fare in un foglio, un recap finale che mi indichi per fornitore le risposte ricevute per avere una misura della situazione, ad esempio per il fornitore Rossi spa ho ricevuto risposte 8 risposte SI su 20 estrazioni presenti; è possibile fare un contatore o una soluzione simile?

Potresti creare una tabella pivot.

Certo poi dovresti crearla ogni volta.

Si può fare da VBA ma non è una procedura così immediata, occorre sapere quali campi e come si vogliono avere i dati.

Insomma bisogna prima costruirsi il riepilogo per come lo si vorrebbe e poi replicarlo tramite VBA, Magari registrando la macro dei passaggi per la creazione della tabella pivot in un altro foglio per poi adattare e rendere il codice più "elastico".

Ma sarebbe, eventualmente, una domanda da porre in altro post perché problema differente da quello di questo.

ciao

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2024-12-10T10:25:42+00:00

Comunque proverei con questa macro:

Sub EsportaNomiFornitori() 

   Dim rng As Range 

   Dim UltimaRiga As Long 

   Dim newWb As Workbook 

   Dim sFileName As String 

   With ThisWorkbook 

      Set rng = .Worksheets("righe da sollecitare totali").Columns("B") 

      sFileName = .Path 

      If Right(sFileName, 1) <> Application.PathSeparator Then 

         sFileName = sFileName & Application.PathSeparator 

      End If 

      sFileName = sFileName & "Estrazione_" & Format(Date, "yyyymmdd") & ".xlsx" 

   End With 

   UltimaRiga = Application.Max(2, rng.Find(What:="*", _ 

                                             After:=rng.Cells(1), _ 

                                             LookIn:=xlValues, LookAt:=xlPart, _ 

                                             SearchOrder:=xlByRows, _ 

                                             SearchDirection:=xlPrevious, _ 

                                             MatchCase:=False, _ 

                                             SearchFormat:=False).Row) 

   Set rng = rng.Resize(UltimaRiga) 

   Set newWb = Application.Workbooks.Add(xlWBATWorksheet) 

   With newWb 

      With .Worksheets(1) 

         .Name = Format(Date, "dd.mm") 

         With .Range("A1") 

            With .Resize(rng.Rows.Count) 

               .Value = rng.Value 

               .EntireColumn.AutoFit 

            End With 

            .Value = "FORNITORE" 

            .Font.Bold = True 

            .HorizontalAlignment = xlCenter 

            With .Offset(0, 1) 

               .Value = "RISPOSTA" 

               .Font.Bold = True 

               .HorizontalAlignment = xlCenter 

            End With 

            .Resize(rng.Rows.Count, 2).Borders.LineStyle = xlContinuous 

         End With 

      End With 

      Application.DisplayAlerts = False 

      On Error GoTo GestioneErrori 

      .SaveAs sFileName, xlWorkbookDefault 

      Application.DisplayAlerts = True 

   End With 

   Exit Sub 

GestioneErrori: 

   MsgBox "Errore n. " & Err.Number & vbNewLine & _ 

          Err.Description, vbCritical, "Errore VBA" 

End Sub 

ciao

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

13 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2024-12-06T17:05:44+00:00

    La risposta è stata tradotta automaticamente. Di conseguenza, potrebbero esserci errori grammaticali o parole insolite.

    Cosa vuoi fare per entrambi i file? Non riesco a trovare la relazione tra loro. Potresti condividere maggiori dettagli sul tuo problema? Forse mostrare un risultato atteso?

    Si prega di comprendere che la risposta iniziale potrebbe non sempre risolvere immediatamente il problema a causa delle informazioni limitate. Tuttavia, con il tuo aiuto e informazioni più dettagliate, possiamo lavorare insieme per trovare una soluzione.

    Praticamente una volta a settimana nel file chiamato "FILE PER SOLLECITI" trovo un elenco di nominativi, dovrei fare un estrazione automatica (in un foglio del file che si rinomini con la data odierna) di tutti i nominativi presenti, l'estrazione dovrebbe avvenire come ho indicato nel file chiamato "Estrazione".
    E' fattibile?
    Spero di esser stato più chiaro e completo nella spiegazione

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2024-12-06T02:48:11+00:00

    La risposta è stata tradotta automaticamente. Di conseguenza, potrebbero esserci errori grammaticali o parole insolite.

    Cosa vuoi fare per entrambi i file? Non riesco a trovare la relazione tra loro. Potresti condividere maggiori dettagli sul tuo problema? Forse mostrare un risultato atteso?

    Si prega di comprendere che la risposta iniziale potrebbe non sempre risolvere immediatamente il problema a causa delle informazioni limitate. Tuttavia, con il tuo aiuto e informazioni più dettagliate, possiamo lavorare insieme per trovare una soluzione.

    La risposta è stata utile?

    0 commenti Nessun commento