|
|
|
|
Bonjour,
J'aimerai pouvoir archiver des lignes de données reprenant des dates et des heures entre les colonnes "J" et "V" de mon tableau de la feuille "A" (Composé des colonnes de "A" à "AH").
La condition de déclenchement de l'archivage est que une heure soit inscrite dans la colone "U".
L'archivage doit s'effectuer sur la feuille "B", chaque ligne archivée doit s'inscrire l'une en dessous de l'autre à partir de la donnée "A5".
Je connais assez bien excel mais malheureusement pas son système de programmation! Pourriez-vous m'aider svp.
Merci,
Alain
Bonjour,
|
Bonjour,
Option Explicit
'
Const FeuilleTrav = "FeuilleA"
Const FeuilleArch = "FeuilleB"
'
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Region As Range, Plage As String, Position As Long, Temps As Date
' N'affiche pas le traitement
Application.ScreenUpdating = False
' Trouve dernière ligne
Position = Range("J2:J65535").End(xlDown).Row
' Recherche intersection valide
Set Region = Application.Intersect(Range("U1:U" & Position), Target)
If Region Is Nothing Then
'MsgBox "La cible n'est pas dans la plage visé."
Else
' MsgBox "La cible est dans la plage visé."
' Si temps plus grand que 8 heures
Temps = Target.Value
If (Temps > "08:00:00") Then
' Désactive évènement
Application.EnableEvents = False
' Défini plage à copier
Plage = "J" & Target.Row & ":V" & Target.Row
' Sélectionne la plage à copier
Range(Plage).Select
' Avec la sélection
With Selection
' Place dans presse-papier
.Copy
' Appel de fonction
CopieVersArchive
End With
' Désactive le copier/coller
Application.CutCopyMode = False
' Sélectionne la cellule visé
Target.Select
' Détruit la ligne qui a été archivé
Target.EntireRow.Delete
' Réactive les évènement
Application.EnableEvents = True
End If
End If
' Mise à jour de l'affichage activé
Application.ScreenUpdating = True
End Sub
'
Function CopieVersArchive()
' Plage [ J , V ] dans plage [ A , AH ]
' Déclenchement sur condition heure, colonne [ U ]
' Case de départ de stockage Feuille B [ A5 ]
Dim Plage As String, Position As Long
' Défini la pemière ligne libre
Position = Sheets(FeuilleArch).Range("A5:A65535").End(xlDown).Row + 1
Plage = "A" & Position
' Copie les données sur la ligne
Sheets(FeuilleArch).Range(Plage).PasteSpecial
Plage = "A" & (Position + 1)
' Sélectionne la case suivante
Sheets(FeuilleArch).Select
ActiveSheet.Range(Plage).Select
' Retourne à la FeuilleA
Sheets(FeuilleTrav).Select
End Function
'
Ce code fonctionne sous mon environnement, soyez-prudent ! Lupin
|
Bonjour,
|
Bonjour,
|
Re :
|
Bonjour,
Option Explicit
'
Const Cod_Archive = "A"
Const FeuilleTrav = "HKM GMN"
Const FeuilleArch = "Archivage"
'
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Region As Range, Position As Long, Temps As Date
Dim Adresse As String, Plage As String, NbrArc As Long
Dim Valeur As Variant
Application.ScreenUpdating = False
Position = Range("J2:J65535").End(xlDown).Row
Set Region = Application.Intersect(Range("U1:U" & Position), Target)
If Region Is Nothing Then
'MsgBox "La cible n'est pas dans la plage visé."
Else
'MsgBox "La cible est dans la plage visé."
Temps = Target.Value
If (Temps > "08:00:00") Then
Valeur = Range("Ai" & Target.Row).Value
Valeur = Mid(Valeur, (Len(Cod_Archive) + 1))
Valeur = Val(Valeur)
If (Valeur > 0) Then
Valeur = Range("AJ" & Target.Row).Value
Else
Valeur = 0
End If
Application.EnableEvents = False
Plage = "J" & Target.Row & ":V" & Target.Row
Range(Plage).Select
With Selection
.Copy
Adresse = CopieVersArchive(Valeur)
If (Adresse <> "") Then
Range("AJ" & Target.Row).Value = Adresse
Adresse = Mid(Range("Ai" & Target.Row).Value, (Len(Cod_Archive) + 1))
If (Adresse <> "") Then
Range("Ai" & Target.Row).Value = Cod_Archive & (Adresse + 1)
Else
Range("Ai" & Target.Row).Value = Cod_Archive & "1"
End If
Else
Range("AJ" & Target.Row).Value = ""
End If
End With
Application.CutCopyMode = False
ActiveCell.Offset(1, 0).Select
Target.Select
Application.EnableEvents = True
End If
End If
Application.ScreenUpdating = True
End Sub
'
Function CopieVersArchive(ByVal PlgTmp As Variant) As String
Dim Plage As String, Position As Long
Position = Sheets(FeuilleArch).Range("A4:A65535").End(xlDown).Row + 1
If (PlgTmp = 0) Then
Plage = "A" & Position
Else
Plage = PlgTmp
End If
Sheets(FeuilleArch).Range(Plage).PasteSpecial
Plage = "A" & (Position + 1)
Sheets(FeuilleArch).Select
ActiveSheet.Range(Plage).Select
Sheets(FeuilleTrav).Select
If PlgTmp = 0 Then
CopieVersArchive = "A" & Position
Else
CopieVersArchive = PlgTmp
End If
End Function
'
si vous tenter de faire un copier coller sur une cellule de la colonne U l'évènement est déclenché et ça plante, normal il n'y as pas de gestion d'évènement ce qui est très lourd... si vous devez arrêter la macro, vous aurez besoin les évènements seront désactivé, vous aurez besoin de ceci pour réactiver :
Sub ActiveEvenement()
Application.EnableEvents = True
End Sub
'
et pour désactiver le déclenchement des évènements :
Sub DesactiveEvenement()
Application.EnableEvents = False
End Sub
'
Colonne [ AI ] , la lettre A codé dans la constante [ Cod_Archive ] suivi d'un nombre indiquant le nombre de fois archivé. Colonne [ AJ ], adresse (lettrechiffre) de la ligne archivé amusez-vous :-) Lupin |
Bonjour,
|
Re:
Application.EnableEvents = False
il vous faut réactiver les évènements du classeur en utilisant la routine :
Sub ActiveEvenement()
Application.EnableEvents = True
End Sub
'
celle-ci doit être coller dans un module pour être accessible du menu Excel. Menu Excel ->> //Outils/Macro/Macros.../ActiveEvenement Lupin
|
Re:
|
Re:
|
Bonjour,
|
Suite :
|
Bonjours,
|
Bonjour,
|