Insertion de colonne à partir d'une certaine colonne

Bonjour la communauté,

Je pose ma première question :

J'ai besoin d'insérer une colonne toutes les deux colonnes et ce à partir de la colonne "L" et ce jusqu'à la dernière colonne à valeur. Le but de cette insertion est de comparer deux colonnes (disons "M" et "N") et de renvoyer dans cette colonne insérée (donc la nouvelle) le résultat de cette formule : =SI(M3<>N3;"yes";"no").

En gros une colonne va être insérer et renvoyer le résultat de la formule ci dessus pour toutes les valeurs de "M" et "N" et ce jusqu'à la dernière ligne du fichier (fichier à ligne variable).

Voici le code que j'ai essayé de faire mais le soucis c'est qu'il me renvoi une erreur et sans inclure la formule :

Sub insert_column_after_interval_3()

Dim iLastCol As Integer

iLastCol = Cells(1, Columns.Count).End(xlToLeft).Column

For colx = 8 To iLastCol Step 3

Columns(colx).Insert Shift:=xlToRight

Next

End Sub

Merci d'avance pour votre aide.

Obeida

Bonjour,

une proposition

Sub insert_column_after_interval_3()
    Dim iLastCol As Integer
    Dim Lastline As Long
    iLastCol = Cells(1, Columns.Count).End(xlToLeft).Column + 1
    Lastline = Cells(Rows.Count, 1).End(xlUp).Row - 1
    For colx = iLastCol To 8 Step -2
        Columns(colx).Insert Shift:=xlToRight
        Cells(2, colx).Resize(Lastline).FormulaR1C1 = "=if(rc[-2]<>rc[-1],""yes"",""no"")"
    Next
End Sub

Bonjour h2so4,

Merci beaucoup pour ta réponse, j'apprécie énormément.

Cela marche très bien mais ça commence à comparer à partir de la ligne 2 alors que je veux que cela compare à partir de la troisième ligne et ce même si la ligne porte le numéro 7 ou 15 (car j'applique un filtre juste avant, seulement ça qui change sinon tout va bien).

Ensuite ce que j'ai essayé de faire avec la mise en forme conditionnelle, c'est de mettre un code couleur à toutes les cellules ayant comme valeur "yes" histoire de ne garder que les lignes ayant au moins une fois cette valeur et ce pareil à partir de la troisième ligne et ce peu importe la valeur numérique de la ligne.

Je veux garder les deux premières lignes car elles comportent mes header.

Voici mon code :

Sub KeepOnlyROwsContainingCertainValue()

' Remove all rows if empty

' Only keep the value "yes"

Dim rg As Range, c As Range, rg2 As Range

Dim i As Long, nbCol As Long, nbLig As Long, efface As Boolean

Application.ScreenUpdating = False

Set rg = ActiveCell.CurrentRegion 'All Data

nbLig = rg.Rows.Count

nbCol = rg.Columns.Count

For i = nbLig To 1 Step -1

Set rg2 = Cells(i, 1).Resize(1, nbCol)

efface = True

For Each c In rg2

If InStr(1, c.Text, "yes") > 0 Then efface = False

Next c

If efface Then Rows(i).EntireRow.Delete

If i Mod 500 = 0 Then Application.StatusBar = i 'compteur

Next i

Application.ScreenUpdating = True

End Sub

Merci pour ton aide.

Obeïda

Bonjour Obeïda,

Tu a écrit :

ça commence à comparer à partir de la ligne 2

Ça me semble bizarre, car l'instruction est : For i = nbLig To 1 Step -1

Tu a écrit :

je veux que cela compare à partir de la troisième ligne

Essaye avec : For i = nbLig To 3 Step -1

Tu a écrit :

même si la ligne porte le numéro 7 ou 15

Je n'ai rien vu dans le code qui évite ces 2 lignes, et avec l'essai précédent, ça doit aller de la dernière ligne à la ligne 3,

sans en sauter aucune ; donc normalement, elles devraient toutes être prises en compte.


Si ce n'est pas ça, je laisse la suite au très sulfureux h2so4.

NB : formule chimique de l'acide sulfurique : devinez...

@ h2so4 : j'adore les 2 autres noms de l'acide sulfurique : « huile de vitriol » et « vitriol fumant » ;

on peut dire que tu es sacrément décapant et corrosif ! c'est peut-être pour ça que tes codes

VBA sont toujours aussi percutants ?

Cordialement

Bonjour et merci dhany,

Je pense que ma maccro n'est pas optimisé car elle prend un temps fou à se terminer (je pense qu'elle indexe plus que le champ de valeur, elle va sur tout mon classeur, sur toutes les cellules et même celles sans valeurs).

