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.
Jamais je n'ai dit que ça retournait une plage. J'ai dit que ça retournait le numéro de la colonne.
donc, on peut faire :
VB:
NumCol = application.iferror(application.match("Code OF",rows(1),0),0)
if numcol > 0 then
set plage = columns(numcol)
else
msgbox "Erreur : Pas de colonne 'Code OF'"
exit sub
endif
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
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"
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
On a vite fait de faire ce qu'on ne voulait pas faire!
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
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
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
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.
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 ^^'