Alimenter une variable tableau avec condition

Bonjour,

j'ai crée à partir d'une table les trois array suivants (une seule colonne chacun):

arrReference

arrProducteur

arrClefReferenceProducteur

Je désire alimenter arrClefReferenceProducteur en fonction de arrProducteur et arrReference: l'idée est que arrClefReferenceProducteur () prend la valeur de concatenation arrProducteur et arrReference seulement si arrReference (n ,1) est differente de arrReference (n-1 ,1) ou

arrProducteur (n ,1) est differente de arrProducteur (n-1 ,1).

Quelque chose coince dans la syntaxe je pense cela ne marche pas: voici le code ainsi que le fichier en PJ.

Merci d'avance!

For lRows = LBound(arrClefReferenceProducteur, 1) To UBound(arrClefReferenceProducteur, 1)

For lColumn = LBound(arrClefReferenceProducteur, 2) To UBound(arrClefReferenceProducteur, 2)

If arrProducteur(lRows + 1, lColumn) <> arrProducteur(lRows, lColumn) Then

'Ca coince avec lRows+1: mauvaise syntaxe? autre chose?

arrClefReferenceProducteur(lRows, lColumn) = arrReference(lRows, lColumn) & arrProducteur(lRows, lColumn)

Else

End If

Next lColumn

Next lRows

bonjour

pourquoi ne pas ajouter une colonne à ta table, avec des SI() et des & ?

Excel fonctionne d'abord avec des formules

si besoin joins un fichier avec des exemples de résultat dans une colonne que tu saisiras à la main

pas besoin de VBA.

Salut Pierre, jmd,

pour le coup, jmd a raison mais, j'aime trop VBA...

Désolé, hein, jmd!

Faire simple pour commencer... Un double-clic n'importe où déclenche la macro avec affichage en [Z].

A toi de dire ce dont tu as besoin ensuite comme extraction de données... que jmd te sortira en quelques formules, d'ailleurs!

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'
Dim iColA%, iColRes%, iColRef%, iColP%, iColRP%, iRow%, x%, tData, tExtract()
Cancel = True
'
With Worksheets("données_rapatriées")
    .Columns(26).ClearContents
    iColA = .Rows(1).Find(what:="Analyse", lookat:=xlWhole).Column
    iColRes = .Rows(1).Find(what:="Résultat", lookat:=xlWhole).Column
    iColRef = .Rows(1).Find(what:="Référence", lookat:=xlWhole).Column
    iColP = .Rows(1).Find(what:="Producteur", lookat:=xlWhole).Column
    iRow = .UsedRange.Rows.Count
    tData = .Range("A1:Y" & iRow).Value
    '
    ReDim tExtract(iRow)
    tExtract(0) = "ClefReferenceProducteur"
    '
    For x = 2 To UBound(tData, 1)
        If tData(x, iColP) <> tData(x - 1, iColP) Or tData(x, iColRef) <> tData(x - 1, iColRef) Then _
            tExtract(x - 1) = tData(x, iColP) & tData(x, iColRef)
    Next
    .Range("Z1").Resize(iRow, 1).Value = WorksheetFunction.Transpose(tExtract)
End With
'
End Sub

Tes importations de données sont tellement aléatoires que tu as besoin de ceci?

Pas de valeurs de colonnes fixes possibles?

iColA = .Rows(1).Find(what:="Analyse", lookat:=xlWhole).Column

iColRes = .Rows(1).Find(what:="Résultat", lookat:=xlWhole).Column

iColRef = .Rows(1).Find(what:="Référence", lookat:=xlWhole).Column

iColP = .Rows(1).Find(what:="Producteur", lookat:=xlWhole).Column

A+

re

salut curulis

beh... des formules pour afficher des valeurs, et un TCD ou le menu Données pour "extraire" des données ou des valeurs

toujours pas de VBA

Merci pour vos réponses!

Curulis, d'après ton code la ligne sivante devrait fonctionner, pourquoi diable bloque-t-elle?

If arrProducteur(lRows, lColumn) <> arrProducteur(lRows + 1, lColumn) Then

Sans le fichier que tu utilises, Pierrebastres, difficile à dire...

Bonsoir, Salut Curulis !

Je vais mettre un grain de sel ! Ton code me paraît pour l'essentiel inutile, il ne réussit qu'à noyer ce que tu veux faire, qui mériterait d'être explicitement exprimé pour qu'on puisse le réaliser sans détours...

(NB- La règle consistant à déclarer toutes ses variables en tête de procédure me paraît généralement un incontournable à respecter. A parsemer les déclarations dans toute la procédure on brouille la lecture, et à mon avis, on ralentit VBA.)

D'abord ClefReferenceProducteur est la concaténation de Producteur et Reference. Je ne comprends pas ta manipulation ? Si tu penses qu'elle risque d'être fausse, tu la refais, sinon ?

Ensuite, à moins d'avoir loupé des pans de ton code (ce qui ne serait pas impossible !), je ne vois rapatrié dans Essai que ClefReferenceProducteur ! On laisse donc tomber d'une part Producteur et Reference, et d'autre part on a prélevé Analyse et Résultat pour les abandonner !

Enfin, dans le cas où l'objectif serait le prélèvement de quelques colonnes du tableau pour les rapatrier dans Essai, ce qui n'a rien d'évident vu ton code, la méthode économique consiste à ne constituer qu'un seul tableau des données à rapatrier qui seront alors affectées en une seule fois...

