› Sviluppare funzionalita su Microsoft Office con VBA › Database Scaduti – verifica pagamenti attraverso due condizioni (nome e importo)
-
AutoreArticoli
-
Salve a tutti non sono molto pratico di VBA ma il sistema che uso per la verifica degli scaduti non mi permette di effettuare una ricerca precisa e pulita delle partite scadute dei fornitori che gestisco. Conoscendo bene excel (non VBA), mi sono detto se non ci fosse quale sintassi che sia capace di fare questo: da un db che scaturisce dal lancio di transazione Ms Dynamics, pulire le partite chiuse
NOTA: oltre al nome fornitore ed agli importi non ci sono altre discriminanti per l'"accoppiamento" delle partite. Quello a cui sono addivvenuto lo trovate nel Word allegato
Forse ho migliorato la sintassi ed iniziano a vedersi spiragli per il funzionamento ma il loop non funziona. Chi mi dà una mano?
In sostanza ho inserito due condizioni:
1.la prima attraverso ciclo For verifica che 2 righe consecutive nella colonna 2 siano uguali
2-la seconda verifica che nella colonna 18 della stessa riga precedente ci sia importo uguale a quello successivo.
grazie molte a chiunque mi dia una mano
Allegati:
You must be logged in to view attached files.Ciao
credo sarebbe meglio allegare il file Excel (senza dati sensibili, anche poche righe(colonne) per capire la struttura e poterci lavorare sopra.
Ciao,
Mario
A te.
la colonna 18 è diventata la 11.
Grazie molte
Allegati:
You must be logged in to view attached files.Ciao Prova con questa macro. ATTENTO. La macro cancella i dati in col.20 perchè io non ho eliminato le righe (ho visto che non manca a te eventualmente farlo) ma ho scritto in detta colonna le righe che andrebbero eliminate.
`Option Explicit Sub Cancella() Dim ur As Long, i As Long, j As Long Dim nm1 As String, nm2 As String, nr1 As String, nr2 As String ur = Cells(Rows.Count, 2).End(xlUp).Row Columns(20).ClearContents For i = 2 To ur - 1 nm1 = Cells(i, 2).Value nr1 = Cells(i, 7).Value For j = i + 1 To ur nm2 = Cells(j, 2).Value nr2 = Cells(j, 7).Value If nm1 = nm2 And nr1 = nr2 Then If Abs(Cells(i, 11).Value) - Abs(Cells(j, 11).Value) = 0 Then Cells(i, 20) = "elimina" Cells(j, 20) = "elimina" Exit For End If End If Next j Next i End Sub `Faccio fare un controllo fra il nominativo e il numero della fattura (col.7) e se sono uguali controllo che le due somme siano uguali. Vedi se va bene. Ciao, Mario
Marius funziona, grazie mille!
Mi domando se non ci dovesse essere il numero di fattura nella colonna (la tesoreria non sempre lo inserisce), funzionerebbe lo stesso? In realtà non funziona ho già provato, ma credo sia una condizione che posso eliminare , al max inserisco che in colonna 7 si debbano avere "fattura" in una riga e "pagamento" nell'altra.
Ti ringrazio ancora
Ciao
Secondo le ultime richieste la macro diventa questa
Option Explicit Sub Cancella() Dim ur As Long, i As Long, j As Long Dim nm1 As String, nm2 As String ur = Cells(Rows.Count, 2).End(xlUp).Row Columns(20).ClearContents For i = ur To 3 Step -1 nm1 = Cells(i, 2).Value nm2 = Cells(i - 1, 2).Value If nm1 = nm2 And Abs(Cells(i, 11).Value) - Abs(Cells(i - 1, 11).Value) = 0 Then Rows(i).EntireRow.Delete Rows(i - 1).EntireRow.Delete i = i - 1 End If Next i End Sub
Ho invertito il procedimento (dal basso verso l'alto vista l'eliminazione delle righe).
Fa solo il controllo col nome e l'importo, non il numero fattura (attento se trovi due fatture con lo stesso importo, credo sballi tutto).
Fai sapere. Ciao,
Mario
Si funziona e mi rendo conto della possibiltà che vada in bug per eventuali fornitori con importi uguali (credo ce ne siano, affitti mensili ad es.).
Perdona, poi, l'ignoranza, ma potrebbe essermi utile concettualmente: perchè per cancellare le righe hai dovuto far partire dal basso ed inserire l'istruzione STEP -1?
Ultima cosa, consiglio: devo anche cancellare tutte le intercompany che nell'aging non devono comparire faccio altra, più semplice macro?
Grazie ancora e, di nuovo, perdona l'ignoranza di un contabile un pò geek.
Ciao
Tutti all'inizio abbiamo posto domande ... semplici, ma diventate tali dopo che hai imparato.
Quando si elimina una riga il contatore non può tenerne conto e rimarrebbe sulla stessa riga. Partendo dal basso, invece, il contatore non tiene più conto della riga che ha eliminato perchè ormai ha superato quel numero di riga.
Nel tuo caso, in particolare, poichè si eliminano DUE righe, ho detto al contatore di scaricarne una fittizia ( quel i = i - 1 che vedi dopo il codice di eliminazione ).
Ultima richiesta: si, puoi creare una macro similare (sempre dal basso verso l'alto se elimini righe).
Ciao,
Mario
-
AutoreArticoli