XL 2016 Décalage entre un ARRAY et la copie dans la feuille

piga25

XLDnaute Barbatruc
Bonjour,

Je préfère créer une nouvelle discussion car le motif est différent.
Toujours sur mon projet (lien: https://www.excel-downloads.com/thr...endre-en-comptes-les-cellules-vides.20025841/ )
je suis confronté à ces codes qui me copie un tableau pour le repartir sur certaine feuille et cela lors du changement de semaine. En opération inverse, il récupère sur les feuilles et me réinscrit les données sur le tableau tous cela au moyen d'ARRAY.
Mon problème:
- La première colonne n'est pas prise en compte. Je ne sais pas pourquoi.
- La répartition sur les feuilles ne correspond pas.

Pour essayer de mieux comprendre, j'ai annoté les codes, mais sans résultat probant.
VB:
Sub ImportWeek(NumSemaine As Integer)
Dim TabNom() As Variant
Dim TabDay() As Variant
Dim TabWeek() As Variant

Set WsS = Worksheets("Seizure week")
With WsS
    FinNom = .Range("A7").End(xlDown).Row
    TabNom = .Range("B7:B" & FinNom).Value

'on commence par effacer Morning et Afternoon
    .Range("K7").Offset(1, 0).Resize(UBound(TabNom) - 1, 71).ClearContents
    .Range("K7").Offset(UBound(TabNom) + 2).Resize(UBound(TabNom) - 1, 71).ClearContents

'on set TabDay (permet de garder les lignes d'entete SUN, MON....
    TabDay = .Range("K7").Resize(UBound(TabNom) * 2 + 1, 62).Value
    'TabDay doit correspondre à la plage : ligne 7, colonne K soit 11 à la dernière ligne d'afternoon colonne k, colonne BU soit colonne n°73
    'mais comme cela demarre à la colonne n°11, pour avoir le bon tableau il faut 62
    '.Range("B7").Resize(UBound(TabNom) * 2 + 1, 72).Select 'pour voir ce qui vient d'etre mis dans le tableau
  
    NumLigne = NumSemaine + 3 'ligne de destination dans les feuilles "NomX"
End With

'on Remplit le tableau à partir des feuilles
For i = LBound(TabNom, 1) + 1 To UBound(TabNom, 1)
    If FeuilleExiste(CStr(TabNom(i, 1))) Then
        With Sheets(TabNom(i, 1))
            For j = LBound(TabDay, 2) + 1 To UBound(TabDay, 2)
                'J doit commencer à la colonne 2 pour cells(NumLigne,2)
                TabDay(i, j) = .Cells(NumLigne, j + 1) 'première ligne dans morning
                'J doit commencer à la colonne 65 pour cells(NumLigne,65)
                TabDay(i + 1, j) = .Cells(NumLigne, j + 65) 'seconde ligne dans morning
                'J doit commencer à la colonne 128 pour cells(NumLigne,128)
                TabDay(i + UBound(TabNom, 1) + 1, j) = .Cells(NumLigne, j + 128) 'première ligne dans afternoon
                'J doit commencer à la colonne 191 pour cells(NumLigne,191)
                TabDay(i + 1 + UBound(TabNom, 1) + 1, j) = .Cells(NumLigne, j + 191) 'seconde ligne dans afternoon
              
            Next j
        End With
    End If
Next i
'on colle le résultat dans la feuille
With WsS
    .Range("K7").Resize(UBound(TabDay, 1), UBound(TabDay, 2)) = TabDay
End With
End Sub

Sub RecordSeizureWeek(NumSemaine As Integer)
Dim TabNom() As Variant
Dim TabDay() As Variant

Set WsS = Worksheets("Seizure week")
With WsS 'dans la feuille "Seizure week"
    FinNom = .Range("A7").End(xlDown).Row 'dernière ligne du nom (en partant de B7 vers le bas (jusqu'à la première ligne vide -en fin de morning)
    TabNom = .Range("B7:B" & FinNom).Value 'on met la liste des noms dans un tablo VBA
  
    'on met tout le tableau (Morning + Afternoon) dans un tablo VBA
    TabDay = .Range("K7").Resize(UBound(TabNom) * 2 + 1, 62).Value
    'TabDay doit correspondre à la plage : ligne 7, colonne K soit 11 à la dernière ligne d'afternoon colonne k, colonne BU soit colonne n° 73
    'mais comme cela demarre à la colonne n°11, pour avoir le bon tableau il faut 62
  
    '.Range("B7").Resize(UBound(TabNom) * 2 + 1, 72).Select 'pour voir ce qui vient d'etre mis dans le tableau
  
    NumLigne = NumSemaine + 3 'correspondance avec les feuilles Noms...
  
    'on efface Morning et Afternoon
    .Range("K8").Resize(UBound(TabNom) - 1, 71).ClearContents
    .Range("K7").Offset(UBound(TabNom) + 2).Resize(UBound(TabNom) - 1, 71).ClearContents
End With
    'on recopie le tableau dans les feuilles
For i = LBound(TabNom, 1) + 1 To UBound(TabNom, 1)
    If FeuilleExiste(CStr(TabNom(i, 1))) Then
        With Sheets(TabNom(i, 1))
            For j = LBound(TabDay, 2) + 1 To UBound(TabDay, 2)
                'J doit commencer à la colonne 2 pour cells(NumLigne,2)
                .Cells(NumLigne, j + 1) = TabDay(i, j) 'première ligne morning
                'J doit commencer à la colonne 65 pour cells(NumLigne,65)
                .Cells(NumLigne, j + 65) = TabDay(i + 1, j) 'seconde ligne morning + 1 pour seconde ligne
                'J doit commencer à la colonne 128 pour cells(NumLigne,128)
                .Cells(NumLigne, j + 128) = TabDay(i + 1 + UBound(TabNom, 1), j) 'première ligne afternoon + 1 pour la ligne entre morning et afternoon
                'J doit commencer à la colonne 191 pour cells(NumLigne,191)
                .Cells(NumLigne, j + 191) = TabDay(i + 2 + UBound(TabNom, 1), j)  'seconde ligne afternoon + 2 pour la ligne entre morning et afternoon et seconde ligne
            Next j
        End With
    End If
Next i
End Sub
 

Pièces jointes

  • Fichier double ligne v4.xlsm
    236.3 KB · Affichages: 14

piga25

XLDnaute Barbatruc
Bonjour,

J'ai trouvé l'erreur
Dans la ligne For j = LBound(TabDay, 2) + 1 To UBound(TabDay, 2)
il y à + 1 en trop d'ou le décalage de la première colonne.

Pour répartition dans les feuilles, il suffit d'enlever 1 au nombre de colonne.
 

Discussions similaires

Réponses
0
Affichages
137

Statistiques des forums

Discussions
312 112
Messages
2 085 409
Membres
102 884
dernier inscrit
Macarena