Aide sur un code copier des lignes dans plusieurs onglet sur une condition
Bonjour à tous,
J'espère que vous allez bien,
svp j'ai besoin de votre aide, j'ai essayé d'adapter un code pour mon besoin par rapport à mon fichier de travail
mais lorsque j'exècute il me donne une erreur sur cette ligne
tabCoresp = Sheets("OUTIL").Range("F2:G10") où j'ai nommé la feuille du tableau de correspondance et j'ai sélectionné le tableau de correspondance.
si vous avez une idée pour m'aider
J'ai mis en PJ un exemple du fichier de travail.
Sub FiltrerDOSS()
Dim derLig, derCol As Integer ' DERniere LIGne et DERniere COLonne
Dim actLig, cptLig As Integer ' LIGne ACTuelle et ComPTeur de LIGnes
Dim actCol As Integer ' COLonne ACTuelle
Dim tabSource() ' TABleau Source (DOSS)
Dim tabFiltre() ' TABleau pour conserver les numeror des adherents repondant au FILTRagE
Dim tabResult() ' TABleau RESULTat de l'application du filtre
Dim tabCoresp() ' TABleau de CORRESPondance entre les Pôles et les Onglets
Dim trvOng As Integer ' pour savoir si l'ONGlet est TRouVé
tabCoresp = Sheets("OUTIL").Range("F2:G10") ' Initialiser le TABleau de CORrESPondance - voir dans l'onglet OUTIL
trvOng = 0 ' Pour l'instant nous n'avons pas trouvé la correspondance
actLig = 1 ' A partir de la 1ere ligne
' Tant Que (LIGne ACTuelle < nombre de ligne du TABleau de CORrESPondance) ET Que (ONGlet TRouVé = 0)
While actLig < UBound(tabCoresp, 1) + 1 And trvOng = 0
If ActiveSheet.Name = tabCoresp(actLig, 2) Then ' Si l'onglet actuel = LIGne ACTuelle du TABleau de CORrESPondance
trvOng = actLig ' TRouVé ONGlet = LIGne ACTuelle
Else ' Sinon
actLig = actLig + 1 ' Passer à la LIGne ACTuelle +1 - donc la suivante
End If ' Fin du Si
Wend ' Fin du Tant Que
If trvOng > 0 Then ' Si nous avons TRouVé l'ONGlet - puisqu'il > 0
Application.ScreenUpdating = False ' Pour aller plus vite => pas de rafraichissement ecran
Application.EnableEvents = False
Worksheets("DOSS").Activate ' Activer l'onglet Adhérents
Cells(1, 1).Select ' Se placer au Debut de la liste pour...
derLig = Selection.End(xlDown).Row ' Rechercher la DERniere LIGne de la liste
Cells(1, 1).Select ' Se replacer au Debut de la liste pour...
derCol = Selection.End(xlToRight).Column ' Rechercher la DERniere COLonne de la liste
tabSource = Range(Cells(2, 1), Cells(derLig, derCol)) ' Copier la liste dans le TABleau SOURCE
cptLig = 0 ' Pour l'instant le ComPTeur de LIGne est à 0
' Parcourir le TABleau SOURCE
For actLig = 1 To UBound(tabSource, 1)
' Si le pôle est egal à l'onglet en cours
' dans le TABleau SOURCE la colonne 1 est la colonne Pole
If UCase(tabSource(actLig, 1)) = UCase(tabCoresp(trvOng, 1)) Then
cptLig = cptLig + 1 ' Ajouter 1 au ComPTeur de lIGne
ReDim Preserve tabFiltre(1 To cptLig) ' REDIMensionner le TABleau de FILTRagE
tabFiltre(cptLig) = actLig ' Affecter la LIGne ACTuelle au TABleau de FILTRagE
End If ' Fin du Si
Next ' Fin du Parcours du TABleau SOURCE
' Si nous avons trouve au moins une ligne
If cptLig > 0 Then
' REDIMensionner le TABleau de RESULTat au nombre de ligne du TABleau de FILTRagE
ReDim tabResult(1 To UBound(tabFiltre, 1), 1 To UBound(tabSource, 2))
' Parcourir le TABleau de FILTRagE pour remplir le TABleau REULTat
For actLig = 1 To UBound(tabFiltre, 1)
' Parcourir toutes les colonnes du TABleau SOURCE
For actCol = 1 To UBound(tabSource, 2)
' La position actuelle dans le TABleau RESULTat devient
' la position filtrée du TABleau SOURCE
tabResult(actLig, actCol) = tabSource(tabFiltre(actLig), actCol)
Next ' Fin du Parcours de toutes les colonnes du TABleau SOURCE
Next ' Fin du Parcours du TABleau de FILTRagE
'Afficher l'onglet du filtre
Application.EnableEvents = False
Worksheets(tabCoresp(trvOng, 2)).Activate
' Effacer les anicennes donnees
Cells(2, 1).Select ' Se placer au Debut de la liste pour...
derLig = Selection.End(xlDown).Row ' Rechercher la DERniere LIGne de la liste
Cells(2, 1).Select ' Se replacer au Debut de la liste pour...
derCol = Selection.End(xlToRight).Column ' Rechercher la DERniere COLonne de la liste
Range(Cells(2, 1), Cells(derLig, derCol)).ClearContents
' Recopier le TABleau RESULTat dans la premiere cellule en redimensionnant aux bonnes dimensions
Cells(2, 1).Resize(UBound(tabResult, 1), UBound(tabResult, 2)) = tabResult
Application.ScreenUpdating = True ' Rafraichire l'ecran maintenant
Else
' Nous n'avons PAS trouve au moins une ligne !
MsgBox "Il n'y a pas de Pôle " + tabCoresp(trvOng, 1) + " dans le fichier des DOSS", vbInformation + vbOKOnly, "Désolé !"
Application.EnableEvents = False
Worksheets(tabCoresp(trvOng, 2)).Activate
Cells(2, 1).Select
End If ' Fin du Si nous avons trouve au moins une ligne
Else
' Nous n'avons PAS trouve l'onglet dans le TABleau de CORrESPondance !
MsgBox "Placez-vous sur un onglet de Pôle avant de commencer le traitement", vbInformation + vbOKOnly, "Information"
End If ' Fin du Si nous avons TRouVé l'ONGlet
Application.EnableEvents = True
End Sub
Bonjour,
Il faut déclarer la variable ainsi :
Dim tabCoresp
Au départ, c'est un variant qui sera forcé en tableau par son affectation.
Edit : Voici sinon une adaptation de votre code :
Sub FiltrerDOSS()
dim tSrc, tFlt, sWsName$, sPole$, i&, k&, n&, dl&, dc&
Application.EnableEvents = False
with activesheet
sWsName$ = .Name
with Sheets("OUTIL")
sPole = application.index(.Range("F2:F10"), application.match(sWsName, .Range("G2:G10"), 0))
end with
If not iserror(sPole) Then
tSrc = Worksheets("DOSS").range("SOURCE").value
For i = lbound(tSrc) To UBound(tSrc)
If UCase(tSrc(i, 1)) = UCase(sPole) Then
n = n + 1: ReDim Preserve tFlt(lbound(tSrc, 2) to ubound(tSrc, 2), 1 To n)
for k = lbound(tSrc, 2) to ubound(tSrc, 2)
tFlt(k, n) = tSrc(i, k)
next k
End If
Next i
end if
dl = .cells(.rows.count, 1).end(xlup).row
dc = .cells(2, .columns.count).end(xltoleft).column
.Range(.Cells(2, 1), .Cells(dl, dc)).ClearContents
if n > 0 then
.Cells(2, 1).Resize(n, UBound(tFlt)) = application.transpose(tFlt)
else
msgbox "aucune correspondance pour " & sWsName
end if
end with
Application.EnableEvents = True
End SubAttention, il faut un tableau structuré nommé SOURCE sur la feuille DOSS.
D'ailleurs, il faudrait mettre la table de correspondance de la feuille OUTIL en TS et il faudrait que la feuille active (un pôle si j'ai compris) contienne un TS également. Ce serait beaucoup plus clair et simple à coder.
Cdlt,
Bonjour
merci pour votre retour
je pense que c'est déclaré
Dim tabCoresp() ' TABleau de CORRESPondance entre les Pôles et les Ongletsou bien comment faut il le déclarer?
J'ai essayé de prendre l'adaptation du code, dans mon fichier
le tableau source est structuré dans la feuille "DOSS" mais j'ai pas compris comment le nommer
merci d'avance.
cordialement
Re,
Il aurait fallu déclarer la variable sans les parenthèses
dim tabCorespou en précisant son type (qui est le type par défaut) :
dim tabCoresp as variantPour renommer le tableau structuré de la feuille DOSS, il faut cliquer sur une de ses cellules. Alors un onglet contextuel, nommé "Création" apparait en haut à droite (il est coloré). Il faut se rendre dessus et dans la barre des noms qui se trouve en haut à gauche, il faut entrer le nom "SOURCE" et valider avec la touche entrée.