Insertion de colonne à partir d'une certaine colonne Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
P
Pablito
Membre habitué
Membre habitué
Messages : 146
Appréciations reçues : 2
Inscrit le : 2 novembre 2017
Version d'Excel : 2013 FR

Message par Pablito » 2 novembre 2017, 14:54

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
h
h2so4
Passionné d'Excel
Passionné d'Excel
Messages : 8'836
Appréciations reçues : 334
Inscrit le : 16 juin 2013
Version d'Excel : 365 UK Windows 10

Message par h2so4 » 2 novembre 2017, 15:40

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
P
Pablito
Membre habitué
Membre habitué
Messages : 146
Appréciations reçues : 2
Inscrit le : 2 novembre 2017
Version d'Excel : 2013 FR

Message par Pablito » 3 novembre 2017, 08:47

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
Avatar du membre
dhany
Passionné d'Excel
Passionné d'Excel
Messages : 7'083
Appréciations reçues : 698
Inscrit le : 3 octobre 2017
Version d'Excel : 2007 FR

Message par dhany » 3 novembre 2017, 10:30

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.  :wink:

Si ce n'est pas ça, je laisse la suite au très sulfureux h2so4.
NB : formule chimique de l'acide sulfurique : devinez...  ::D

:btres:

@ 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:lol:   c'est peut-être pour ça que tes codes
VBA sont toujours aussi percutants:lol: :lol: :lol:

Cordialement
 
P
Pablito
Membre habitué
Membre habitué
Messages : 146
Appréciations reçues : 2
Inscrit le : 2 novembre 2017
Version d'Excel : 2013 FR

Message par Pablito » 3 novembre 2017, 11:04

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).
Avatar du membre
dhany
Passionné d'Excel
Passionné d'Excel
Messages : 7'083
Appréciations reçues : 698
Inscrit le : 3 octobre 2017
Version d'Excel : 2007 FR

Message par dhany » 3 novembre 2017, 11:11

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
 
Avatar du membre
eriiic
Passionné d'Excel
Passionné d'Excel
Messages : 9'252
Appréciations reçues : 361
Inscrit le : 7 février 2010
Version d'Excel : 2010fr

Message par eriiic » 3 novembre 2017, 12:07

Bonjour,

effacer ligne à ligne est très lent.
Filtre sur les lignes à supprimer et supprime toutes les lignes visibles d'un coup.
eric
En essayant continuellement, on finit par réussir.
Donc plus ça rate, plus on a de chances que ça marche.
(les Shadoks)

En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
P
Pablito
Membre habitué
Membre habitué
Messages : 146
Appréciations reçues : 2
Inscrit le : 2 novembre 2017
Version d'Excel : 2013 FR

Message par Pablito » 3 novembre 2017, 12:15

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
Avatar du membre
dhany
Passionné d'Excel
Passionné d'Excel
Messages : 7'083
Appréciations reçues : 698
Inscrit le : 3 octobre 2017
Version d'Excel : 2007 FR

Message par dhany » 3 novembre 2017, 12:34

@ 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.
Avatar du membre
eriiic
Passionné d'Excel
Passionné d'Excel
Messages : 9'252
Appréciations reçues : 361
Inscrit le : 7 février 2010
Version d'Excel : 2010fr

Message par eriiic » 3 novembre 2017, 13:20

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
En essayant continuellement, on finit par réussir.
Donc plus ça rate, plus on a de chances que ça marche.
(les Shadoks)

En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message