Comment onvertir une matrice de 47 à 3 colonnes pour Oracle
Bonjour à tous,
J'ai passé 4 h depuis ce matin à chercher une réponse dans les précédents posts en vain.
Je suis sous excel 2007 en anglais en plus... Je suis une buse à part vlookup et vaguement IF je ne touche pas du tout, et VBA je sais juste importer du code mais je ne le lis pas
J'ai vu quelques solutions dans le forum sur de la conversion de colonnes mais je n'ai pas été capable de modifier à ma sauce car je n'ai trouvé nulle part un exemple qui colle à mon fichier.
Donc je me lance :
J'ai une matrice de 67 lignes x45 colonnes
Pour un besoin de nos IT sur Oracle je dois transformer mon tableau en 3 colonnes
Dans ma matrice j'ai des 1 ou des "-" car le produit n'est pas dispo chez le distributeur
Mon tableau joint sera plus parlant j'espère, il contient la matrice complète et ce que je cherche à obtenir
J'ai vu plein d'approches avec INDEX, mais je n'ai pas compris la syntaxe avec des calculs de MOD etc... j'avoue m'etre perdu, en plus j'ai des critères à respecter si 1 ou "-".... Les exemples du forum en VBA ne me parlent pas car je ne maîtrise pas du tout le code.
Vu le temps passé à chercher j'aurais pu faire des copier coller mais vu que je dois refaire cet exercice régulièrement, je sollicite votre aide ce qui ne pourra que m'améliorer en Excel et me faire gagner un temps précieux.
Merci pour votre aide
Salut,
Pas certain d'avoir compris.
D'un cote tu as une matrice avec des 1 et de '-' et de l'autre des 1, 2, 50, 59 ....
Mais essai ceci dans un module standard:
Option Explicit
Sub MatriceOracle()
Dim CptDistri As Byte
Dim CptWera As Integer, CptLigDst As Integer
Dim shtSrc As Worksheet, shtDst As Worksheet
Set shtSrc = ThisWorkbook.Sheets("Full matrice")
Set shtDst = ThisWorkbook.Sheets("Sheet3")
With shtDst
.Cells.Delete
.Range("A1").Value = "List_ID"
.Range("B1").Value = "Group_ID"
.Range("C1").Value = "Order_ID"
End With
CptLigDst = 2
For CptDistri = 2 To shtSrc.Range("B2").End(xlToRight).Column
For CptWera = 3 To shtSrc.Range("A3").End(xlDown).Row
If shtSrc.Cells(CptWera, CptDistri).Value = 1 Then
shtDst.Range("A" & CptLigDst).Value = shtSrc.Range("A" & CptWera).Value
shtDst.Range("B" & CptLigDst).Value = CptDistri - 1
shtDst.Range("C" & CptLigDst).Value = CptWera - 2
CptLigDst = CptLigDst + 1
End If
Next CptWera
Next CptDistri
Set shtDst = Nothing
Set shtSrc = Nothing
End Sub++
Salut et merci c'est presque ça,
Cela prend forme, je ne m'explique pas cependant le fait que le process fabrique exactement le bon nombre de lignes, mais la colonne Order_ID ne s'incrémente pas correctement, et je ne vois pas où corriger.
En fait cette dernière colonne doit faire apparaître le numéro d'ordre du groupe, en gros afficher le numéro de la ligne, si j'ai 45 ligne pour groupe 1, alors de 1 à 45, si j'ai 42 lignes pour groupe 2, alors numéro de 1 à 42 etc..
Par exemple pour le group_ID 1 il y a 45 lignes mais l'order_ID affiche 67 au lieu de 45 (il saute de 25 à 30 par exemple), je pense que mon explication de départ était approximatif
En tous cas merci d'avoir pris un peu de temps pour mon problème
Re,
Comme cela alors:
Option Explicit
Sub MatriceOracle()
Dim CptDistri As Byte
Dim CptWera As Integer, CptLigDst As Integer, CptOrderID As Integer
Dim shtSrc As Worksheet, shtDst As Worksheet
Set shtSrc = ThisWorkbook.Sheets("Full matrice")
Set shtDst = ThisWorkbook.Sheets("Sheet3")
With shtDst
.Cells.Delete
.Range("A1").Value = "List_ID"
.Range("B1").Value = "Group_ID"
.Range("C1").Value = "Order_ID"
End With
CptLigDst = 2
For CptDistri = 2 To shtSrc.Range("B2").End(xlToRight).Column
CptOrderID = 1
For CptWera = 3 To shtSrc.Range("A3").End(xlDown).Row
If shtSrc.Cells(CptWera, CptDistri).Value = 1 Then
shtDst.Range("A" & CptLigDst).Value = shtSrc.Range("A" & CptWera).Value
shtDst.Range("B" & CptLigDst).Value = CptDistri - 1
shtDst.Range("C" & CptLigDst).Value = CptOrderID
CptOrderID = CptOrderID + 1
CptLigDst = CptLigDst + 1
End If
Next CptWera
Next CptDistri
Set shtDst = Nothing
Set shtSrc = Nothing
End SubJe n'avais pas compris que c'etait un ordre si existant pour le distri et pas juste un order de groupe
++
Encore merci, j'étais en train d'edit mon précédent post mais tu as sorti ton code plus vite que je n'ai pu m'exprimer :p
Non mais tu n'as rien à te reprocher, je me suis mal exprimé dès le début et la ligne 2 de ma matrice prête à confusion.
En fait B2=1 mais cela correspond à mon code interne pour distributeur 1
C2= 2 correspond à distributeur 2
mais tu ne trouveras par exemple pas de n° 5 ni 6
Donc ton code a parfaitement reproduit la colonne A en tenant bien compte de la présence d'un "1" ou "-" = OK ça marche ça reproduit exactement la réalité
La colonne B en revanche ne correspond pas à mes codes distributeurs, ils s'incrémentent de 1 à 45, or chez moi le numéros ne se suivent pas, c'est une coïncidence les 1 et 2 au début
Cette colonne doit simplement reprendre l'entête de colonne du groupe en cours. Si la macro est en train de lire la colonne P de la matrice par exemple, et bien la sheet3 devrait montrer le numéro de distributeur 47 à chaque fois qu'il y a un 1
La colonne 3 order_ID fonctionne parfaitement merci
Navré pour la confusion et pour mon niveau déplorable
Je m'en doutais d'ou ma reflexion dans mon 1er poste, le resultat souhaite ne correspondait pas aux explications...
remplace simplement
CptDistri - 1par
shtSrc.Cells(2, CptDistri).ValueCa devrait etre la bonne cette fois.
++
Bon ,
Ben c'est parfait affaire réglée, je vais essayer de décortiquer avec mon ami google fonction par fonction et me coucher moins bête
Merci encore