Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

[VBA] chercher la colonne selon son contenu

  • Initiateur de la discussion Initiateur de la discussion Anthonymctm
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Anthonymctm

XLDnaute Occasionnel
Rebonjour le Forum,

J'ai fait une petite macro qui me permet de supprimer les lignes dont la cellule en B est égal à un texte.
VB:
  Dim p As Range, plage As Range
    
    Set plage = Range("B:B")
    With plage
        For Each cel In plage.Cells
            If cel = "AD-DEBUT" Or cel = "HNONP" Then If p Is Nothing Then Set p = cel Else Set p = Union(p, cel.MergeArea)
        Next
    End With
  p.EntireRow.Delete

Sauf que l'information qui est en B ne sera pas forcément en B.
J'ai besoin de remplacer B par une variable qui sera trouvée selon ce qui est indiqué dans la ligne A.

La macro doit s'appliquer sur les ligne dont le titre de la colonne est "Code OF".

exemple : si Code OF est en E1
alors ce sera comme si le code était Set plage = Range("E:E")

Je n'ai pas besoin de trouver cette variable à chaque exécution de la boucle, juste à chaque lancement de la macro.
 
Bon.. Je m'en sors pas ^^'

J'ai essayé de coupler les deux bout de code et je pense que rien ne va :'D

Après je suis pas fou en vba 😵

VB:
Sub Macro1()
Dim Nomfichier As Name

chemin = ActiveWorkbook.Path
 Sheets("Temps salariés").Copy

        Sheets("Temps salariés").SaveCopyAs Filename:=chemin + "\" + Left(Nomfichier, InStrRev(Nomfichier, ".") - 1) + " - Temps salariés" + ".xls"
  
End Sub
 
Re,

A la vue de votre code, j'abandonne le "SaveCopyAs" 😕.

Essayez ce code commenté:
VB:
Sub Macro1()
Dim Nomfichier, chemin
   chemin = ThisWorkbook.Path     'chemin du classeur actuel
   If Right(chemin, 1) <> "\" Then chemin = chemin & "\"    's'il n'y a pas d'antislash à la fin du chemin, on en rajoute un (cas d'un classeur sous la racine)
   Nomfichier = ThisWorkbook.Name   'nom du classeur
   Nomfichier = Left(Nomfichier, InStrRev(Nomfichier, ".") - 1)      'nom du classeur sans l'extension
   Nomfichier = chemin & Nomfichier & " - Temps salariés" & ".xls"    'nom du fichier pour la sauvegarde
   Sheets("Temps salariés").Copy    'création d'un nouveau classeur avec la feuille "Temps salariés"
   Application.ActiveWorkbook.Close True, Nomfichier     'on referme le classeur en sauvegardant le nouveau classeur
End Sub

NOTA : Je vous conseille de ne pas utiliser le + pour concaténer dans votre code VBA.
Utilisez plutôt la & (et commercial) pour concaténer. Ça peut préserver d'erreurs "introuvables" dans un code.

Ex: Vous voulez concaténer 1 et 2 pour trouver 12
Dim x as string, y as string
x= 1 + 2 renverra "3"
y = 1 & 2 renverra "12"
On a vite fait de faire ce qu'on ne voulait pas faire!
 
Dernière édition:
C'est noté pour le & ! 🙂

J'avais pas compris en fait la mécanique de modifié ligne après ligne la meme variable (nomfichier).
Le je vois ou tu veux en venir avec ta ligne left.

Bon du coup ça fonctionne très bien.
J'ai rajouté un deuxième groupe de ligne pour le deuxième onglet.
J'ai du rajouter une varibale du coup, à moins qu'on puisse la réinitialiser ?

Edit pendant que j'écris ce message.. : En fait elle est réinitialisée avec le
VB:
Nomfichier = ThisWorkbook.Name

