Problème de gestion de cotisation
Bonjour à tous,
J'ai une problème sur mon macro pour transférer un montant de cotisation (2000) d'une table ("Tbl_Basse") à une autre table ("Tbl_Cot" ou "Tbl_Cot2024") en fonction de certaines conditions liées à l'année dans la colonne G de "Tbl_Basse".
J'ai joint le fichier. Merci d'avance pour votre aide.
voici le code:
Sub Transfert_Cotisation()
' Déclaration des variables
Dim wsBase As Worksheet
Dim wsCotisation As Worksheet
Dim tblBasse As ListObject
Dim tblCot As ListObject
Dim tblCot2024 As ListObject
Dim nomColBasse As Range
Dim nomColCot As Range
Dim nomColCot2024 As Range
Dim ligneDebut As Long
Dim ligneFin As Long
Dim annee As Integer
' Définir les feuilles de calcul
Set wsBase = ThisWorkbook.Sheets("Base")
Set wsCotisation = ThisWorkbook.Sheets("Cotisation")
' Définir les tableaux
Set tblBasse = wsBase.ListObjects("Tbl_Basse")
Set tblCot = wsCotisation.ListObjects("Tbl_Cot")
Set tblCot2024 = wsCotisation.ListObjects("Tbl_Cot2024")
' Définir les colonnes de nom
Set nomColBasse = tblBasse.ListColumns("Nom").DataBodyRange
Set nomColCot = tblCot.ListColumns("NOM").DataBodyRange
Set nomColCot2024 = tblCot2024.ListColumns("NOM").DataBodyRange
' Itérer sur chaque ligne du tableau "Tbl_Basse"
For Each cell In nomColBasse
' Vérifier si l'année dans la colonne G de "Tbl_Basse" est 2023 ou 2024
annee = cell.Offset(0, 6).Value
If annee = 2023 Or annee = 2024 Then
' Utiliser On Error Resume Next pour gérer les erreurs de recherche dans Match
On Error Resume Next
' Trouver la ligne correspondante dans "Tbl_Cot" ou "Tbl_Cot2024"
If annee = 2023 Then
ligneDebut = Application.Match(CStr(cell.Value), nomColCot, 0)
Else
ligneDebut = Application.Match(CStr(cell.Value), nomColCot2024, 0)
End If
On Error GoTo 0 ' Revenir à la gestion normale des erreurs
' Vérifier si la correspondance a été trouvée
If ligneDebut <> 0 Then
' Corriger le calcul de ligneFin
ligneFin = ligneDebut + IIf(IsNumeric(cell.Offset(0, 4).Value) And IsNumeric(cell.Offset(0, 5).Value), cell.Offset(0, 4).Value - cell.Offset(0, 5).Value, 0)
' Boucler sur la plage de lignes dans la table correspondante et mettre à jour la colonne 7 avec la valeur 2000
If annee = 2023 Then
For i = ligneDebut To ligneFin
tblCot.DataBodyRange.Cells(i, 7).Value = 2000
Next i
Else
For i = ligneDebut To ligneFin
tblCot2024.DataBodyRange.Cells(i, 7).Value = 2000
Next i
End If
Else
' Gérer le cas où la correspondance n'a pas été trouvée
MsgBox "Aucune correspondance trouvée pour " & cell.Value & " dans la table correspondante."
End If
End If
Next cell
End Sub
Bonjour et bienvenu sur le forum
Pour mettre un code utiliser </> dans la barre de menu
Je ne comprend pas ce que tu souhaite faire . c'est quoi lignefin
cell.Offset(0, 4) et cell.Offset(0, 5) sont des mois Janvier, Décembre...
donc non numérique...
A+ François
Bonjour fanfan38,
C'est un code que j'ai récupéré sur chatGPT mais il en a toujours un bug sur le code ligneFin = ligneDebut + IIf(IsNumeric(cell.Offset(0, 4).Value) And IsNumeric(cell.Offset(0, 5).Value), cell.Offset(0, 4).Value - cell.Offset(0, 5).Value, 0)
Sub Transfert_Cotisation()
' Déclaration des variables
Dim wsBase As Worksheet
Dim wsCotisation As Worksheet
Dim tblBasse As ListObject
Dim tblCot As ListObject
Dim tblCot2024 As ListObject
Dim nomColBasse As Range
Dim nomColCot As Range
Dim nomColCot2024 As Range
Dim ligneDebut As Long
Dim ligneFin As Long
Dim annee As Integer
' Définir les feuilles de calcul
Set wsBase = ThisWorkbook.Sheets("Base")
Set wsCotisation = ThisWorkbook.Sheets("Cotisation")
' Définir les tableaux
Set tblBasse = wsBase.ListObjects("Tbl_Basse")
Set tblCot = wsCotisation.ListObjects("Tbl_Cot")
Set tblCot2024 = wsCotisation.ListObjects("Tbl_Cot2024")
' Définir les colonnes de nom
Set nomColBasse = tblBasse.ListColumns("Nom").DataBodyRange
Set nomColCot = tblCot.ListColumns("NOM").DataBodyRange
Set nomColCot2024 = tblCot2024.ListColumns("NOM").DataBodyRange
' Itérer sur chaque ligne du tableau "Tbl_Basse"
For Each cell In nomColBasse
' Vérifier si l'année dans la colonne G de "Tbl_Basse" est 2023 ou 2024
annee = cell.Offset(0, 6).Value
If annee = 2023 Or annee = 2024 Then
' Utiliser On Error Resume Next pour gérer les erreurs de recherche dans Match
On Error Resume Next
' Trouver la ligne correspondante dans "Tbl_Cot" ou "Tbl_Cot2024"
If annee = 2023 Then
ligneDebut = Application.Match(CStr(cell.Value), nomColCot, 0)
Else
ligneDebut = Application.Match(CStr(cell.Value), nomColCot2024, 0)
End If
On Error GoTo 0 ' Revenir à la gestion normale des erreurs
' Vérifier si la correspondance a été trouvée
If ligneDebut <> 0 Then
' Corriger le calcul de ligneFin
ligneFin = ligneDebut + IIf(IsNumeric(cell.Offset(0, 4).Value) And IsNumeric(cell.Offset(0, 5).Value), cell.Offset(0, 4).Value - cell.Offset(0, 5).Value, 0)
' Boucler sur la plage de lignes dans la table correspondante et mettre à jour la colonne 7 avec la valeur 2000
If annee = 2023 Then
For i = ligneDebut To ligneFin
tblCot.DataBodyRange.Cells(i, 7).Value = 2000
Next i
Else
For i = ligneDebut To ligneFin
tblCot2024.DataBodyRange.Cells(i, 7).Value = 2000
Next i
End If
Else
' Gérer le cas où la correspondance n'a pas été trouvée
MsgBox "Aucune correspondance trouvée pour " & cell.Value & " dans la table correspondante."
End If
End If
Next cell
End Sub
bonjour Aprenti XL, FanFan,
Sub Transfert_Cotisation()
' Déclaration des variables
Dim LigneDebut As Variant, ColonneDebut As Variant, Cell As Range, Tbl As ListObject, i
For Each Cell In Range("TBL_Basse").ListObject.ListColumns("Nom").DataBodyRange.Cells ' Itérer sur chaque ligne du tableau "Tbl_Basse"
Select Case Cell.Offset(0, 6).Value 'Vérifier si l'année dans la colonne G de "Tbl_Basse" est 2023 ou 2024
Case 2023: Set Tbl = Range("Tbl_Cot").ListObject
Case 2024: Set Tbl = Range("Tbl_Cot2024").ListObject
Case Else: Set Tbl = Nothing
End Select
If Not Tbl Is Nothing Then
LigneDebut = Application.Match(Cell.Value, Tbl.ListColumns("Nom").DataBodyRange, 0) 'quelle ligne
ColonneDebut = Application.Match(Cell.Offset(, 4).Value, Tbl.HeaderRowRange, 0) 'quelle colonne
If IsNumeric(LigneDebut) And IsNumeric(ColonneDebut) Then ' Vérifier si la correspondance a été trouvée
For i = ColonneDebut To Application.Min(Tbl.ListColumns.Count, ColonneDebut + Cell.Offset(, 1).Value - 1) ' Corriger le calcul de ligneFin
Tbl.DataBodyRange.Cells(LigneDebut, i).Value = Cell.Offset(, 3).Value2
Next i
Else
MsgBox "Aucune correspondance trouvée pour " & Cell.Value & " dans la table correspondante." ' Gérer le cas où la correspondance n'a pas été trouvée
End If
End If
Next Cell
End Sub
re,
j'ai lu votre profil, peut-être l'utilisation d'un tableau croisé dynamique est un outil que vous devez connaitre.
Voici une macro pour brisser vos données dans le tableau "TBL_Brisser" qui est la source pour le TCD dans la feuille cotisation.
comme cà vous n'aurez aucun problème avec des paiement de novembre à juin.
Bonjour BsAlv,
Merci pour votre aide et conseille.