Cordialement.

Dis donc, PierreBastres, si tu téléchargeais le fichier pour voir... Non?

Salut Pierre, jmd,

pour le coup, jmd a raison mais, j'aime trop VBA...

Désolé, hein, jmd!

salut curulis

sur ce coup, pas sûr que tu rendes service ? ? ?

si on me fournit un fichier avec les données de départ et les données recherchées (un exemple tapé au clavier ira bien), je le fais.

sans VBA bien entendu

Eeeeeh, jmd,

avec VBA, bien entendu!

Réflexe de dinosaure qui n'a vraiment (vraiment) pas le temps (ni surtout la motivation, j'avoue!) de creuser tout l'arsenal flamboyant des formules!

Chapeau à vous pour toutes ces formules!

Sans rancune! VBA über alles!

A+

Sans le fichier que tu utilises, Pierrebastres, difficile à dire...

Merci de votre aide,

ce code est un exemple, je cherche à comprendre comment comparer deux valeurs successives d'un array sur la dimension 1: la ligne en rose comporte-t-elle une erreur de syntaxe?

merci!!

For lRows = LBound(arrClefReferenceProducteur, 1) To UBound(arrClefReferenceProducteur, 1)

For lColumn = LBound(arrClefReferenceProducteur, 2) To UBound(arrClefReferenceProducteur, 2)

If arrProducteur(lRows, lColumn) <> arrProducteur(lRows + 1, lColumn) Then

arrClefReferenceProducteur(lRows, lColumn) = arrReference(lRows, lColumn) & arrProducteur(lRows, lColumn)

Else

End If

Next lColumn

Next lRows

For lRows = LBound(arrClefReferenceProducteur, 1) To UBound(arrClefReferenceProducteur, 1)

For lColumn = LBound(arrClefReferenceProducteur, 2) To UBound(arrClefReferenceProducteur, 2)

If arrProducteur(lRows, lColumn) <> arrProducteur(lRows + 1, lColumn) Then

arrClefReferenceProducteur(lRows, lColumn) = arrReference(lRows, lColumn) & arrProducteur(lRows, lColumn)

Else

End If

Next lColumn

Next lRows

Parce que Ubound(...) de chaque tableau étant identique, lRows+1 DEPASSE ce Ubound... de 1...

A+

Je dois avoir quelque chose de spécial en ce moment ! Celui à qui on ne répond plus !!!

Si tu ne me réponds pas, et si tu ne réponds pas à mes questions, j'irai me faire voir ailleurs !

Salut MFerrand,

excuse-moi! Est-ce à moi que tu parlais après ce post-ci?

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'
Dim iColA%, iColRes%, iColRef%, iColP%, iColRP%, iRow%, x%, tData, tExtract()
Cancel = True
'
With Worksheets("données_rapatriées")
    .Columns(26).ClearContents
    iColA = .Rows(1).Find(what:="Analyse", lookat:=xlWhole).Column
    iColRes = .Rows(1).Find(what:="Résultat", lookat:=xlWhole).Column
    iColRef = .Rows(1).Find(what:="Référence", lookat:=xlWhole).Column
    iColP = .Rows(1).Find(what:="Producteur", lookat:=xlWhole).Column
    iRow = .UsedRange.Rows.Count
    tData = .Range("A1:Y" & iRow).Value
    '
    ReDim tExtract(iRow)
    tExtract(0) = "ClefReferenceProducteur"
    '
    For x = 2 To UBound(tData, 1)
        If tData(x, iColP) <> tData(x - 1, iColP) Or tData(x, iColRef) <> tData(x - 1, iColRef) Then _
            tExtract(x - 1) = tData(x, iColP) & tData(x, iColRef)
    Next
    .Range("Z1").Resize(iRow, 1).Value = WorksheetFunction.Transpose(tExtract)
End With
'
End Sub

Je ne me sentais pas concerné!?!? L'étais-je?

Hello ! Pas du tout ! D'autant que tu étais quasiment le seul qui discutait avec moi dans la période !

Merci de votre aide,

ce code est un exemple, je cherche à comprendre comment comparer deux valeurs successives d'un array sur la dimension 1: la ligne en rose comporte-t-elle une erreur de syntaxe?

merci!!

For lRows = LBound(arrClefReferenceProducteur, 1) To UBound(arrClefReferenceProducteur, 1)

For lColumn = LBound(arrClefReferenceProducteur, 2) To UBound(arrClefReferenceProducteur, 2)

If arrProducteur(lRows, lColumn) <> arrProducteur(lRows + 1, lColumn) Then

arrClefReferenceProducteur(lRows, lColumn) = arrReference(lRows, lColumn) & arrProducteur(lRows, lColumn)

Else

End If

Next lColumn

Next lRows

pourrais-tu me traduire le code en français ?

que je puisse faire une proposition sans code

jmd vs VBA

Hello ! Pas du tout ! D'autant que tu étais quasiment le seul qui discutait avec moi dans la période !

Bonjour MFerrand,

j'allais te répondre. Merci une fois de plus de prendre le temps d'avoir regardé mon post en détail.

En fait le fichier est assez copieux, j'ai envoyé une infime partie, voila pq bien du code te semble inutile je pense.

A très vite.

Pierre

Rechercher des sujets similaires à "alimenter variable tableau condition"