Du coup j'ai simplement fait ça
Code:
Sub Macro1()
Dim Nomfichier, chemin
   chemin = ThisWorkbook.Path     'chemin du classeur actuel
   If Right(chemin, 1) <> "\" Then chemin = chemin & "\"    's'il n'y a pas d'antislash à la fin du chemin, on en rajoute un (cas d'un classeur sous la racine)
   Nomfichier = ThisWorkbook.Name   'nom du classeur
   Nomfichier = Left(Nomfichier, InStrRev(Nomfichier, ".") - 1)      'nom du classeur sans l'extension
   Nomfichier = chemin & Nomfichier & " - Temps salariés" & ".xlsx"    'nom du fichier pour la sauvegarde
   Sheets("Temps salariés").Copy    'création d'un nouveau classeur avec la feuille "Temps salariés"
   Application.ActiveWorkbook.Close True, Nomfichier     'on referme le classeur en sauvegardant le nouveau classeur

   Nomfichier = ThisWorkbook.Name   'nom du classeur
   Nomfichier = Left(Nomfichier, InStrRev(Nomfichier, ".") - 1)      'nom du classeur sans l'extension
   Nomfichier = chemin & Nomfichier & " - Temps machine" & ".xlsx"    'nom du fichier pour la sauvegarde
   Sheets("Temps machine").Copy    'création d'un nouveau classeur avec la feuille "Temps salariés"
   Application.ActiveWorkbook.Close True, Nomfichier     'on referme le classeur en sauvegardant le nouveau classeur

End Sub

Merci merci merci 😀
 
Un autre tout petit point, au début de ma premiere macro, je veux faire un coller en A1

Code:
Sheets(1).Select
    Range("A1").Select
    ActiveSheet.Paste

Et j'aimerais ajouter une petite vérification que le presse papier est aps vide pour éviter d'avoir une erreur genre

Code:
If PressePapier non vide Then MsgBox "Erreur : Pas de données copiées": Exit Sub
 
Re,

Voir la fonction IsClipboardEmpty() ICI qui renvoie Vrai si le presse-papier est vide et False sinon.

VB:
Declare Function CountClipboardFormats Lib "user32" () As Long

Function IsClipboardEmpty() As Boolean
   IsClipboardEmpty = (CountClipboardFormats = 0)
End Function
 
Ok je vois la fonction tu la mets à l'extérieur de la macro ou à l'intérieur ?
Et la ligne de délcaration ?
et là ligne de vérification tu l'a mets comme ça
VB:
 If CountClipboardFormats = False Then MsgBox "Erreur : Pas de données copiées": Exit Sub
 
Salut mapomme,

Je reviens sur ce sujet concernant le dernier sujet qu'on a abordé : le test du presse papier.

Tu pourrais répondre à mon message 36 stp, je sais pas comment utiliser ta fonction 😕


Edit : Ok j'avais pas vu que t'avais mis un lien. J'ai compris qu'il fallait que je mette le declare fonction dans un autre module. J'ai rajouté PtrSafe parceque ej suis en 64bits, et dans mon code je le teste de cette façon
VB:
If IsClipboardEmpty = True Then MsgBox "Erreur : Pas de données copiées": Exit Sub
Quand c'est vide c'est valeur à True et j'ai compris que l'appel de la fonction se faisait avec IsClipboardEmpty et pas CountClipboardFormats comme j'avais mis initialement.

Là ça fonctionne, merci 🙂
 
Dernière édition:
Bonjour, petite question d'optimisation.
J'ai associé plusieurs bout de code trouvés sur internet pour copié tout les lignes de temps machines et les coller après la dernière ligne de temps salariés.

Mais mon code n'est pas beau, je pense qu'on peut tout résumer sur une seul ligne ou deux
VB:
With Worksheets("Temps machine")
    Set oRng = Range(.Range("A1"), .Cells(.Cells.Rows.Count, 10).End(xlUp)) 'selectionne tout jusqu'à la 10eme colonne
End With
oRng.Copy Sheets("Temps salariés").Cells(Rows.Count, 1).End(xlUp)(2) 'on copy/colle tout à la dernière ligne

Surtout que je ne me sert de oRng que ici

Edit : J'ai compris comment fonctionne le With dans ce genre de cas : il se met avant chaque "."

j'ai donc réussi à le mettre sur une seule ligne mais je crois que finalement c'est moins propre ^^'
Code:
Range(Worksheets("Temps machine").Range("A1"), Worksheets("Temps machine").Cells(Rows.Count, 10).End(xlUp)).Copy Sheets("Temps salariés").Cells(Rows.Count, 1).End(xlUp)(2)
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
7
Affichages
223
  • Question Question
Microsoft 365 worksheet_change
Réponses
29
Affichages
563
Réponses
5
Affichages
312
Réponses
4
Affichages
243
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…