Problème MACRO tableau

Bonjour,

Dans une mcro j'ai besoin de faire un test (si colonne 5 du tableau = "pièces", alors OK.

je vous donne mon code et mon fichier.

J'ai un message d'erreure : next sans for

Lultras

 Option Explicit

Dim tablo, tabloR(), f As Worksheet, i&, k&

Sub Extraction()

    tablo = Range("F2:W" & Range("F" & Rows.Count).End(xlUp).Row)
    Set f = ActiveSheet
    k = 1
    For i = 1 To UBound(tablo, 1)
        If tablo(i, 17) < tablo(i, 18) Then
        If tablo(i, 5).Value = "Pièces" Then
            ReDim Preserve tabloR(1 To 18, 1 To k + 1)
            tabloR(1, k) = tablo(i, 1)
            tabloR(2, k) = tablo(i, 2)
            tabloR(3, k) = tablo(i, 3)
            tabloR(4, k) = tablo(i, 4)
            tabloR(5, k) = tablo(i, 5)
            tabloR(6, k) = tablo(i, 6)
            tabloR(7, k) = tablo(i, 7)
            tabloR(8, k) = tablo(i, 8)
            tabloR(9, k) = tablo(i, 9)
            tabloR(10, k) = tablo(i, 10)
            tabloR(11, k) = tablo(i, 11)
            tabloR(12, k) = tablo(i, 12)
            tabloR(13, k) = tablo(i, 13)
            tabloR(14, k) = tablo(i, 14)
            tabloR(15, k) = tablo(i, 15)
            tabloR(16, k) = tablo(i, 16)
            tabloR(17, k) = tablo(i, 17)
            tabloR(18, k) = tablo(i, 18)
            k = k + 1
        End If
    Next i

    If k = 1 Then Exit Sub
    Sheets.Add after:=Sheets(1)
    f.Range("F1:W1").Copy Range("F1")
    Range("F2").Resize(UBound(tabloR, 2), 18) = Application.Transpose(tabloR)
    f.Range("F:W").Copy
    ActiveSheet.Range("F1").PasteSpecial xlPasteFormats
    Application.CutCopyMode = False
    Range("F1").Select
End Sub

A mon avis c'est ici que sa bug ^^ :

    For i = 1 To UBound(tablo, 1)
        If tablo(i, 17) < tablo(i, 18) Then
        If tablo(i, 5).Value = "Pièces" Then

Bonjour,

Si tu indentais correctement ton code, tu verrais immédiatement (avant erreur !) qu'il manque un End If !

Cordialement.

Bonjour,

A tester

Attention avec les tableaux, la première colonne est 0, la deuxième 1, etc

Ou alors

Mettre "Option Base 1" en dessous de l'option explicit

De plus, il te manquait un END IF (le fait d'incrémenter te l'aurais montrer)

Bonjour,

Oui effectivement ^^ j'ai mis cela :

k = k + 1
    End If
End If

Next i

Mais j'ai un nouveau message d'erreur ^^ (oui je suis novice) sur la partie suivante :

For i = 1 To UBound(tablo, 1)
        If tablo(i, 17) < tablo(i, 18) Then
        If tablo(i, 5).Value = "Pièces" Then
            ReDim Preserve tabloR(1 To 18, 1 To k + 1)
            tabloR(1, k) = tablo(i, 1)

avec le message suivant : erreur d'execution 424, objet requis

Merci en tout cas on a déjà avancé x)

Re,

remplace

If tablo(i, 5).Value = "Pièces" Then

par

If tablo(i, 5) = "Pièces" Then

Bonjour M12,

Du coup tu as répondus à mon deuxième problème ^^ Merci

Donc si je rajoute un test, je doit remettre un end if automatiquement ?

Et pour un test simple comme ça, j’enlève le .value (inutile).

Merci beaucoup en tout cas

Re,

M12 : pas de problème d'indice dans ce cas : tablo démarre ses indices à 1, et tabloR les dimensionne explicitement à partir de 1...

Pas besoin d'Option Base 1, laquelle est d'ailleurs plutôt une source de problème qu'une aide, il est plus clair et sûr d'avoir l'option base par défaut à 0, et dimensionner explicitement à l'indice que l'on veut quand ce n'est pas 0, sans oublier non plus qu'un tableau constitué à partir des valeurs d'une plage sera basé sur 1 et non 0.

lultras : enlève .Value, tablo n'est pas une plage, mais un tableau !

Pourquoi dimensionner à k+1 pour affecter à l'indice k ? Bizarre !

Et une boucle éviterait cette macro inutilement longue...

Cordialement.

Mr ferrand : merci pour la précision

Admettons je veuille ajouter un critère dans mon deuxième test (si colonne 5 = pièces OU vis)

Voici ce que j'ai mis et que me parrait logique, mais comme par hasard, cela ne marche pas... (Oui je suis très novice lol)

Merci d'avance si vous avez le temps bien sûr

If tablo(i, 5) = "Pièces" Or "vis" Then

Re

    If tablo(i, 5) = "Pièces" Or tablo(i, 5) ="vis" Then

M12 : Ah ok il faut re-citer la plage du tableau

