Sub Extraction()
Dim DerLig As Long, DerLigD As Long, Lig As Long
Dim FlagCréée As Boolean
Dim VDateEnvoi As Date, VDateLig As Date
Dim VPathFic As String
' Initialisation des variables
FlagCréée = False
' Avec ce classeur et la feuille 1
With ThisWorkbook.Sheets("Feuil1")
' Récupérer la dernière date d'envoi
VDateEnvoi = .Range("IQ4").Value
' Récupérer la dernière ligne du tableau
DerLig = .Range("A" & Rows.Count).End(xlUp).Row
' Pour chaque ligne de la 8 à la dernière
For Lig = 8 To DerLig
'VDateLig = .Range("IQ" & Lig)
On Error Resume Next
VDateLig = .Range("IQ" & Lig)
' Si pas de date de modif, mettre une date bidon de début du siècle
If Err.Number <> 0 Then
VDateLig = "01/01/1900"
End If
On Error GoTo 0
' Si la date de la ligne est supérieur à la date du dernier envoi
' On procède à la copie de la ligne
If VDateLig > VDateEnvoi Then
' La première fois, créer un feuille Extraction
If FlagCréée = False Then
FlagCréée = True
Sheets.Add after:=Sheets(Sheets.Count)
ActiveSheet.Name = "Extraction"
' Activer la première feuille
.Activate
End If
' Récupérer la ligne de destination
DerLigD = Sheets("Extraction").Range("A" & Rows.Count).End(xlUp).Row
' Copier la ligne mise à jour
.Rows(Lig).Copy Destination:=Sheets("Extraction").Range("A" & DerLigD + 1)
End If
Next Lig
' L'analyse des ligne est terminée
' On exporte la feuille Extraction et on la sauvegarde
If FlagCréée = True Then
'/// modif pmo ///
Sheets("Extraction").Activate
Call Cryptage_Decryptage
'////////////////
Sheets("Extraction").Move
VPathFic = ThisWorkbook.Path & "\Extraction du " & Format(Now(), "yyyymmdd") & ".xls"
ActiveWorkbook.SaveAs VPathFic
ActiveWorkbook.Close
End If
' On mémorise la date d'extraction
.Range("IQ4").Value = Now()
End With
End Sub
'///////////////////////////////////////////////////////////////////
'/// Les fonctions CRYPTE et DECRYPTE ont été développées par AV ///
Function CRYPTE(Chaine$) As Variant
Dim x$
Dim i&
For i = 1 To Len(Chaine)
x = x & Format(Asc(Mid(Chaine, i, 1)), "000") & "08"
Next
CRYPTE = x
End Function
Function DECRYPTE(Chaine$) As Variant
Dim x$
Dim i&
For i = 1 To Len(Chaine) Step 5
x = x & Chr(Mid(Chaine, i, 3))
Next
DECRYPTE = x
End Function
'///////////////////////////////////////////////////////////////////
Sub Cryptage_Decryptage()
Dim CHAR_RECONNAISSANCE As String
Dim S As Worksheet
Dim R As Range
Dim var
Dim A$
Dim Col&
Dim Lig&
Dim i&
Dim j&
Dim Decryptage As Boolean
Dim bool As Boolean
CHAR_RECONNAISSANCE = Chr(159) & Chr(131) & Chr(138) '= ŸƒŠ
Set S = ActiveSheet
'--- Si il existe un donnée en IV65536, on sort ---
If Not IsEmpty(S.Range("iv65536")) Then
[iv65536].Select
MsgBox prompt:="Une donnée existe dans la cellule ''IV65536''.", _
Buttons:=vbOKOnly + vbCritical, Title:="Programme stoppé (trop long à exécuter)"
Exit Sub
End If
'--- Recherche de la dernière ligne et de la dernière colonne de la plage ---
For i& = xlByRows To xlByColumns
Set R = S.Cells.Find(what:="*", after:=[iv65536], SearchOrder:=i&, SearchDirection:=xlPrevious)
If Not R Is Nothing Then
A$ = R.Address
Do
Set R = S.Cells.FindNext(R)
Loop While Not R Is Nothing And R.Address <> A$
If i& = xlByRows Then Lig& = R.Row
If i& = xlByColumns Then Col& = R.Column
End If
Next i&
'--- On sort si la feuille est vide ---
If Lig& = 0 Then
MsgBox "La feuille ''" & S.Name & "'' est vide."
Exit Sub
End If
'--- Est-ce déjà encrypté ? ---
Set R = S.Range(S.Cells(1, 1), S.Cells(Lig&, Col&))
var = R.Formula
For i& = 1 To Lig&
For j& = 1 To Col&
If Left(CStr(var(i&, j&)), Len(CHAR_RECONNAISSANCE)) = CHAR_RECONNAISSANCE Then
Decryptage = True
bool = True
Exit For
End If
If bool Then Exit For
Next j&
Next i&
'--- Mise en tableau des données ---
For i& = 1 To Lig&
For j& = 1 To Col&
If Not IsEmpty(var(i&, j&)) And var(i&, j&) <> "" Then
If Decryptage Then
var(i&, j&) = CStr(DECRYPTE(CStr(Mid(var(i&, j&), Len(CHAR_RECONNAISSANCE) + 1))))
Else
var(i&, j&) = CHAR_RECONNAISSANCE & CStr(CRYPTE(CStr(var(i&, j&))))
End If
End If
Next j&
Next i&
'/// modif pmo ///
'--- Inscription dans la feuille Extraction ---
'Set S = Sheets.Add
Set S = ActiveSheet 'pour votre cas particulier (la feuille Extraction est déja existante)
'/////////////////
'°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
'°°° Ne pas utiliser la montée du tableau dans un Range en °°°
'°°° un seul coup, à cause de l'erreur 1004 pouvant survenir °°°
'°°° (limite de caractères à 912 par exemple). °°°
'°°° Enumérer, plutôt, chaque item du tableau. °°°
'°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
Application.ScreenUpdating = False
For i& = 1 To Lig&
For j& = 1 To Col&
S.Range(S.Cells(i&, j&), S.Cells(i&, j&)) = var(i&, j&)
Next j&
Next i&
Application.ScreenUpdating = True
End Sub