Base de données et Macro sur 2 onglets différents
Bonjour à tous,
Je me permets de faire appel à vos connaissances en VBA car depuis des semaines de lecture et de visionnage de Tuto je n'arrive pas à réaliser une macro qui me ferais gagner beaucoup beaucoup de temps ... je jette l'éponge et vous demande de bien vouloir m'aider ;)
Vous trouverez en pièce jointe ma base de données, il s'agit d'un tableau de suivi de bon de commandes constitué de 23 colonnes.
J'ai besoin d'un bouton (sur la base) sur lequel pouvoir cliquer et qui déposera sur l'onglet Sans Facture toutes les bons de commandes qui sont sans Factures (colonne W de la base) et toutes les bons de commandes qui sont dits "Partiel" (identifié en colonne W)
sur les onglets SF et Partiel j'ai noté les colonnes dont j'ai besoin ... J'attire vote attention que sur la colonne de la base dite "≠ Bc et facture Fournisseur" il y a une formule de calcul (quand on fait une VBA ca mets tout a 0 sur l'onglet dédié) ....
Enfin sur les onglets SF et Partiel la 1ère colonne dite "mois de la commande" j'aimerai que dans cette colonne puisse apparaitre le mois de création en fonction de la date de création (ex : 10/02/2021 = 2) est ce possible ?
J'espère avoir été clair dans mes explications et je vous remercie par avance de l'aide que vous pourrez m'apporter ... Merci à tous
Nadège
Bonjour,
Voici un premier code à essayer et surtout à bien adapter car je n'ai pas vu votre fichier :
Sub test()
dim tsf(), tpart()
tCol = array(1, 3, 5, 7, 9, 11) '<<< numéros des colonnes à récupérer
with activesheet.range("A1").currentregion
t = .offset(1).resize(.rows.count - 1).value 'tableau prend valeurs de la base sans les entêtes
end with
for i = lbound(t) to ubound(t) 'pour chaque ligne
select case t(i, 23) 'test sur la colonne 23 (la W)
case "Sans Facture" 'si valeur = "Sans Facture"
n = n + 1: redim tsf(1 to ubound(tCol) + 1, 1 to n) 'alimentation tableau tsf
for k = lbound(tCol) to ubound(tCol)
tsf(k + 1, n) = t(i, tCol(k))
next k
case "Partiels" 'si valeur = "Partiels"
m = m + 1: redim tpart(1 to ubound(tCol) + 1, 1 to m) 'alimentation tableau tpart
for k = lbound(tCol) to ubound(tCol)
tpart(k + 1, m) = t(i, tCol(k))
next k
end select
next i
with sheets("Sans Facture") 'sur feuille SF
nvl = .cells(.rows.Count, 1).end(xlup).row + 1 'nouvelle ligne (première non vide en colonne 1)
if n > 0 then .cells(nvl, 1).resize(n, ubound(tsf)) = application.transpose(tsf) 'si tsf est non vide, il est collé
end with
with sheets("Partiels") 'idem
nvl = .cells(.rows.Count, 1).end(xlup).row + 1
if m > 0 then .cells(nvl, 1).resize(m, ubound(tpart)) = application.transpose(tpart)
end with
end subCe code colle les valeurs de la base (qui doit être la feuille active au moment de l'exécution du code).
Pré-requis :
- Il faut que le tableau commence en A1 (la ligne 1 étant une ligne d'en-têtes)
- Il faut indiquer les numéros des colonnes à récupérer dans le tableau tCol.
- Il faut adapter toutes les valeurs en dur dans le code, pour s'assurer qu'il y ait correspondance, à savoir tous les "Sans Facture", "Partiels" et éventuellement le 23 repésentant la colonne W.
Par ailleurs, je recommande d'une part de choisir des noms et codifications simples et sans espace et d'autre part d'utiliser des tableaux structurés si ce n'est pas déjà le cas.
Cdlt,
Bonsoir à tous !
Une autre approche ; Sans VBA mais Tableau structuré et segment :
Bonsoir 3GB,
merci beaucoup pour votre réactivité ... j'ai essayé de mettre à jour le Module dans mon tableau mais je n'y arrive pas ... je suis novice et je bloque
voici ce que me réponds le logiciel :
c'est tellement compliqué, j'ai réussi a apprendre seule les fonctions mais la je bloque totalement :(
merci d'avance pour votre réponse
bien à vous
Nadège
Bonsoir à tous,
Désolé, je saisis directement sur le site et je fais quelques petites fautes... J'ai modifié mon précédent commentaire, j'espère que vous passerez la compilation. Le reste me semble pas mal si vous avez bien renommé les éléments en dur.
Je vois un 24 soit la colonne X à la place du 23. Est-ce normal ?
Et je vois un A3 à la place du A1. Vous avez donc une ligne 2 vide, c'est ça ?
Sinon, j'imagine que vous découvrez le forum mais merci de ne pas mettre de votes négatifs alors que je fais la démarche de vous venir en aide, c'est pas très appréciable...
Cdlt,
Bonjour 3GB,
Je vous remercie infiniement d'avoir pu vous pencher sur mon souci je vais tacher de modifier et de faire fonctionner la macro que vous m'avez fourni.
Pour ce qui est du vote, je n'ai mis aucun commentaire pour l'instant ni voter car je ne sais pas comment faire ...
Si c'est le cas j'ai du faire une mauvaise manip et je m'en excuse ...
Il est évident qu'avec l'aide que vous me fournissez je ne vais pas critiquer une aide si précieuse
vous souhaitant une belle matinée, je ne manquerai pas de revenir vers vous si besoin
merci encore
Nadège
Re Bonjour 3GB,
Merci encore d'avoir pris le temps de regarder mon souci et de m'avoir répondu hier soir :)
J'ai ôté le -1 du vote en bas en droite de vos messages, je n'avais pas compris la signification, j'ai donc modifié ma bêtise :)
J'ai donc appliqué la macro avec vos modifications et apportées les miennes (numéro de colonne, bonne dénomination ... car je travaille sur ma base)
mais je rencontre encore un souci (sans parler que je ne pouvais pas enregistrer la macro sans la perdre il a fallu que je change d'extension de fichier)
quand je clic sur exécuter la macro j'ai un message d'erreur qui est le suivant :
je clic donc sur déboblage et j'ai la ligne suivante qui apparait en jaune
vous m'aviez indiqué de prendre les valeurs de la base sans les entêtes mais je ne sais pas ou les insérer dans la ligne ...
Ma base de données est trop grande pour que je puisse vous faire un imprime écran mais elle débute en ligne A3 et se termine en X3
Merci encore pour votre aide si précieuse,
Dans l'attente de vous lire,
Bien à vous
PS : si vous le souhaitez je peux vous envoyer mon fichier, je pense que ca doit être super compliqué pour vous de trouver une erreur sans le support, merci à vous
Bonjour Scani,
Il n'y a pas de souci, pour la réponse et pour le vote^^.
Alors, c'est normal pour l'extension, il faut que le fichier soit de type .xlsm pour que vous puissiez en conserver le code. Il faut juste prendre l'habitude mais après, on n'y fait même plus attention.
Comme vous l'avez fait remarqué, c'est pas évident sans le fichier mais je ne les ouvre pas ces derniers temps. L'erreur 1004 me fait penser à une currentregion s'étendant sur la feuille entière, provoquant ainsi une erreur lors du .offset(1) (décalage d'une ligne).
Vous pouvez le vérifier assez simplement en vous rendant en A3 et en faisant ctrl+A.
Je vous recommande de créer un fichier vierge, de constituer une base fictive mais semblable en la faisant commencer en A1 et terminer en X20 (par exemple).
Ensuite, de coller mon premier code, d'y remplacer 23 par 24, puis de l'exécuter en ayant la base comme feuille active. Bien entendu, il faut que les 2 autres feuilles soient créées également pour éviter un bug plus loin dans le code.
Sinon, vous pouvez aussi remplacer la partie bloquante par une range fixe pour tester :
Sub test()
dim tsf(), tpart()
tCol = array(1, 3, 5, 7, 9, 11) '<<< numéros des colonnes à récupérer
'with activesheet.range("A1").currentregion
' t = .offset(1).resize(.rows.count - 1).value 'tableau prend valeurs de la base sans les entêtes
'end with
t = activesheet.range("A3:X100").value
for i = lbound(t) to ubound(t) 'pour chaque ligne
select case t(i, 24) 'test sur la colonne 23 (la W)
case "Sans Facture" 'si valeur = "Sans Facture"
n = n + 1: redim tsf(1 to ubound(tCol) + 1, 1 to n) 'alimentation tableau tsf
for k = lbound(tCol) to ubound(tCol)
tsf(k + 1, n) = t(i, tCol(k))
next k
case "Partiels" 'si valeur = "Partiels"
m = m + 1: redim tpart(1 to ubound(tCol) + 1, 1 to m) 'alimentation tableau tpart
for k = lbound(tCol) to ubound(tCol)
tpart(k + 1, m) = t(i, tCol(k))
next k
end select
next i
with sheets("Sans Facture") 'sur feuille SF
nvl = .cells(.rows.Count, 1).end(xlup).row + 1 'nouvelle ligne (première non vide en colonne 1)
if n > 0 then .cells(nvl, 1).resize(n, ubound(tsf)) = application.transpose(tsf) 'si tsf est non vide, il est collé
end with
with sheets("Partiels") 'idem
nvl = .cells(.rows.Count, 1).end(xlup).row + 1
if m > 0 then .cells(nvl, 1).resize(m, ubound(tpart)) = application.transpose(tpart)
end with
end subAu fait, vous pouvez poster du code à l'aide des balises </> du ruban d'icônes. Ca me permettra de copier la version à jour et vous évitera de refaire toujours les mêmes petites modifications.
Par ailleurs, je vais me répéter mais on ne le dit jamais assez : je vous conseille vivement d'utiliser des tableaux structurés, beaucoup plus simples, que ce soit sur excel ou VBA.
Cdlt,
Bonjour 3GB,
Merci pour vos explications et votre patience.
Mais, je n'arrive pas à appliquer ce que vous m'expliquer ... je pense que je vais devoir prendre le temps de décortiquer tout cela avec un pas à pas (enregistrer macro)
au pire, je continuerai à faire ligne par ligne quand j'aurais besoin de ces données ....
Je vous remercie infiniment de votre aide et du temps que vous avez pu passer avec mon ignorance sur la VBA
Bien à vous
et bonne journée,
Nadège
Bonjour Scani,
Quel est le nom de la feuille qui contient la base de départ ? Quelle est la référence de la plage (la base), en excluant les en-têtes ?
Ces 2 informations me permettront d'adapter le code et de voir dans un premier temps s'il est fonctionnel.
Quand on sera sûr qu'il marche, vous pourrez mettre les données sous forme de tableau structuré :
- Rendez-vous sur une des cellules de la base
- Allez dans l'onglet Accueil/Mettre sous forme de tableau (cochez avec en-têtes)
Puis dans l'onglet contextuel, nommé CREATION (de couleur jaune si je ne dis pas de bêtise), qui apparaitra, entrez le nom du tableau dans la barre de nom "Nom du tableau". Ce nom ne doit pas contenir d'espace ni de caractère spécial et ne doit pas être identique à un autre nom du projet (une référence par exemple).
Alors, je réadapterai le code.
Bonne soirée,
Cdlt,
Bonjour 3GB,
je vous remercie par avance de votre patience et de bien vouloir une fois de plus vous pencher sur mon souci.
Le nom de la feuille qui contient la base de départ est : bon de commande 2021
la référence de la plage sans les entêtes est : A3;W3
(la ligne 1 j'en ai besoin pour calculer le nombre de bons de commandes total sur l'année car je rajoute mois par mois les bons de commandes passés selon une extraction d'un autre logiciel et la ligne 2 les entêtes du tableau), la longueur du tableau n'est donc pas fixe à ce jour j'en suis à 2007 lignes.
Je reste en attente de vos instructions avant de passer le tableau en structuré.
Merci encore et belle journée à vous,
Nadège
Bonjour Scani,
Merci pour ces informations. Donc, si j'ai bien suivi, la ligne 1 est un recap et elle est directement collée à la ligne (2 forcément) des en-têtes du tableaux.
Je note aussi qu'on repasse à 23 colonnes.
Voici une adaptation du code où je me suis permis de renommer votre onglet en "BC21" (court, clair, sans espace) comme suggéré avant :
Sub test()
dim tsf(), tpart()
tCol = array(1, 3, 5, 7, 9, 11) '<<< numéros des colonnes à récupérer
with sheets("BC21")
dl = .Cells(.rows.count, 23).end(xlup).row 'dernière ligne non vide en col W
t = .range("A3:W" & dl).value 'alimentation du tableau dynamique
end with
'ces lignes sont l'équivalent, en semi-dynamique, de : t = sheets("BC21").range("A3:W2007").value
for i = lbound(t) to ubound(t) 'pour chaque ligne
select case t(i, 23) 'test sur la colonne 23 (la W)
case "Sans Facture" 'si valeur = "Sans Facture"
n = n + 1: redim tsf(1 to ubound(tCol) + 1, 1 to n) 'alimentation tableau tsf
for k = lbound(tCol) to ubound(tCol)
tsf(k + 1, n) = t(i, tCol(k))
next k
case "Partiels" 'si valeur = "Partiels"
m = m + 1: redim tpart(1 to ubound(tCol) + 1, 1 to m) 'alimentation tableau tpart
for k = lbound(tCol) to ubound(tCol)
tpart(k + 1, m) = t(i, tCol(k))
next k
end select
next i
with sheets("Sans Facture") 'sur feuille SF
nvl = .cells(.rows.Count, 1).end(xlup).row + 1 'nouvelle ligne (première non vide en colonne 1)
if n > 0 then .cells(nvl, 1).resize(n, ubound(tsf)) = application.transpose(tsf) 'si tsf est non vide, il est collé
end with
with sheets("Partiels") 'idem
nvl = .cells(.rows.Count, 1).end(xlup).row + 1
if m > 0 then .cells(nvl, 1).resize(m, ubound(tpart)) = application.transpose(tpart)
end with
end subCdlt,
Maintenant, avec un tableau structuré, par exemple nommé "BC_21" :
Sub test()
dim tsf(), tpart()
tCol = array(1, 3, 5, 7, 9, 11) '<<< numéros des colonnes à récupérer
t = range("BC_21").value
for i = lbound(t) to ubound(t) 'pour chaque ligne
select case t(i, 23) 'test sur la colonne 23 (la W)
case "Sans Facture" 'si valeur = "Sans Facture"
n = n + 1: redim tsf(1 to ubound(tCol) + 1, 1 to n) 'alimentation tableau tsf
for k = lbound(tCol) to ubound(tCol)
tsf(k + 1, n) = t(i, tCol(k))
next k
case "Partiels" 'si valeur = "Partiels"
m = m + 1: redim tpart(1 to ubound(tCol) + 1, 1 to m) 'alimentation tableau tpart
for k = lbound(tCol) to ubound(tCol)
tpart(k + 1, m) = t(i, tCol(k))
next k
end select
next i
with sheets("Sans Facture") 'sur feuille SF
nvl = .cells(.rows.Count, 1).end(xlup).row + 1 'nouvelle ligne (première non vide en colonne 1)
if n > 0 then .cells(nvl, 1).resize(n, ubound(tsf)) = application.transpose(tsf) 'si tsf est non vide, il est collé
end with
with sheets("Partiels") 'idem
nvl = .cells(.rows.Count, 1).end(xlup).row + 1
if m > 0 then .cells(nvl, 1).resize(m, ubound(tpart)) = application.transpose(tpart)
end with
end subL'affectation de la variable t est totalement dynamique dans le code et c'est beaucoup plus court et lisible.
Cdlt,
Bonsoir 3GB,
je vous remercie infiniment pour le temps que vous passez pour m'aider.
Depuis cet AM je suis sur vos deux messages et je n'y arrive pas .... Je n'ai plus de message d'erreur sur la macro mais quand j'exécute rien ne se passe ...
Voici un imprime écran de la macro :
Comme vous pourrez le constater j'ai en tout 16 onglets en tout sur mon fichier ... BC_21 en en 2, SF en 3 et Partiel en 4
j'ai mis mon tableau en structuré avec les explications que vous m'avez fournies
je vous remets ci-dessous la macro pour que vous n'ayez pas à la retaper ;)
Sub BC_2021()
Dim tsf(), tpart()
tCol = Array(2, 5, 3, 4, 6, 12, 11, 17, 20) '<<< numéros des colonnes à récupérer
t = Range("BC_21").Value
For i = LBound(t) To UBound(t) 'pour chaque ligne
Select Case t(i, 23) 'test sur la colonne 23 (la W)
Case "Sans Facture" 'si valeur = "Sans Facture"
n = n + 1: ReDim tsf(1 To UBound(tCol) + 1, 1 To n) 'alimentation tableau tsf
For k = LBound(tCol) To UBound(tCol)
tsf(k + 1, n) = t(i, tCol(k))
Next k
Case "Partiel" 'si valeur = "Partiel"
m = m + 1: ReDim tpart(1 To UBound(tCol) + 1, 1 To m) 'alimentation tableau tpart
For k = LBound(tCol) To UBound(tCol)
tpart(k + 1, m) = t(i, tCol(k))
Next k
End Select
Next i
With Sheets("SF") 'sur feuille SF
nvl = .Cells(.Rows.Count, 1).End(xlUp).Row + 1 'nouvelle ligne (première non vide en colonne 1)
If n > 0 Then .Cells(nvl, 1).Resize(n, UBound(tsf)) = Application.Transpose(tsf) 'si tsf est non vide, il est collé
End With
With Sheets("Partiel") 'idem
nvl = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
If m > 0 Then .Cells(nvl, 1).Resize(m, UBound(tpart)) = Application.Transpose(tpart)
End With
End SubJe ne voudrais pas monopoliser votre temps et votre patience face à mon ignorance et je comprendrais si vous jetez l'éponge :)
Merci encore pour tout
Nadège
Bonjour Scani,
Il n'y a aucun souci, ne vous inquiétez pas. Je pense qu'on y est presque !
S'il ne se passe rien, c'est probablement parce qu'aucun des critères n'est satisfait. Donc :
- Soit il faut changer la valeur de ces critères dans le code (qui sont pour l'instant "Sans Facture" et "Partiel") ;
- Soit il faut changer le numéro de la colonne où trouver ces 2 valeurs (pour l'instant, la 23 dans le code).
C'est soit l'un soit l'autre (soit les 2 à la fois).
Attention, il arrive souvent qu'on saisisse un espace indésirable sur Excel (en général à la fin). Lorsque l'espace est présent une fois, il se répercute souvent sur toute la colonne, du fait de la saisie intuitive d'Excel.
Au cas où, vous pouvez exécuter cette petite macro pour nettoyer ces éventuels espaces de votre colonne 23 :
sub Clean()
with range("BC_21").columns(23)
t = .value
for i = lbound(t) to ubound(t)
t(i, 1) = application.trim(t(i, 1))
next i
.value = t
end with
end subBien entendu, cette macro est valable uniquement si vous n'avez que des valeurs en colonne 23. Si vous avez aussi des formules, j'adapterai le code.
Cdlt,
Bonjour 3GB,
Merci pour vos explications et votre optimiste ... :)
J'ai donc nettoyer la colonne avec la macro que vous m'avez fourni et effectivement il devait y avoir des espaces car ca à bouger.
Cependant j'ai beau exécuter la macro sur ma base ou sur les onglets dédiés rien ne fonctionne. D'ailleurs, pouvez vous me dire si il est préférable d'exécuter la macro sur la base ou les onglets récepteurs ?
Je me demande si le fait qu'il n'y ait pas que Sans Facture et Partiel dans la colonne 23 (W) ne génère pas une erreur ...
En effet, dans la colonne 23 j'ai notifié les Sans Facture, Partiel mais aussi ANNULE, AVOIR, FACTURE .... et j'ai besoin d'extraire que les Partiel et les Sans Facture pour réaliser les encours trimestriel. Peut être faudrait il une condition dans la macro, est ce possible comme dans les fonctions avec SI ?
De plus, dans la macro je demande que soit coller les colonnes 2, 5 , 3 ... elles ne sont pas dans l'ordre chronologique (ce qui est normal) mais cela ne pose t'il pas problème à la macro ?
Enfin, ma base "BC_21" est lié à un autre onglet qui s'appelle "En cours BC" ou il y a beaucoup beaucoup de formule (NB.SI et autre), et il y a une formule de calcule sur la colonne 6 de la base ou je demande à répertorier sur les onglets Sans Facture et Partiel le résultat... est ce que cela peut générer des soucis sur la macro ?
Sub BC_2021()
Dim tsf(), tpart()
tCol = Array(2, 5, 3, 4, 6, 12, 11, 17, 20) '<<< numéros des colonnes à récupérer
t = Range("BC_21").Value
For i = LBound(t) To UBound(t) 'pour chaque ligne
Select Case t(i, 23) 'test sur la colonne 23 (la W)
Case "Sans Facture" 'si valeur = "Sans Facture"
n = n + 1: ReDim tsf(1 To UBound(tCol) + 1, 1 To n) 'alimentation tableau tsf
For k = LBound(tCol) To UBound(tCol)
tsf(k + 1, n) = t(i, tCol(k))
Next k
Case "Partiel" 'si valeur = "Partiel"
m = m + 1: ReDim tpart(1 To UBound(tCol) + 1, 1 To m) 'alimentation tableau tpart
For k = LBound(tCol) To UBound(tCol)
tpart(k + 1, m) = t(i, tCol(k))
Next k
End Select
Next i
With Sheets("Sans Facture") 'sur feuille SF
nvl = .Cells(.Rows.Count, 1).End(xlUp).Row + 1 'nouvelle ligne (première non vide en colonne 1)
If n > 0 Then .Cells(nvl, 1).Resize(n, UBound(tsf)) = Application.Transpose(tsf) 'si tsf est non vide, il est collé
End With
With Sheets("Partiel") 'idem
nvl = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
If m > 0 Then .Cells(nvl, 1).Resize(m, UBound(tpart)) = Application.Transpose(tpart)
End With
End SubVous remerciant une fois de plus de votre patience,
Belle journée à vous
Nadège
Bonjour Scani,
Normalement, on peut exécuter cette macro de n'importe où, ça ne pose pas de problème, tant qu'elle se trouve dans un module standard.
Cette macro prévoit la possibilité d'intervertir les colonnes sur la destination. L'ordre ne pose aucun problème. Et si vous mettiez array(2, 2, 2), vous auriez 3 fois la colonne 2 (pas très utile n'empêche^^).
Enfin, ma base "BC_21" est lié à un autre onglet qui s'appelle "En cours BC" ou il y a beaucoup beaucoup de formule (NB.SI et autre), et il y a une formule de calcule sur la colonne 6 de la base ou je demande à répertorier sur les onglets Sans Facture et Partiel le résultat... est ce que cela peut générer des soucis sur la macro ?
Je n'ai pas compris mais je dirais que ça ne pose pas de problème (pour la macro tout du moins).
Commentaire édité
Au temps pour moi, désolééééé, il manquait un détail important, l'instruction preserve !
Sub BC_2021()
Dim tsf(), tpart()
tCol = Array(2, 5, 3, 4, 6, 12, 11, 17, 20) '<<< numéros des colonnes à récupérer
t = Range("BC_21").Value
For i = LBound(t) To UBound(t) 'pour chaque ligne
Select Case t(i, 23) 'test sur la colonne 23 (la W)
Case "Sans Facture" 'si valeur = "Sans Facture"
n = n + 1: ReDim preserve tsf(1 To UBound(tCol) + 1, 1 To n) 'alimentation tableau tsf
For k = LBound(tCol) To UBound(tCol)
tsf(k + 1, n) = t(i, tCol(k))
Next k
Case "Partiel" 'si valeur = "Partiel"
m = m + 1: ReDim preserve tpart(1 To UBound(tCol) + 1, 1 To m) 'alimentation tableau tpart
For k = LBound(tCol) To UBound(tCol)
tpart(k + 1, m) = t(i, tCol(k))
Next k
End Select
Next i
With Sheets("Sans Facture") 'sur feuille SF
nvl = .Cells(.Rows.Count, 1).End(xlUp).Row + 1 'nouvelle ligne (première non vide en colonne 1)
If n > 0 Then .Cells(nvl, 1).Resize(n, UBound(tsf)) = Application.Transpose(tsf) 'si tsf est non vide, il est collé
End With
With Sheets("Partiel") 'idem
nvl = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
If m > 0 Then .Cells(nvl, 1).Resize(m, UBound(tpart)) = Application.Transpose(tpart)
End With
End SubPouvez-vous réessayer avec le code à jour ?
Très bonne journée à vous aussi Nadège,
A bientôt,
Bonjour 3GB,
Arffff on va y arriver, j'en suis sure ^^
j'ai un message d'erreur qui est celui ci :
Ce qui me mets en jaune la ligne suivante :
Alors autant vous dire que c'est du chinois pour moi lol !!
Encore une fois, et je ne l'écrirais jamais assez, merci pour votre patience, merci beaucoup
Bien à vous
Bonne soirée
Nadège
Bonsoir Nadège,
Ah c'est une bonne chose ! Ca signifie que l'extraction a fonctionné sur la feuille "Sans Facture" ?
Pouvez-vous essayer ce code :
Sub BC_2021()
Dim tsf(), tpart()
tCol = Array(2, 5, 3, 4, 6, 12, 11, 17, 20) '<<< numéros des colonnes à récupérer
t = Range("BC_21").Value
For i = LBound(t) To UBound(t) 'pour chaque ligne
Select Case t(i, 23) 'test sur la colonne 23 (la W)
Case "Sans Facture" 'si valeur = "Sans Facture"
n = n + 1: ReDim preserve tsf(1 To UBound(tCol) + 1, 1 To n) 'alimentation tableau tsf
For k = LBound(tCol) To UBound(tCol)
tsf(k + 1, n) = t(i, tCol(k))
Next k
Case "Partiel" 'si valeur = "Partiel"
m = m + 1: ReDim preserve tpart(1 To UBound(tCol) + 1, 1 To m) 'alimentation tableau tpart
For k = LBound(tCol) To UBound(tCol)
tpart(k + 1, m) = t(i, tCol(k))
Next k
End Select
Next i
With Sheets("Sans Facture") 'sur feuille SF
nvl = .Cells(.Rows.Count, 1).End(xlUp).Row + 1 'nouvelle ligne (première non vide en colonne 1)
If n > 0 Then .Cells(nvl, 1).Resize(n, UBound(tsf)) = Transpose(tsf) 'si tsf est non vide, il est collé
End With
With Sheets("Partiel") 'idem
nvl = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
If m > 0 Then .Cells(nvl, 1).Resize(m, UBound(tpart)) = Transpose(tpart)
End With
End Sub
function Transpose(t)
redim temp(lbound(t, 2) to ubound(t, 2), lbound(t) to ubound(t))
for i = lbound(t) to ubound(t)
for k = lbound(t, 2) to ubound(t, 2)
temp(k, i) = t(i, k)
next k
next i
Transpose = temp
end functionCdlt,