Sub Macro1()
Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
Dim OD As Object 'déclare la variable OD (Onglet Destination)
Dim CA As String 'déclare la variable CA (Chemon d'Accès)
Dim CS As Workbook 'déclare la variable CS (Classeur Source)
Dim NCS As String 'déclare la variable NCS (Nom du Classeur Source)
Dim O As Object 'déclare la variable O (Onglet)
Dim DEST As Range 'déclare la variable DEST (Cellule de DESTination)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim PL As Range 'déclare la variable pPL (PLage)
Dim CEL As Range 'déclare la variable R (CELlule)
Dim LI As Integer 'déclare la variable LI (LIgne)
Set CD = ThisWorkbook 'définit le classeur de destination CD
'-------> à adapter
Set OD = CD.Sheets("données") 'définit l'onglet de destination OD
CA = CD.Path & "C:\Users\Desktop\Fichier B.xlsx" 'définit le chemin d'accès
'-------> à adapter
NCS = "fichier A.xlsx" 'définit la nom du classeur source NCS
On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la aligne suivante)
Set CS = Workbooks(NCS) 'définit le classeur source CS (génère une erreur si le classeur n'est pas ouvert)
If Err <> 0 Then 'condition : si une erreur a été générée
Err.Clear 'supprime l'erreur
Workbooks.Open (CA & NCS) 'ouvrle le classeur NCS
Set CS = ActiveWorkbook 'définit le classeur source CS
End If 'fin de la condition
For Each O In CS.Sheets 'boucle sur tous les onglets O du classeur source
'définit la cellule de destination DEST (A1, si A1 est vide, sinon la seconde cellule vide de la colonne A de l'onglet OD)
Set DEST = IIf(OD.Range("A1").Value = "", OD.Range("A1"), OD.Cells(Application.Rows.Count, 1).End(xlUp).Offset(1, 0))
O.UsedRange.Copy DEST 'copie la plage éditée de l'onglet et la colle dans dest
Next O 'prochain onglet de la boucle
DL = OD.Cells(Application.Rows.Count, 15).End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne 15 (=O) de l'onglet OD
Set PL = OD.Range("O2:O" & DL) 'définit la plage PL
For Each CEL In PL 'boucle sur toutes les cellules CEL de la palge PL
If CEL.Value = "" Or CEL.Value = "#" Or CEL.Value = 0 Then LI = CEL.Row: Exit For 'si la cellule est vide ou vaut zéro ou contient "#", définit la variable LI : sort de la boucle
Next CEL 'prochaine cellule de la boucle
OD.Range(OD.Cells(LI, 1), OD.Cells(DL, 1)).EntireRow.Delete 'supprime les lignes concernée
End Sub