[VBA] chercher la colonne selon son contenu

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.
 

Anthonymctm

XLDnaute Occasionnel
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 o_O

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
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,

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

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:

Anthonymctm

XLDnaute Occasionnel
Re,

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

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

On a vite fait de faire ce qu'on ne voulait pas faire!
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 :D
 

Anthonymctm

XLDnaute Occasionnel
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
 

Anthonymctm

XLDnaute Occasionnel
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
 

Anthonymctm

XLDnaute Occasionnel
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 :confused:


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:

Anthonymctm

XLDnaute Occasionnel
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)
 

Discussions similaires

Réponses
2
Affichages
147
Réponses
1
Affichages
119

Statistiques des forums

Discussions
312 181
Messages
2 085 997
Membres
103 083
dernier inscrit
SALAHBEN