Petit soucis VBA/Excel
2000Kennedy
Messages postés
44
Statut
Membre
-
2000Kennedy Messages postés 44 Statut Membre -
2000Kennedy Messages postés 44 Statut Membre -
Bonjour,
Cela fait une semaine que je commence à travailler avec du VBA, mon niveau n'est donc pas très élevé, et j'ai quelques difficultés...J'ai perdu beaucoup de temps à chercher une solution, n'en ayant pas trouvé, me voila :x. Je travail avec Excel 2003.
J'ai un Tableau sous Excel, qui possède en colonne 2 informations différente, provenance et date. Sur 2 lignes, j'ai la catégorie du produit et le type de produit, c'est à dire que chaque catégorie est divisée en 3 types de produits. Je souhaiterais retrouver sur une ligne l'ensemble de ces informations, chaque colonne correspondrait à respectivement la provenance, la date, la catégorie du produit, le type de produit. Le but étant de faciliter la lecture au moment du basculement des informations dans ma BDD.
Bien sur des valeurs sont liées au tableau de départ et je souhaiterais les retrouver dans le tableau d'arrivée.
------------------------ Cat produit 1-----------------Cat produit 2
provenance-date---type1----type2-type3----------type1--type2-type3
france-------jan------3--------1-----2 -------------2------1------3
france-------fev------1--------5-----0 -------------8-----2------1
espagne------jan-----x---------x---- x--------------x-----x-------x
espagne------fev -----x---------x----x--------------x-----x------x
ça c'est le tableau de départ et je voudrais:
provenance---cat produit---type---jan--fev
france--------Cat produit1-type1---3----1
france--------Cat produit1-type2---1----5
france--------Cat produit1-type3---2----0
france--------Cat produit2-type1---2----8
etc------------etc----------etc
Sachant que j'ai un nombre i de tableaux de départ qui se trouvent dans des onglets différents et un seul tableau d'arrivée qui est lui aussi sur un onglet à lui et bien sur j'ai plusieurs catégories de produits. plusieurs provenances. 13 mois d'historique. :x Il faut que mon tableux d'arrivée regroupe l'ensemble des données des onglets.
Est ce qu'il existe une fonction vba ou une manip excel qui me permettrait de transformer le tableau 1 dans la forme du tableau 2 Sachant que les données sont liées ? Comment m'y prendre? C'est finalement un peu comme une transposition que je cherche à faire non?.
J'ai commencer à faire quelquechose mais bon bien sur ça marche pas. lol
Sub Copie(Nb_onglet)
Dim ProchaineLigneVide As Integer
For i = 1 To Nb_onglet
sheets(i).activate
With Sheets("feuille1")
ProchaineLigneVide = .Range("A65536").End(xlUp).Row + 1
.Range("A2" & ProchaineLigneVide).Value = ProchaineLigneVide
.Range("B2" & ProchaineLigneVide).Value = Sheets(i)Range("A5").Value
.Range("C2" & ProchaineLigneVide).Value = Sheets(i).").Range("B5").Value
.Range("D2" & ProchaineLigneVide).Value = Sheets(i).").Range("C5").Value
.Range("E2" & ProchaineLigneVide).Value = Sheets(i).").Range("D5").Value
.Range("F2" & ProchaineLigneVide).Value = Sheets(i).").Range("A8").Value
.Range("G2" & ProchaineLigneVide).Value = Sheets(i).").Range("B8").Value
End With
End Sub
Merci d'avance :)
Cela fait une semaine que je commence à travailler avec du VBA, mon niveau n'est donc pas très élevé, et j'ai quelques difficultés...J'ai perdu beaucoup de temps à chercher une solution, n'en ayant pas trouvé, me voila :x. Je travail avec Excel 2003.
J'ai un Tableau sous Excel, qui possède en colonne 2 informations différente, provenance et date. Sur 2 lignes, j'ai la catégorie du produit et le type de produit, c'est à dire que chaque catégorie est divisée en 3 types de produits. Je souhaiterais retrouver sur une ligne l'ensemble de ces informations, chaque colonne correspondrait à respectivement la provenance, la date, la catégorie du produit, le type de produit. Le but étant de faciliter la lecture au moment du basculement des informations dans ma BDD.
Bien sur des valeurs sont liées au tableau de départ et je souhaiterais les retrouver dans le tableau d'arrivée.
------------------------ Cat produit 1-----------------Cat produit 2
provenance-date---type1----type2-type3----------type1--type2-type3
france-------jan------3--------1-----2 -------------2------1------3
france-------fev------1--------5-----0 -------------8-----2------1
espagne------jan-----x---------x---- x--------------x-----x-------x
espagne------fev -----x---------x----x--------------x-----x------x
ça c'est le tableau de départ et je voudrais:
provenance---cat produit---type---jan--fev
france--------Cat produit1-type1---3----1
france--------Cat produit1-type2---1----5
france--------Cat produit1-type3---2----0
france--------Cat produit2-type1---2----8
etc------------etc----------etc
Sachant que j'ai un nombre i de tableaux de départ qui se trouvent dans des onglets différents et un seul tableau d'arrivée qui est lui aussi sur un onglet à lui et bien sur j'ai plusieurs catégories de produits. plusieurs provenances. 13 mois d'historique. :x Il faut que mon tableux d'arrivée regroupe l'ensemble des données des onglets.
Est ce qu'il existe une fonction vba ou une manip excel qui me permettrait de transformer le tableau 1 dans la forme du tableau 2 Sachant que les données sont liées ? Comment m'y prendre? C'est finalement un peu comme une transposition que je cherche à faire non?.
J'ai commencer à faire quelquechose mais bon bien sur ça marche pas. lol
Sub Copie(Nb_onglet)
Dim ProchaineLigneVide As Integer
For i = 1 To Nb_onglet
sheets(i).activate
With Sheets("feuille1")
ProchaineLigneVide = .Range("A65536").End(xlUp).Row + 1
.Range("A2" & ProchaineLigneVide).Value = ProchaineLigneVide
.Range("B2" & ProchaineLigneVide).Value = Sheets(i)Range("A5").Value
.Range("C2" & ProchaineLigneVide).Value = Sheets(i).").Range("B5").Value
.Range("D2" & ProchaineLigneVide).Value = Sheets(i).").Range("C5").Value
.Range("E2" & ProchaineLigneVide).Value = Sheets(i).").Range("D5").Value
.Range("F2" & ProchaineLigneVide).Value = Sheets(i).").Range("A8").Value
.Range("G2" & ProchaineLigneVide).Value = Sheets(i).").Range("B8").Value
End With
End Sub
Merci d'avance :)
A voir également:
- Petit soucis VBA/Excel
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Trier du plus petit au plus grand excel - Guide
- Si ou excel - Guide
- Déplacer colonne excel - Guide
4 réponses
Bonjour,
Combien (environ) as tu de lignes dans ton tableau source ?
Veux tu absolument pour chaque pays tous les produits, tous les produits 2, ou est ce sans importance ?
historique sur 13 mois: on commence toujours en Jan et la dernière colonne est donc encore Jan ?
Pour être + efficace, peux tu joindtre un extrait de ton classeur (données anonymes sur quelques lignes suffisent) sur
http://cijoint.fr/
et coller le lien proposé dans ton message
dans l'attente
Michel
Combien (environ) as tu de lignes dans ton tableau source ?
Veux tu absolument pour chaque pays tous les produits, tous les produits 2, ou est ce sans importance ?
historique sur 13 mois: on commence toujours en Jan et la dernière colonne est donc encore Jan ?
Pour être + efficace, peux tu joindtre un extrait de ton classeur (données anonymes sur quelques lignes suffisent) sur
http://cijoint.fr/
et coller le lien proposé dans ton message
dans l'attente
Michel
Bonjour michel,
Dans mon tableau source cela varie selon les onglets, j'ai entre 20 et 1000 lignes au total j'ai 11 000 lignes, mais par la suite il y aura moins de lignes, vu que ce sera mis a jour mois après mois, oui j'ai besoin pour chaque pays de tous les produits
Pour ce qui est de l'historique, oui ce sera de janvier à janvier.
Je n'ai pas accès à ce site pour joindre mon fichier ;) proxy sécurisé :(.
dsl :( Pour le moment je crée l'historique en fait.
En fait c'est à destination d'une BDD.
les tableaux que j'ai au départ doivent être remis en forme de manière à pouvoir ensuite les traduire et les liés à access.
Il faut donc que mon tableau regroupant l'ensemble
Dans mon tableau source cela varie selon les onglets, j'ai entre 20 et 1000 lignes au total j'ai 11 000 lignes, mais par la suite il y aura moins de lignes, vu que ce sera mis a jour mois après mois, oui j'ai besoin pour chaque pays de tous les produits
Pour ce qui est de l'historique, oui ce sera de janvier à janvier.
Je n'ai pas accès à ce site pour joindre mon fichier ;) proxy sécurisé :(.
dsl :( Pour le moment je crée l'historique en fait.
En fait c'est à destination d'une BDD.
les tableaux que j'ai au départ doivent être remis en forme de manière à pouvoir ensuite les traduire et les liés à access.
Il faut donc que mon tableau regroupant l'ensemble
Re,
question + précise, excuse moi:
Veux tu absolument pour chaque pays regrouper tous les produits 1, puis tous les produits 2, etc..ou est ce sans importance ?
le code serait plus compliqué surtout que je doute d'un tri final sur 11000 lignes et 16 colonnes
est ce qu'au départ tous les produits sont déjà regroupés par pays (tout France, puis tout Suisse, eetc...?
question + précise, excuse moi:
Veux tu absolument pour chaque pays regrouper tous les produits 1, puis tous les produits 2, etc..ou est ce sans importance ?
le code serait plus compliqué surtout que je doute d'un tri final sur 11000 lignes et 16 colonnes
est ce qu'au départ tous les produits sont déjà regroupés par pays (tout France, puis tout Suisse, eetc...?
Oui j'aimerais tous les produits. Au départ oui ils le sont. Mes tables se présentent de la même manière que les tableaux que j'ai essayer de simuler dans le post.
En fait sur ma page finale, je veux récupérer toutes les informations des onglets précédents. Mais en gardant les correspondances de valeurs bien sur. une fois que j'ai toutes les informations en colonne, je voudrais les traduire pour les rendre accessibles à ma BDD access,
Au final ce que je suis en train de faire sera mis à jour une fois par mois, j'aurais juste à cliquer sur MAJ et le pc va taffer pendant xtemps, à priori cela n'a pas d'importance pour le moment.
En fait sur ma page finale, je veux récupérer toutes les informations des onglets précédents. Mais en gardant les correspondances de valeurs bien sur. une fois que j'ai toutes les informations en colonne, je voudrais les traduire pour les rendre accessibles à ma BDD access,
Au final ce que je suis en train de faire sera mis à jour une fois par mois, j'aurais juste à cliquer sur MAJ et le pc va taffer pendant xtemps, à priori cela n'a pas d'importance pour le moment.
OK, merci,
proposition certainement demain fin de matinée (y'a du boulot mine de rien surtout en regroupant par type de produits)
proposition certainement demain fin de matinée (y'a du boulot mine de rien surtout en regroupant par type de produits)
tu appelles ton pb un petit souci ? hé bé...
regarde si cette maquette te convient
http://www.cijoint.fr/cjlink.php?file=cj201009/cijoMb5hZp.xls
moi pas: je n'aurais mis qu'une ligne par pays-produit-type pour la récap, mais j'ai éxécuté suivant ta demande; bien que pour envoyé dans access, il y sera facile de faire une requete avec "group by" mais...sur excel, la philosophie du code serait assez différente!
regarde si cette maquette te convient
http://www.cijoint.fr/cjlink.php?file=cj201009/cijoMb5hZp.xls
moi pas: je n'aurais mis qu'une ligne par pays-produit-type pour la récap, mais j'ai éxécuté suivant ta demande; bien que pour envoyé dans access, il y sera facile de faire une requete avec "group by" mais...sur excel, la philosophie du code serait assez différente!
en attendant voila les codes:
Sub trier_croissant(tablo)
'd'après Silkyroad, https://silkyroad.developpez.com/
Dim i As Long, x As Long, k As Long, tempo As String
For i = 0 To UBound(tablo)
x = i
For k = x + 1 To UBound(tablo)
If tablo(k) <= tablo(x) Then x = k
Next k
If i <> x Then
tempo = tablo(x): tablo(x) = tablo(i): tablo(i) = tempo
End If
Next i
End Sub
Option Explicit
Sub synthetiser_pays()
Dim test
'déclarations pays
Dim dico As Object
Dim nbre As Byte, cptr As Integer, cptr_dico As Integer
Dim derlig As Integer, ref As String
Dim liste
'délarations recensement
Dim cptr_l As Integer, nbre_p As Integer, lig As Integer, cptr_p As Integer, cptr_c As Integer, cptr_t As Integer, cptr_fin As Integer
Dim pays As String
Dim tablo_cat, tablo_type, tablo_fin
Dim col As Byte
Set dico = CreateObject("scripting.dictionary")
nbre = ThisWorkbook.Sheets.Count - 1 ' la feuille récapitulative est en fin de classeur
'------------------------------------crée dico des pays
For cptr = 1 To nbre
With Sheets(cptr)
derlig = .Range("A65536").End(xlUp).Row
For cptr_dico = 3 To derlig
ref = Application.WorksheetFunction.Proper(.Cells(cptr_dico, 1)) ' force le pays en nom propre
If Not dico.Exists(ref) Then
dico.Add ref, ref
End If
Next
End With
Next
'trie les pays par ordre apha
liste = dico.items
trier_croissant liste
'-------recensement par pays
'initialisation des array
tablo_cat = Array("cat produit 1", "cat produit 2")
tablo_type = Array("type 1", "type 2", "type 3")
ReDim tablo_fin(15, 0)
For cptr_l = 0 To UBound(liste)
pays = liste(cptr_l)
' recherche le pays dans les feuilles
For cptr = 1 To nbre
With Sheets(cptr)
'nombre de fois où le pays est indiqué dans la feuille
derlig = .Range("A65536").End(xlUp).Row
nbre_p = Application.CountIf(.Range("A3:A" & derlig), pays)
If nbre_p > 0 Then
' mémorise dans le tableau
lig = .Columns(1).Find(pays, .Range("A2"), xlValues).Row 'mémorise le pays
For cptr_c = 0 To UBound(tablo_cat) 'memorise par cat produit
For cptr_t = 0 To UBound(tablo_type) ' morise par type
tablo_fin(0, cptr_fin) = .Cells(lig, 1) 'pays
tablo_fin(1, cptr_fin) = tablo_cat(cptr_c) ' catégorie
tablo_fin(2, cptr_fin) = tablo_type(cptr_t) ' typte
For cptr_p = 0 To nbre_p - 1
col = Sheets("recap").Rows(2).Find(.Cells(lig + cptr_p, 2), Range("A2")).Column ' mois
tablo_fin(col - 1, cptr_fin) = .Cells(lig + cptr_p, 3 * (cptr_c + 1) + cptr_t) 'mémorise la valeur dans la colonne mois
Next
cptr_fin = cptr_fin + 1
ReDim Preserve tablo_fin(15, cptr_fin)
Next
Next
End If
End With
Sheets("recap").Range("A3").Resize(cptr_fin + 1, 16) = Application.Transpose(tablo_fin)
Next
Next
End Sub
Sub trier_croissant(tablo)
'd'après Silkyroad, https://silkyroad.developpez.com/
Dim i As Long, x As Long, k As Long, tempo As String
For i = 0 To UBound(tablo)
x = i
For k = x + 1 To UBound(tablo)
If tablo(k) <= tablo(x) Then x = k
Next k
If i <> x Then
tempo = tablo(x): tablo(x) = tablo(i): tablo(i) = tempo
End If
Next i
End Sub