Merci c'est vraiment coul ! je vais pouvoir m'amuser pour mes extractions maintenant

lultras

If tablo(i, 5) = "Pièces" Or tablo(i, 5) = "vis" Then

Autre chose : as-tu testé avec des dates dont le jour est inférieur à 13 ? (ou n'y en a-t-il jamais ?)

Pas testé sur mon fichier d'origine :/

J'adapte mon code à mon fichier d'origine et je vous fait un feed-back

Lultras

Mes propositions de modification (sur ton modèle, connais pas la structure de ton fichier original).

Sub Extraction()
    Dim tablo, tabloR(), f As Worksheet, i&, k&, j%
    Set f = ActiveSheet
    With f
        tablo = .Range("F2:W" & .Range("F" & .Rows.Count).End(xlUp).Row).Value2
    End With
    For i = 1 To UBound(tablo, 1)
        If tablo(i, 17) < tablo(i, 18) And (tablo(i, 5) = "Pièces" Or tablo(i, 5) = "vis") Then
            k = k + 1: ReDim Preserve tabloR(1 To 18, 1 To k)
            For j = 1 To 18
                tabloR(j, k) = tablo(i, j)
            Next j
        End If
    Next i
    If k = 0 Then Exit Sub
    With Sheets.Add(after:=f)
        With .Range("F2").Resize(k, 18)
            .Value = WorksheetFunction.Transpose(tabloR)
            .Rows(0).Value = f.Range("F1:W1").Value
            .Columns("O:R").NumberFormat = "dd/mm/yyyy"
        End With
    End With
End Sub

Cordialement.

C'est vraiment sympas de proposer une macro en plus simple ! Elle marche impec !

Et on s'y retrouve beaucoup mieux !

Je s'avais pas que l'on pouvais séparer deux tests uniquement Par un "And", sa m'évitera de revenir à chaque fois à la ligne

Lultras

Je s'avais pas que l'on pouvais séparer deux tests uniquement Par un "And", sa m'évitera de revenir à chaque fois à la ligne

Tu peux lorsque toutes les comparaisons peuvent se faire sans déclencher d'incompatibilité de type...

Il faut aussi te méfier, regarde les parenthèses, on a :

If condition1 And (condition2a Or condition2b) Then

VBA évalue d'abord si condition2a OU condition2b est vraie, ce qui renvoie vrai pour l'ensemble, et ensuite si condition1 est vrai, pour renvoyer vrai si c'est le cas pour la totalité de l'expression.

Sans les parenthèses : VBA aurait d'abord évalué si condition1 ET condition2a étaient vraies simultanément, et si faux aurait renvoyé vrai pour l'expression si condition2b était vraie.

Ceci parce que And est prioritaire sur Or, priorité qui aurait joué sans les parenthèses et aurait pu fausser le test...

Note aussi les adressages relatif en fin de macro :

La plage d'affectation de tabloR est mise sous bloc With, et c'est par rapport à cette plage que les adressages suivants se font :

La ligne 0 (qui existe dans ce cas !) est celle qui précède la ligne 1 de la plage (qui est la 2e ligne de la feuille), elle est donc située en ligne 1 sur la feuille et occupe les mêmes colonnes que la plage.

Les colonnes O:R de la plage sont les 15e à 18e colonnes de celle-ci et non les colonnes O à R de la feuille, et elles sont limitées à la hauteur de la plage.

On y remet un format de date... A ce propos note aussi l'affectation à tablo avec .Value2 : Value2 permet la récupération des dates sous forme numérique, ce qui évitera les inversions de mois et jour (si le jour peut correspondre à un mois pour VBA...) [et ce pourquoi il faut remettre un format de date sur les colonnes car l'affectation étant numérique Excel ne sait plus qu'il s'agit de dates...]

Cordialement.

Merci pour tes précisions, c'est vrai que beaucoup de choses joue sur les tests, et effectivement, je viens de me rendre compte du O:R, et de leur liens avec le numéro de colonnes

Maintenant je devrais être apte à développer des petites macro sur mes fichiers pour faire des extractions plus ou moins complexes

Si vous me voyer moin actif c'est que ça marche aha ^^

Encore merci Mr ferrant !

lultras

J'ai un message d’erreur quand j'adapte mon code sur le fichier d'origine, la macro se lance, ouvre la feuil pour faire le copier/coller, mais rien ne s'inscrit et j'ai ça comme message : erreur d'execution "13" incompatibilité de type.

il me surligne la ligne suivante :

 .Value = WorksheetFunction.Transpose(tabloR)

Merci d'avance

Fonctionne sur le modèle et plus sur ton fichier...

Faut voir ce qui a changé ! Tu as bien un point devant .Value, vérifier la conformité des deux lignes qui précèdent, parce que sur cette ligne, je veux bien une erreur 1004, mais une erreur 13 elle est forcément ailleurs !

Bon alors, mon code n'a pas changé et il marche MAIS, il ne prend en compte qu'un seul de mes deux arguments (dans le test 2)...

MDR

"vis" ?

Tu as "vis" ou "Vis", les comparaisons en VBA sont par défaut sensibles à la casse (contrairement à Excel où c'est le contraire).

Rechercher des sujets similaires à "probleme macro tableau"