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

23matrice-forum.xlsx (19.16 Ko)

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 Sub

Je 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 j'ai 45 distributeurs numérotés de 1 à 56 avec forcément des trous.

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 - 1

par

shtSrc.Cells(2, CptDistri).Value

Ca 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

Rechercher des sujets similaires à "comment onvertir matrice colonnes oracle"