Copier coller selon conditions

Bonjour

Je souhaiterai créer une macro pour pouvoir de l'onglet source créer un onglet par fournisseur reprenant chaque ligne où ce fournisseur est présent.

Comme un fichier permets de comprendre plus facilement je joins à mon post un extrait

J'ai repris le code proposé dans ce post: https://forum.excel-pratique.com/post463529.html#p463529

Etant novice en VBA j'ai essayé de comprendre le code est de l'adapter néanmoins je tombe toujours sur la même erreur d'indice ..

Voici mon code la ligne de bug est indiquée par ==>

Option Explicit

Dim ln, lgn, col, fs

Dim nf As String

Sub Exporter()

Application.ScreenUpdating = False

Set fs = ActiveSheet

For ln = 2 To fs.Range("A" & Rows.Count).End(xlUp).Row

nf = fs.Range("A" & ln)

If (nf = "FAKIR") And fs.Range("I" & ln) <> "X" Then

lgn = Sheets(nf).Range("A" & Rows.Count).End(xlUp)(2).Row

fs.Range("A" & ln & ":I" & ln).Copy

Sheets(nf).Range("A" & lgn).PasteSpecial xlPasteValues

fs.Range("I" & ln) = "X"

End If

Next ln

fs.Select

MsgBox "Exportations terminées"

End Sub

Si j'ai compris cette erreur serait due à une erreur de dimension de tableau..

Merci d'avance pour votre précieuse aide

Bonjour,

à tester

cliquer sur le bouton "lancez"(dans la feuille "Source") puis visiter les autres feuilles

Bonjour minanse,

Tout d'abord je te remercie pour ce coup de pouce

Néanmoins je ne comprends pas très bien ton code sachant que:

*je ne vois nulle part les conditions pour l’exécution du copier coller (le fichier que j'avais joint n'était qu'un exemple)

*a chaque copier coller une ligne vide apparaît entre chaque ligne "trouvée" en source dans les nouveaux onglets

Concrètement je n'arrive pas réellement à réutiliser le code..

voici le code commenté

Sub Exporter()

'déclarer les variable
Dim ln, lgn, col, fs
Dim nf As String

Application.ScreenUpdating = False

Set fs = ActiveSheet

For ln = 2 To fs.Range("A" & Rows.Count).End(xlUp).Row  'parcour la feuille source

nf = fs.Range("A" & ln)  'on récupère le nom du fournisseur

For i = 1 To Worksheets.Count  'on parcours les feuilles dans le classeur
If Worksheets(i).Name = nf Then  'on cherche la feuille corresponds au fournisseur si on trouve pas de feuille corespond au fournisseur on passe à la ligne suivante sans sopier la ligne actuelle    LA CONDITION EST ICI 
lgn = Sheets(nf).Range("A" & Rows.Count).End(xlUp)(2).Row + 1  'on récupère la dernière ligne  null dans la feuille du fournisseur
fs.Range("A" & ln & ":I" & ln).Copy Sheets(nf).Range("A" & lgn) 'on colle la ligne sur la bonne feuille
End If
Next i
Next ln

MsgBox "Exportations terminées"
End Sub

une petit correction sur le code concernant les ligne vide :

remplacez

lgn = Sheets(nf).Range("A" & Rows.Count).End(xlUp)(2).Row + 1

par

lgn = Sheets(nf).Range("A" & Rows.Count).End(xlUp)(2).Row 

Bonjour,

Je comprends beaucoup mieux maintenant

Je voulais savoir s'il était possible afin d'optimiser le code de:

* automatiser la création des onglets et non faire une rechercher par rapport aux onglets existants qui doivent donc être créés au préalable

* Permettre l'utilisation du code pour effectuer une mise à jour et donc ne copier que les lignes n'apparaissant pas déjà dans un onglet fournisseur (le clé d’identification de chaque ligne est le numéro réserve)

Merci beaucoup en tout cas pour votre aide

voila le code un peu modifier :

Sub Exporter()

'déclarer les variable
Dim ln, lgn, col, fs
Dim nf As String
Dim existe As Boolean

Application.ScreenUpdating = False

Set fs = ActiveSheet

For ln = 2 To fs.Range("A" & Rows.Count).End(xlUp).Row  'parcour la feuille source

nf = fs.Range("A" & ln)  'on récupère le nom du fournisseur

For i = 1 To Worksheets.Count  'on parcours les feuilles dans le classeur
If Worksheets(i).Name = nf Then 'on cherche la feuille corresponds au fournisseur si on trouve pas de feuille corespond au fournisseur on passe à la ligne suivante sans sopier la ligne actuelle
lgn = Sheets(nf).Range("A" & Rows.Count).End(xlUp).Row + 1  'on récupère la dernière ligne  null
fs.Range("A" & ln & ":I" & ln).Copy Sheets(nf).Range("A" & lgn) 'on colle la lignesur la bonne feuille
existe = True
End If
Next i
If existe = False Then 'si la feuille fournisseur existe pas
  Sheets.Add 'on crée une nouvelle feuille
  ActiveSheet.Name = nf 'on nomme la nouvelle feuille avec le nom du fournisseur
  fs.Range("A1:I1").Copy Sheets(nf).Range("A1") 'on lui met la 1er ligne (légende)
  lgn = Sheets(nf).Range("A" & Rows.Count).End(xlUp).Row + 1 'on fait commen en-dessus
  fs.Range("A" & ln & ":I" & ln).Copy Sheets(nf).Range("A" & lgn)
End If
Next ln

MsgBox "Exportations terminées"
End Sub
atib a écrit :

* Permettre l'utilisation du code pour effectuer une mise à jour et donc ne copier que les lignes n'apparaissant pas déjà dans un onglet fournisseur (le clé d’identification de chaque ligne est le numéro réserve)

on peut revenir au méthode que vous avez utiliser , mettez des "X" sur la colonne I pour dire qu'il ne faut pas copier

Rechercher des sujets similaires à "copier coller conditions"