Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 Problème lors création tab (array) VBA (ne pas prendre en comptes les cellules vides)

piga25

XLDnaute Barbatruc
Bonjour,

Comment faire pour que le code de changement de semaine (ImportWeek et RecordSeizureWeek) du module 2 ne prenne pas en compte les cellules vides de la plage tabNom ("B7 "& "B" finnom). Je pense que le problème provient de là.

Pour bien faire, lors d'un changement de semaine en plus ou en moins, il faudrait que les données soient renseignées sur chaque feuille correspondante et uniquement à partir de la colonne K sauf pour la feuille Prévisionnel qui elle doit commencer à partir de la colonne C (module 4)


Pour l'ajout de feuilles et cela automatiquement avec l'ajout d'un nouveau nom, j'ai modifié le code pour que cela prenne en compte les noms en collonne A. Je ne sais pas si c'est la bonne solution. J'aurai aimé resté uniquement sur la colonne B afin que l'ensemble des codes soit similaire.

Je joins les deux versions de fichier
Fichier simple ligne (celui la fonctionne) Lien: https://www.excel-downloads.com/threads/copie-ligne-sous-deux-conditions-vba.20025344/ merci à Vgendron
Fichier double ligne (celui la pose problème)
 

Pièces jointes

  • Fichier simple ligne.xlsm
    99.5 KB · Affichages: 17
  • Fichier double ligne.xlsm
    233.5 KB · Affichages: 22
Dernière édition:

piga25

XLDnaute Barbatruc
Bonjour,

Pour le Array TabNom qui détermine la variable i:
De B7 à B11 j'ai: 1rférence - 1nom - vide - 1nom - vide etc...

J'ai essayé avec IsEmpty mais le array ne semble pas le prendre en compte.
Autrement peut être avec pair et impair, comme les noms seront toujours sur des lignes pairs. Mais là, je coince également.
VB:
Sub ImportWeek(NumSemaine As Integer)
Dim TabNom() As Variant
Dim TabDay() As Variant
    Application.ScreenUpdating = False
    Application.EnableEvents = False
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("K8").Offset(1, 0).Resize(UBound(TabNom) - 1, 71).ClearContents
    .Range("K7").Offset(UBound(TabNom) + 2).Resize(UBound(TabNom) - 1, 71).ClearContents
    .Range("K8").Offset(UBound(TabNom) + 2).Resize(UBound(TabNom) - 1, 71).ClearContents

'on set TabDay (permet de garder les lignes d'entete SUN, MON....
    TabDay = .Range("B7").Resize(UBound(TabNom) * 2 + 1, 72).Value
    '.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) * 2 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)
                TabDay(i, j) = .Cells(NumLigne, j) 'première ligne dans morning
                TabDay(i + 1, j) = .Cells(NumLigne, j + 127) 'seconde ligne dans morning
                TabDay(i + UBound(TabNom, 1) + 1, j) = .Cells(NumLigne, j + 64) 'première ligne dans afternoon
                TabDay(i + 1 + UBound(TabNom, 1) + 1, j) = .Cells(NumLigne, j + 190) 'seconde ligne dans afternoon
            Next j
        End With
    End If
Next i
'on colle le résultat dans la feuille
With WsS
    .Range("B7").Resize(UBound(TabDay, 1), UBound(TabDay, 2)) = TabDay
End With
    Application.ScreenUpdating = True
    Application.EnableEvents = True
End Sub
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Comment ça Empty n'est pas pris en compte dans un Array ?
If IsEmpty(.Cells(NumLigne, j).Value) doit détecter une cellule vide.
If IsEmpty(.Cells(NumLigne, j)) peut être pas, parce que pour moi .Cells(NumLigne, j) c'est Object/Range et non pas Empty
Si on charge les Range.Value dans des tableaux il n'y a pas de problème IsEmpty(T(L, C)) le détecte toujours bien.
 

piga25

