Cancellare una linea excel dal vba access

di il
7 risposte

Cancellare una linea excel dal vba access

Buongiorno, 

ho cercato tanto senza trovare alcuna indicazione, chiedo a voi esperti perchè a questo punto mi sa che quello che vorrei fare non è possibile.

La mia applicazione lavora su dati estratti da un gestionale attraverso apposita procedura di esportazione che genera un foglio excel.

Il gestionale mette in A1 nel foglio excel il titolo dell'esportazione, e mette una riga di totali in fondo alla lista che ha generato. Sulla seconda linea mette i titoli delle colonne.

Attualmente i miei operatori cancellano a mano queste righe in excel prima di avviare access, vorrei automatizzare questa operazione.

Si possono cancellare linee da un foglio excel da dentro access ? Ovviamente il senso è evitare di dover passare da Excel ogni volta che c'è un aggiornamento dei dati.

Ogni suggerimento è apprezzatissimo.

Grazie

Ste

7 Risposte

  • Re: Cancellare una linea excel dal vba access

    Ma perché la devi cancellare? Cosa fai da access per importare i dati?

  • Re: Cancellare una linea excel dal vba access

    La uso come tabella collegata, come ben sai la procedura di collegamento guidato vuole l'intestazione delle colonne nella prima riga.

  • Re: Cancellare una linea excel dal vba access

    Ciao,

    un esempio di come aprire un file Excel e ricercare le righe da eliminare data una stringa di ricerca univoca che identifichi esclusivamente tale riga: 

    
    MyDeleteRowsEXcel "C:\File.xlsx", "Foglio1", "Titolo", "Totali"
    
    ' DELETE ROWS EXCEL FILE
    Sub MyDeleteRowsEXcel(strFullPathAndFileExcel As String, strSheet As String, strTitleFind As String, strTotalFind As String)
    Dim xlApp As New Excel.Application
    Dim xlBook As New Excel.Workbook
    Dim xlSheet As New Excel.Worksheet
    Dim rngRow As Range
    ' open Excel file and sheet
    Set xlApp = CreateObject("Excel.Application")
    Set xlBook = xlApp.Workbooks.Open(strFullPathAndFileExcel)
    Set xlSheet = xlBook.Worksheets(strSheet)
    
    With xlSheet.UsedRange
        ' delete row
        Set rngRow = .Find(strTitleFind, LookAt:=xlWhole)
        If Not rngRow Is Nothing Then rngRow.EntireRow.Delete
        ' delete row
        Set rngRow = .Find(strTotalFind, LookAt:=xlWhole)
        If Not rngRow Is Nothing Then rngRow.EntireRow.Delete
    End With
    
    ' close
    xlBook.Close SaveChanges:=True
    xlApp.Quit
    Set xlSheet = Nothing
    Set xlBook = Nothing
    Set xlApp = Nothing
    Set rngRange = Nothing
    End Sub

    Piccolo esempio :

    • usare il richiamo della Sub MyDeleteRowsEXcel per passare i parametri:
      • strFullPathAndFileExcel  >> inserire la stringa che rappresenta la Path e il nome del File Excel
      • strSheet  >> inserire la stringa con il nome del Foglio di Lavoro
      • strTitleFind >> inserire la stringa per ricercare la riga da Eliminare nel Foglio di Lavoro
      • strTotalFind >> inserire la stringa per ricercare la riga da eliminare nel Foglio di Lavoro
    • nelle stringhe Find impostare valori chiave che consentono di ricercare con esattezza la riga da Eliminare
    • in questo esempio viene ricercata la cella che contiene il valore “Titolo” ed elimina la riga, il valore “Totali” ed elimina la rig
    • implementare il codice qualora con la stessa chiave di ricerca esistono più righe da eliminare nel Foglio di Lavoro. 
      • per esempio usare il metodo FindNext

    In questo caso non sapendo con certezza dove viene a trovarsi la righe Totali alla fine dei dati, con il metodo Find ci pensa la Sub a trovarla ed eliminarla.
    Inserire eventuali controlli e validazioni, messaggi, etc…etc…

    Questo solo un metodo dei tanti che si possono utilizzare

    Prova, verifica e controlla… ho buttato giù due righe di codice velocemente.
    Ciao

    N.B. L'osservazione/domanda di oregon è importante perchè se devi importare il foglio di lavoro in Access, allora non hai bisogno di cancellare preventivamente tali righe. Per esempio le escludi in fase di import.

  • Re: Cancellare una linea excel dal vba access

    Grazie, la provo appena possibile !!

  • Re: Cancellare una linea excel dal vba access

    09/05/2023 - StackPtr ha scritto:


    Grazie, la provo appena possibile !!

    Ricopiala adesso… ho modificato un paio di righe

  • Re: Cancellare una linea excel dal vba access

    Un altra versione della stessa routine.

    Rispetto alla versione precedente, in questo caso viene utilizzata una stringa come parametro che servirà per impostare un Array che conterrà tutte le stringhe chiavi da ricercare al fine di eliminare le righe trovate nel foglio excel

    Come Passare i Parametri alla Sub: strFullPathAndFileExcel 

    • strFullPathAndFileExcel  >> inserire la stringa che rappresenta la Path e il nome del File Excel
    • strSheet  >> inserire la stringa con il nome del Foglio di Lavoro
    • strArrayFind >> inserire in questa stringa uno o più valori da ricercare separati dalla Virgola
    • LookAtModal >> scegliere il tipo di corrispondenza per la ricerca da effettuare: xlWhole = Esatta oppure xlPart = che contiene in Parte

    Vengono ricercati i valori presenti in strArrayFind in una qualsiasi riga e colonna del foglio excel e verrà cancellata la riga corrispondente

    • il parametro strArrayFind  di questo esempio contiene "Titolo,Totali,SubTotali"
      • verranno cancellate tutte le righe che contengono, in una cella qualsiasi, il valore Titolo
      • verranno cancellate tutte le righe che contengono, in una cella qualsiasi, il valore Totali
      • verranno cancellate tutte le righe che contengono, in una cella qualsiasi, il valore SubTotali
        • es… se esistono più righe che in una qualsiasi cella/colonna contengono la parola chiave “Totali”, tutte le rispettive righe verranno eliminate dal foglio di excel.

    La Sub risulta molto flessibile per qualsiasi scopo in quanto non è stato impostato nessun valore fisso a nessuna variabile.

    Si può passare uno o più elementi da ricerca per i quali eliminare l'intera riga nel foglio excel;  
    - es.  se in strArrayFind si imposta il valore “Pippo” >>> MyDeleteRowsEXcel "C:\FileExcel.xlsx", "Foglio1", “Pippo”, tale valore verrà ricercato in tutte le righe e colonne del Foglio1 e verranno eliminate tutte le righe che soddisfano la ricerca.
    Si può impostare il tipo di ricerca da eseguire con il metodo FInd: corrispondenza Esatta oppure in Parte 

    Implementare il codice con eventuali controlli, validazioni, messaggi, etc…

    N.B. Controllare, validare e verificare prima dell'uso 

    ' Set search parameter type
    Enum xlFindModal
        xlWhole = 1
        xlPart = 2
    End Enum
    
    ' example of calling the Sub
    MyDeleteRowsEXcel "C:\FileExcel.xlsx", "Foglio1", "Titolo,Totali,SubTotali, xlWhole"
    
    ' DELETE ROWS EXCEL FILE
    Sub MyDeleteRowsEXcel(strFullPathAndFileExcel As String, strSheet As String, strArrayFind As String, LookAtModal As xlFindModal)
    Dim xlApp As New Excel.Application
    Dim xlBook As New Excel.Workbook
    Dim xlSheet As New Excel.Worksheet
    Dim rngRow As Range
    Dim strFirst As String
    Dim aryStrSearch() As String
    
    ' Set Array with the values to be searched for
    aryStrSearch = Split(strArrayFind, ",")
    
    ' open Excel file and sheet
    Set xlApp = CreateObject("Excel.Application")
    Set xlBook = xlApp.Workbooks.Open(strFullPathAndFileExcel)
    Set xlSheet = xlBook.Worksheets(strSheet)
    
    ' whit sheet used range
    With xlSheet.UsedRange
       ' Search all strings to delete rows
       Dim iX As Integer
       For iX = 0 To UBound(aryStrSearch)
           ' delete row for 
           Set rngRow = .Find(aryStrSearch(iX), LookIn:=xlValues, LookAt:=IIf(LookAtModal = 1, xlWhole, xlPart))
           If Not rngRow Is Nothing Then
               ' save the first occurrence to ensure exit from the loop
               strFirst = rngRow.Address
               ' search for all occurrences
               Do
                   ' delete row
                   rngRow.EntireRow.Delete
                   ' search next
                   Set rngRow = .FindNext()
                   ' if there are no other elements exit the loop
                   If rngRow Is Nothing Then Exit Do
               Loop While rngRow.Address <> strFirst
           End If
    Next iX
    End With
    
    ' close
    xlBook.Close SaveChanges:=True
    xlApp.Quit
    Set xlSheet = Nothing
    Set xlBook = Nothing
    Set xlApp = Nothing
    Set rngRow = Nothing
    End Sub
  • Re: Cancellare una linea excel dal vba access

    Wow, grazie mille !!!

Devi accedere o registrarti per scrivere nel forum
7 risposte