Sub CopierVersMiseEnCommun()
Dim wsSource As Worksheet
Dim wsDest As Worksheet
Dim lastRow As Long
Dim i As Long
Dim destRow As Long
Dim missingData As Boolean
Dim PASSWORD As String
Dim valeurCol11 As Double
Dim valeurCol12 As Double
Dim reponse As VbMsgBoxResult
' Définir les feuilles source et destination
Set wsSource = ThisWorkbook.Sheets("Encodage")
Set wsDest = ThisWorkbook.Sheets("Mise en commun")
PASSWORD = "manu01" ' Mot de passe pour protéger/déprotéger
' Déprotéger la feuille "Mise en commun"
wsDest.Unprotect PASSWORD:=PASSWORD
' Vérification si les cellules B1, D1, F1, B2 et D2 sont remplies
If wsSource.Range("B1").Value = "" Or wsSource.Range("D1").Value = "" Or wsSource.Range("F1").Value = "" _
Or wsSource.Range("B2").Value = "" Or wsSource.Range("D2").Value = "" Then
MsgBox "Veuillez remplir toutes les cellules en jaune, merci !", vbExclamation
Exit Sub
End If
' Vérification des colonnes B et C
missingData = False
For i = 5 To 20
If Trim(wsSource.Cells(i, 3).Value) <> "" And Trim(wsSource.Cells(i, 2).Value) = "" Then
missingData = True
Exit For
End If
Next i
If missingData Then
MsgBox "Veuillez remplir la durée, merci ! ", vbExclamation
Exit Sub
End If
' Trouver la dernière ligne non vide dans la feuille destination
lastRow = wsDest.Cells(wsDest.Rows.Count, 1).End(xlUp).Row
destRow = lastRow + 1 ' Première ligne vide dans la feuille de destination
' Copier les données fixes
wsDest.Cells(destRow, 1).Value = wsSource.Range("J1").Value
wsDest.Cells(destRow, 2).Value = wsSource.Range("F1").Value
wsDest.Cells(destRow, 3).Value = wsSource.Range("D1").Value
wsDest.Cells(destRow, 4).Value = wsSource.Range("B1").Value
wsDest.Cells(destRow, 5).Value = wsSource.Range("D2").Value
wsDest.Cells(destRow, 6).Value = wsSource.Range("D26").Value
wsDest.Cells(destRow, 10).Value = wsSource.Range("A22").Value
wsDest.Cells(destRow, 11).Value = wsSource.Range("F2").Value
wsDest.Cells(destRow, 12).Value = wsSource.Range("B2").Value
wsDest.Cells(destRow, 13).Value = wsSource.Range("J4").Value
wsDest.Cells(destRow, 17).Value = wsSource.Range("D33").Value
wsDest.Cells(destRow, 8).Value = wsSource.Range("C33").Value
' Calcul de la colonne 14
If IsNumeric(wsDest.Cells(destRow, 12).Value) And IsNumeric(wsDest.Cells(destRow, 11).Value) Then
valeurCol12 = wsDest.Cells(destRow, 12).Value ' Valeur de la colonne 12
valeurCol11 = wsDest.Cells(destRow, 11).Value * 24 ' Conversion de l'heure en heures
If valeurCol11 <> 0 Then
wsDest.Cells(destRow, 14).Value = valeurCol12 / valeurCol11
Else
wsDest.Cells(destRow, 14).Value = "Division par zéro"
End If
Else
wsDest.Cells(destRow, 14).Value = "Erreur de données"
End If
' Calculs supplémentaires pour les colonnes 15 et 16
wsDest.Cells(destRow, 15).Value = Year(wsDest.Cells(destRow, 1).Value) & "-" & WorksheetFunction.IsoWeekNum(wsDest.Cells(destRow, 1).Value)
wsDest.Cells(destRow, 16).Value = Year(wsDest.Cells(destRow, 1).Value) & "-" & Month(wsDest.Cells(destRow, 1).Value)
' Début de la boucle pour copier les valeurs conditionnellement
For i = 5 To 20
If Trim(wsSource.Cells(i, 2).Value) <> "" Or Trim(wsSource.Cells(i, 3).Value) <> "" Then
' Trouver la prochaine ligne vide dans la colonne G
destRow = wsDest.Cells(wsDest.Rows.Count, 7).End(xlUp).Row + 1
' Copier toutes les données associées sur la même ligne
wsDest.Cells(destRow, 1).Value = wsSource.Range("J1").Value ' Date
wsDest.Cells(destRow, 2).Value = wsSource.Range("F1").Value ' Machine
wsDest.Cells(destRow, 3).Value = wsSource.Range("D1").Value ' Opérateur
wsDest.Cells(destRow, 4).Value = wsSource.Range("B1").Value ' Autre info
wsDest.Cells(destRow, 5).Value = wsSource.Range("D2").Value ' Donnée additionnelle
wsDest.Cells(destRow, 6).Value = wsSource.Range("D26").Value ' Autre donnée fixe
wsDest.Cells(destRow, 7).Value = wsSource.Cells(i, 1).Value ' Colonne G (donnée variable de la boucle)
wsDest.Cells(destRow, 9).Value = wsSource.Cells(i, 2).Value ' Colonne I (donnée variable de la boucle)
wsDest.Cells(destRow, 10).Value = wsSource.Range("A22").Value ' Info supplémentaire
wsDest.Cells(destRow, 11).Value = wsSource.Range("F2").Value
wsDest.Cells(destRow, 12).Value = wsSource.Range("B2").Value
wsDest.Cells(destRow, 13).Value = wsSource.Range("J4").Value
wsDest.Cells(destRow, 17).Value = wsSource.Range("D33").Value
wsDest.Cells(destRow, 8).Value = wsSource.Range("C33").Value ' Donnée additionnelle
' Calcul de la colonne 14
If IsNumeric(wsDest.Cells(destRow, 12).Value) And IsNumeric(wsDest.Cells(destRow, 11).Value) Then
valeurCol12 = wsDest.Cells(destRow, 12).Value ' Valeur de la colonne 12
valeurCol11 = wsDest.Cells(destRow, 11).Value * 24 ' Conversion de l'heure en heures
If valeurCol11 <> 0 Then
wsDest.Cells(destRow, 14).Value = valeurCol12 / valeurCol11
Else
wsDest.Cells(destRow, 14).Value = "Division par zéro"
End If
Else
wsDest.Cells(destRow, 14).Value = "Erreur de données"
End If
' Calculs supplémentaires pour les colonnes 15 et 16
wsDest.Cells(destRow, 15).Value = Year(wsDest.Cells(destRow, 1).Value) & "-" & WorksheetFunction.IsoWeekNum(wsDest.Cells(destRow, 1).Value)
wsDest.Cells(destRow, 16).Value = Year(wsDest.Cells(destRow, 1).Value) & "-" & Month(wsDest.Cells(destRow, 1).Value)
End If
Next i
' Nettoyer le presse-papiers
Application.CutCopyMode = False
' Imprimer la plage A1:J27 de la feuille "Encodage" avant d'effacer les données
With wsSource
.PageSetup.PrintArea = "A1:J27" ' Définir la zone d'impression
.PageSetup.Orientation = xlLandscape ' Orientation paysage
.PageSetup.Zoom = False
.PageSetup.FitToPagesWide = 1 ' Ajuster à 1 page en largeur
.PageSetup.FitToPagesTall = 1 ' Ajuster à 1 page en hauteur
' Imprimer directement
.PrintOut
End With
' Afficher une boîte de dialogue pour demander à l'utilisateur s'il a fini
reponse = MsgBox("Avez-vous terminé ?", vbQuestion + vbYesNo, "Confirmation")
' Vérifie la réponse
If reponse = vbYes Then
' Effacer toutes les données
wsSource.Range("B1, B2, D1, F1, D2").ClearContents
wsSource.Range("B5:H20").ClearContents
wsSource.Range("A22").MergeArea.ClearContents
MsgBox "Ok", vbInformation, "Encodage terminé et imprimé, merci !"
wsSource.Protect PASSWORD:=PASSWORD
wsDest.Protect PASSWORD:=PASSWORD
ThisWorkbook.Save
ThisWorkbook.Close
Else
' Effacer toutes les données sauf B1 et D1
wsSource.Range("B2, F1, D2").ClearContents
wsSource.Range("B5:H20").ClearContents
wsSource.Range("A22").MergeArea.ClearContents
MsgBox "Ok.", vbInformation, "Encodage terminé et imprimé, merci !"
End If
' Protéger à nouveau les feuilles
wsSource.Protect PASSWORD:=PASSWORD
wsDest.Protect PASSWORD:=PASSWORD
' Sauvegarder le fichier
ThisWorkbook.Save
End Sub