[COLOR=DarkSlateGray][B]Option Explicit
Dim rs As Range, rd As Range
Dim TabLignes() As Variant, TabNC() As Variant
Dim i As Integer, j As Integer
Dim Msg As String
Dim FlgErr As Boolean
'---------------------------------------------'
Sub archivage()
Msg = "" [COLOR=DarkOrange]'(Si vous voulez absolument utiliser des variables globales, il faut les gérer !)[/COLOR]
TabLignes = Array(4, 9) [COLOR=DarkOrange]'Avec Array(4, 5), vous ne traitez que les lignes 4 et 5.
' Cette façon de faire vous oblige à modifier le code chaque fois que le nombre
' de lignes à traiter change. Est-ce bien raisonnable ?[/COLOR]
TabNC = Array("G", "H", "I", "J", "K", "L", "M", "N")
[COLOR=DarkOrange]' Pour la suite : un programme n'est pas un paquet d'instructions en vrac.
' L'ordre dans lequel on les dispose a un petit peu d'importance...[/COLOR]
With Sheets("feuil1")
For i = TabLignes(0) To TabLignes(1) [COLOR=DarkOrange]' Et non LBound(TabLignes) To UBound(TabLignes)
' qui renvoie toujours 0 To 1[/COLOR]
FlgErr = False
If .Range("F" & i).Value = "X" Then
For j = LBound(TabNC) To UBound(TabNC)
If .Range(TabNC(j) & i).Value = "" Then
If Not FlgErr Then FlgErr = True: Msg = "Critères: " & .Range("B" & i).Value & " Manque: "
Msg = Msg & " " & .Range(TabNC(j) & "2").Value
End If
Next j
If FlgErr Then Msg = Msg & vbLf [COLOR=DarkOrange]' Ici, et pas deux ou trois lignes plus loin...[/COLOR]
End If
Next i
If Msg = "" Then
Application.ScreenUpdating = False [COLOR=DarkOrange]' C'est mieux ici qu'ailleurs.[/COLOR]
For i = TabLignes(0) To TabLignes(1)
If .Range("F" & i).Value = "X" Then
Set rd = Sheets("feuil2").Range("A65536").End(xlUp).Offset(1, 0)
Set rs = .Range("I" & i).Resize(1, 7)
rs.Copy
rd.PasteSpecial xlValues
rd.PasteSpecial xlFormats
End If
Next i
With Application
.CutCopyMode = False
.ScreenUpdating = True
End With
Msg = "sauvegardées" [COLOR=DarkOrange]' Rien à voir avec Msg = MsgBox("sauvegardées", vbOKOnly, "Information")[/COLOR]
End If
End With
MsgBox Msg, vbOKOnly, "Information"
End Sub[/B][/COLOR]