Essaye avec ceci (mais remets comme avant si ça ne donne pas d'amélioration) :

Après Application.ScreenUpdating = False, mets : Application.Calculation = -41[b][color=#FF0000]3[/color][/b]5

Après Application.ScreenUpdating = True, mets : Application.Calculation = -41[b][color=#FF0000]0[/color][/b]5

Bonjour,

effacer ligne à ligne est très lent.

Filtre sur les lignes à supprimer et supprime toutes les lignes visibles d'un coup.

eric

Bonjour eriiic,

Le truc c'est que le filtre est sur plusieurs colonnes et non pas sur une seule (sinon oui ta technique aurait été utile).

par Exemple pour un produit en ligne A1, j'ai plusieurs colonnes avec plusieurs valeurs et chacune compare ce même produit en A1 selon plusieurs critères. J'ai donc besoin de garder les lignes (comme celle de A1) à partir du moment oui j'ai une valeur exacte en l'occurrence "yes" dans chaque colonne.

J’espère avoir été clair et précis.

Merci

@ Obeïda : le conseil d'eriiic est très bon, mais je crois que tu devrais quand même essayer ce que j'ai proposé plus haut ;

et même en plus de la solution d'eriiic ; s'il pense que ma solution n'est pas nécessaire, fais alors comme il le suggère.

Dans ce cas tu peux étendre dans une variable Range ta plage des lignes à supprimer dans ta boucle avec Union(), et tout supprimer en une fois après la boucle.

Dim pl As Range, lig As Long
For lig = 2 To 500
    If ton_test = True Then
        If pl Is Nothing Then
            Set pl = Rows(lig)
        Else
            Set pl = Union(pl, Rows(lig))
        End If
    End If
Next lig
If Not pl Is Nothing Then pl.EntireRow.Delete

eric

PS : je reviens sur

Le truc c'est que le filtre est sur plusieurs colonnes et non pas sur une seule (sinon oui ta technique aurait été utile)

les filtres peuvent être mis par macro

Obeida a écrit :

Bonjour h2so4,

Cela marche très bien mais ça commence à comparer à partir de la ligne 2 alors que je veux que cela compare à partir de la troisième ligne

pour insérer la formule à partir de la 3ème ligne.

remplacecells(2, parcells(3, dans cette instruction

Cells(2, colx).Resize(Lastline).FormulaR1C1 = "=if(rc[-2]<>rc[-1],""yes"",""no"")"

@h2so4 merci,

Je veux tout simplement garder toutes les lignes qui comporte la valeur "yes" de mes différents filtres (tous les filtres ont soit" yes" soit "no") et ce à partir de la ligne 3.

Quand j'applique ton code en remplaçant "ton_test" par "yes", ça ne me donne rien.

Je m'y prend mal ?

bonjour,

désolé, j'ai pas compris le problème. je t'ai fourni une macro.

la macro insère une formule toutes les 2 colonnes, cette formule donne un résultat "yes" ou "no", rien d'autre. la macro fonctionne-t-elle ?

peut-être as-tu une autre demande ? merci de joindre un fichier qui explique la demande ou le problème.

Bonjour,

Oui ta maccro fonctionne parfaitement, merci encore pour cela (la mienne devait être amélioré).

Pour ce qui est de ma requête précédente, c'est que une fois que l'insertion des colonnes se fait avec le fameux "yes" ou "non", je veux garder les lignes dont la valeur renvoyée est "yes" et ce à partir de la 3 ième lignes (car je veux garder les deux premières lignes qui sont mes headers).

Voici mon code mais je me retrouve avec plusieurs choses effacées :

Sub KeepOnlyROwsContainingYes()
' Remove all rows if empty
' Only keep the value "yes"

    Dim rg As Range, c As Range, rg2 As Range
    Dim i As Long, nbCol As Long, nbLig As Long, efface As Boolean

    Application.ScreenUpdating = False
    Set rg = ActiveCell.CurrentRegion   'All Data
    nbLig = rg.Rows.Count
    nbCol = rg.Columns.Count

    For i = nbLig To 1 Step -1
        Set rg2 = Cells(i, 1).Resize(1, nbCol)
        efface = True
        For Each c In rg2
            If InStr(1, c.Text, "yes") > 0 Then efface = False
        Next c
        If efface Then Rows(i).EntireRow.Delete

        If i Mod 500 = 0 Then Application.StatusBar = i 'compteur
    Next i

    Application.ScreenUpdating = True

End Sub

Merci

OB

bonjour,

une proposition de correction

Sub KeepOnlyROwsContainingYes()
' Remove all rows if empty
' Only keep the value "yes"

    Dim rg As Range, c As Range, rg2 As Range
    Dim i As Long, nbCol As Long, nbLig As Long, efface As Boolean

    Application.ScreenUpdating = False
    Set rg = ActiveCell.CurrentRegion   'All Data
   nbLig = rg.Rows.Count
    nbCol = rg.Columns.Count

    For i = nbLig To 3 Step -1
        Set rg2 = Cells(i, 1).Resize(1, nbCol)
        efface = True
        For Each c In rg2
            If InStr(1, c.Text, "yes") > 0 Then efface = False: Exit For
        Next c
        If efface Then Rows(i).EntireRow.Delete
        If i Mod 500 = 0 Then Application.StatusBar = i 'compteur
   Next i

    Application.ScreenUpdating = True

End Sub

Le VBA marche mais celui-ci garde les colonnes avec une valeur "yes" mais moi ce que je voulais c'était de garder les lignes dont la valeur est "yes" dans chaque colonnes et ce à partir de la ligne 3.

Je m'exprime mal peut-être.

re-bonjour,

une nouvelle version qui supprime les lignes contenant au moins un "no"

Sub KeepOnlyROwsContainingYes()
' Remove all rows if empty
' Only keep the value "yes"

    Dim rg As Range, c As Range, rg2 As Range
    Dim i As Long, nbCol As Long, nbLig As Long, efface As Boolean

    Application.ScreenUpdating = False
    Set rg = Range("A3").CurrentRegion   'All Data
  nbLig = rg.Rows.Count
    nbCol = rg.Columns.Count

    For i = nbLig To 3 Step -1
        Set rg2 = Cells(i, 1).Resize(1, nbCol)
        efface = False
        For Each c In rg2
            If InStr(1, c.Text, "no") > 0 Then efface = True: Exit For
        Next c
        If efface Then Rows(i).EntireRow.Delete
        If i Mod 500 = 0 Then Application.StatusBar = i 'compteur
  Next i

    Application.ScreenUpdating = True

End Sub

Je vais m'expliquer plus clairement.

J'ai une fichier avec des colonnes A,B,C,D,E et F et des lignes A1,A2,A3,A4,A5 et A6. Dans chaque colonne il y a un filtre qui renvoit "yes" ou "no" suivant un critère. ce qui veut dire que la ligne A1 peut avoir en colonne A "yes" et en colonnes B "no" puis en C "yes" et peut-être en D "no".

Mon but est de garder les lignes dont au moins une fois la valeur "yes" se trouve (si elle se trouve deux ou trois fois c'est pareil) donc pas la même occasion supprimer toutes les autres lignes dont la valeur "yes" n'est pas présente au moins une fois.

OB

bonjour,

dans ce cas je t'ai déjà donné la solution , voir message de 11:55. le fait que tu mettes activecell dans ton code suppose que tu sélectionnes une cellule du tableau avant de lancer la macro. tu peux remplacer activecell par range("A3") si tu veux éviter de devoir faire cette sélection.

J'ai joint le fichier en question.

Si tu vas dans la colonne "N" et que tu mets comme filtre seulement "yes", tu verras une multitude de lignes avec comme valeur "yes" dans ce filtre.

Moi je veux garder toutes les lignes avec ce "yes" et ceci dans toute ma feuille de calcul, sans avoir à appliquer de filtre car si une ligne comporte un "yes" et ce quelque soit la colonne dans laquelle on peut appliquer le filtre "yes", elle m'intéresse, si la même ligne comporte deux fois "yes" à deux endroits différents, elle m'intéresse aussi. Par contre une ligne sans aucun "yes" ne m'intéresse point.

Pour l'instant les deux macro ne me donne pas le résultat recherché.

J'espère que c'est plus clair maintenant.

10fichier-test.xlsx (598.67 Ko)
Rechercher des sujets similaires à "insertion colonne partir certaine"