XLDnaute Barbatruc
Bonjour Dranreb, le forum
J'ai du mal m'expliquer, je fais peut être fausse route.
Pour moi, lorsque je charge le tableau (TabNom), j'ai une cellule sur deux qui est vide.
Comment faire pour que la suite du code me prenne juste que les cellule avec les noms de manière que cela puisse me renseigner les feuilles correspondantes tout en sachant (et c'est la la difficulté pour moi) que chaque nom correspondant à deux lignes qui elles doivent ce mettre à la suite dans la feuille concernée par le nom.
Est-ce que le code actuelle, lorsque la variable i arrive sur une cellule vide, donc ne trouve pas la feuille correspondante, passe à la ligne suivante ou il y a un nom et ainsi de suite.
Ce n'est pas simple à expliquer, d'ou mon interrogation avec IsEmpty pour charger uniquement le tableau (TabNom) sans les cellules vides.
 

piga25

XLDnaute Barbatruc
Bonjour Dranreb, le forum

problème de TabNom
Normalement c'est résolu. Comme la feuille n'existe pas (cellule vide) cela passe à la suivante (fonction :feuillexiste).
Je me suis cassé la tête pour rien!!!!!!!!!!!!!!!!!


Pour bien faire, lors d'un changement de semaine en plus ou en moins, il faudrait que les données soient renseignées sur chaque feuille correspondante et uniquement à partir de la colonne K
Actuellement les données vont bien sur chaque feuille et revienne au bon endroit. Le problème c'est qu'elles ne sont pas exactement ou je voudrais sur les feuilles destinations (les feuilles individuelles)
Par contre, lors de la récupération, elles reviennent bien au bon endroit.


Pour la feuille Prévisionnel qui elle doit commencer à partir de la colonne C.
Je vais laisser cette feuille comme elle est, c'est dire comme les autres.
Le mieux, je pense c'est d'en créer une uniquement pour récupérer les données des colonne s C à J (seizure week)


Pour l'ajout de feuilles et cela automatiquement avec l'ajout d'un nouveau nom, j'ai modifié le code pour que cela prenne en compte les noms en colonne A. Je ne sais pas si c'est la bonne solution. J'aurai aimé resté uniquement sur la colonne B afin que l'ensemble des codes soit similaire.
Je vais tenter d'y apporter la solution de Dranreb avec : If IsEmpty(.Cells(NumLigne, j).Value)

Le fichier avec mes modifs
 

Pièces jointes

  • Fichier double ligne v2.xlsm
    287 KB · Affichages: 15

piga25

XLDnaute Barbatruc
Bonjour le forum

Merci JB
J'avais déjà regardé votre site et plus particulièrement ces pages là.
Je n'ai pas vu comment adapter vos codes à mon cas. Désolé, ou je m'y prends mal.

Pour info, j'utilise régulièrement vos exemples pour m'informer et apprendre. Merci.
 

piga25

XLDnaute Barbatruc
Bonjour le forum,

cela doit être simple mais pas moyen d'y arriver.
J'ai toujours un décalage

La partie du code qui pose problème est doit se situer entre
For i
....
Next i

et cela pour importWeek et RecordSeizureWeek

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, 61).Value
    '.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)
                TabDay(i, j) = .Cells(NumLigne, j + 2) 'première ligne dans morning
                TabDay(i + 1, j) = .Cells(NumLigne, j + 73) 'seconde ligne dans morning
                TabDay(i + UBound(TabNom, 1) + 1, j) = .Cells(NumLigne, j + 144) 'première ligne dans afternoon
                TabDay(i + 1 + UBound(TabNom, 1) + 1, j) = .Cells(NumLigne, j + 215) '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("J7").Resize(UBound(TabNom) * 2 + 1, 61).Value
    '.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)
                .Cells(NumLigne, j + 1) = TabDay(i, j) 'première ligne morning
                .Cells(NumLigne, j + 72) = TabDay(i + 1, j) 'seconde ligne morning
                .Cells(NumLigne, j + 144) = TabDay(i + UBound(TabNom, 1) + 1, j) 'première ligne afternoon
                .Cells(NumLigne, j + 215) = TabDay(i + 1 + UBound(TabNom, 1) + 1, j) 'seconde ligne afternoon
            Next j
        End With
    End If
Next i
End Sub
 

ChTi160

XLDnaute Barbatruc
Bonsoir piga25
Bonsoir le Fil , le Forum
Je ne sais pas si cela a de l importance.
Mais tu determines la derniere ligne des noms ,situes en Colonne B apparemment , en recherchant la derniere ligne a partir de la colonne A ligne 7 et pourquoi en descendant(attention cellules vides) pourquoi pas
FinNom = Range(“B”& Rows.count).End(xlup).Row
Bonsoir
Jean marie
 

piga25

XLDnaute Barbatruc
Bonjour Chti160, le forum
Oui, pourquoi pas faire une recherche sur les lignes entières non vide, la seule vide est située à la fin du tableau Morning et les autres après le tableau Afternoon.
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…