Problème Rows.Count

Bonjour à tous,

Je ne sais pas si je pourrais obtenir de réponse sur ce problème mais je tente. J'ai un problème de décalage avec ma Macro. Le trait noir devrait être normalement à la suite (en ligne 23) mais il se met à 2 lignes plus loin à cause de mon code VBA que je met en dessous.

image
Private Sub CommandButton3_Click()

Dim CS As Workbook 'déclare la variable CS (Classeur Source)
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim Listii As String
Dim derLigne As Long
derLigne = Range("A" & Rows.Count).End(xlUp).Row

CommandButton1.BackColor = RGB(166, 166, 166)
Listii = AA

Set CS = ThisWorkbook 'définit le classeur source CS
Set OS = CS.ActiveSheet 'définit l'onglet source OS
On Error Resume Next
Workbooks.Open Filename:= _
"S:\XXXXX.XXXXX.XXX\XXXX\ABC.xlsx" 'ouvre un classeur
Set CD = ActiveWorkbook 'définit le classeur destination CD
Set OD = CD.Worksheets("AZ") 'définit l'onglet destination OD

OS.Range("D49:M53").Copy 'copie la plage D49:M53 de l'onglet source
'colle les valeurs dans la de la première cellule vide de la colonne A de l'onglet destination
OD.Cells(Application.Rows.Count, "A").End(xlUp).Offset(1, 0).PasteSpecial (xlPasteValues)

OD.Range("A2:J2").Select 'cela copie la bande noir grâce à une présente dans ces cellules
    Selection.Copy

OD.Cells(Application.Rows.Count, "A").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteFormats
 OD.Cells(Application.Rows.Count, "A").End(xlUp).Offset(1, 0).FormulaR1C1 = "AA"

    Workbooks("Archivage SRP2").Close True

End Sub

Tout fonctionne la plupart du temps. Le problème survient lorsqu'une ligne du tableau d'origine n'est pas rempli. la formule étant "=SI(E52="";"";O52)", dans ces cas là, le résultat étant égal à "" donc à rien. Ce qui est ce que je souhaite. Je souhaite que dans ces cas là, la case soit vite afin qu'elle ne soit pas prise en compte dans le Rows.Count.

mais lorsque je fais ensuite un copier coller de cela, je ne comprend pas pourquoi Excel décale la bande noir et considère le résultat précédent (donc une case censé être vide car je fais un coller des valeurs) à prendre en compte pour le Rows.Count

Bonjour,

Une cellule visuellement vide mais contenant une formule n'est pas vide. Pour mieux appréhender le comportement de l'instruction ci-dessous :

OD.Cells(Application.Rows.Count, "A").End(xlUp)

Placez vous dans la dernière cellule de la colonne A, et appuyez sur CTRL + FLECHE HAUT. Vous verrez alors où ça vous amène...

Oui ça me met bien sur les cellules à priori vide mais qui ne le sont pas. Y'a t-il une solution pour que Excel considère cette cellule comme vide ?

En changeant peut être quelque chose dans la formule "=SI(E52="";"";O52)". Je voudrais enfaîte que lorsque la condition est vrai, la cellule soit considéré comme vide ou réellement vide

PS : sans rapport avec la problématique initiale, le code simplifié un peu (j'ai retouché la forme, pas le fond) :

Private Sub CommandButton3_Click()

Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim Listii As String, derLigne As Long

On Error Resume Next

derLigne = Range("A" & Rows.Count).End(xlUp).Row 'Utilité ?
CommandButton1.BackColor = RGB(166, 166, 166) 'Utilité ?
Listii = "AA" 'Utilité ?

Set OS = ThisWorkbook.ActiveSheet 'définit l'onglet source OS
Workbooks.Open Filename:="S:\XXXXX.XXXXX.XXX\XXXX\ABC.xlsx" 'ouvre un classeur
With ActiveWorkbook.Worksheets("AZ")
    OS.Range("D49:M53").Copy 'copie la plage D49:M53 de l'onglet source
    'colle les valeurs dans la de la première cellule vide de la colonne A de l'onglet destination
    .Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).PasteSpecial (xlPasteValues)
    .Range("A2:J2").Copy 'cela copie la bande noir grâce à une présente dans ces cellules
    .Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).PasteSpecial (xlPasteFormats)
    .Cells(Rows.Count, "A").End(xlUp).Offset(1, 0) = "AA"
End With
ActiveWorkbook.Close True

End Sub
derLigne = Range("A" & Rows.Count).End(xlUp).Row : il n'a plus d'utilisé

CommandButton1.BackColor = RGB(166, 166, 166) : pas de grande utilisé, juste changé le bouton pendant le clic

Listii = "AA" : le AA se met dans la ligne de la bande noir afin qu'elle soit compté dans le Rows.Count

Oui ça me met bien sur les cellules à priori vide mais qui ne le sont pas. Y'a t-il une solution pour que Excel considère cette cellule comme vide ?

En changeant peut être quelque chose dans la formule "=SI(E52="";"";O52)". Je voudrais enfaîte que lorsque la condition est vrai, la cellule soit considéré comme vide ou réellement vide

Cette formule est-elle réellement nécessaire ? Je vous invite à utiliser un tableau structuré, qui s'arrête à la dernière donnée et évite donc de placer ce type de formule "à l'aveugle", dans l'attente que les autres colonnes soient complétées...

CommandButton1.BackColor = RGB(166, 166, 166) : pas de grande utilisé, juste changé le bouton pendant le clic

Et même après, car la couleur d'origine n'est pas rétablie en fin de macro...

Listii = "AA" : le AA se met dans la ligne de la bande noir afin qu'elle soit compté dans le Rows.Count

Cette variable n'est pas réutilisée par la suite, puisque vous affectez directement le texte "AA". L'instruction peut donc être supprimée.

La formule est nécessaire comme l'Excel est structuré de cette façon. Elle ne le serait peut être pas avec un tableau.

Je n'ai jamais utilisé de tableau avec le VBA. C'est compliqué à prendre en main ? Je souhaite juste copier 1 à 5 lignes par jour et les coller les données dans un fichier d'archive (et qu'elle se mette à la suite évidement)

Je m'en ressers ici du AA : .Cells(Rows.Count, "A").End(xlUp).Offset(1, 0) = "AA"

Je m'en ressers ici du AA : .Cells(Rows.Count, "A").End(xlUp).Offset(1, 0) = "AA"

Du texte "AA" oui, mais de la variable Listii, non...

Concernant l'utilisation des tableaux structurés dans VBA, vous avez quelques exemples sur le lien transmis. Par ailleurs, l'utilisation de ce type d'instruction est compatible avec le tableau structuré :

OD.Cells(Rows.Count, "A").End(xlUp)

Après je n'ai pas bien saisie l'utilisation exacte de votre fichier, dont je ne connais pas non plus la structure. En clair, sans fichier type, j'aurais du mal à apporter une aide plus précise...

Mais je pense que le problème sera toujours le même. la formule sert à afficher la date uniquement si la colonne d'à côté est rentré (donc qu'il y a des données)

Je vais essayer d'enlever un maximum de données afin de le poster

Mais je pense que le problème sera toujours le même. la formule sert à afficher la date uniquement si la colonne d'à côté est rentré (donc qu'il y a des données)

Relisez attentivement l'intérêt du tableau structuré, une ligne sans date n'a pas lieu d'avoir de formule. Dès lors que vous ajoutez des données à la suite du tableau structuré, il se redimensionne et la formule de report de date en question est alors automatiquement étendue sur les nouvelles lignes.

Oui mais le problème, c'est que j'ai besoin de la date dans le fichier d'archive mais également dans le fichier d'origine car il sera également enregistré.

Je veux qu'on que lorsque je rentre des données dans le fichier d'origine, la date se mette à côté

Bonjour tout le monde,

Tris,

Je pense que ce que Pedro22 essaie de t'expliquer, à juste titre, c'est que l'utilisation des tableaux est à tout point de vue préférable (hors rares exceptions).

A moins que ta plage (je n'ai pas ouvert ton fichier) contienne par exemple des formules sans lien logique d'une ligne à l'autre, le tableau s'impose de fait et n'apportera qu'améliorations.

Pour en créer un, ça prend 20 secondes, il faut sélectionner ta plage en entier, aller sur volet Insertion, cliquer sur Tableau, garder choix "avec des en-têtes". Ensuite, tu dois si possible le renommer et tu peux le mettre en forme.

Enfin, afin de faciliter la lisibilité des formules, il serait utile de les ressaisir (edit : juste en 1ère ligne puisqu'elles se propagent aux autres lignes)... Tu verras, c'est magique

Cdlt,

Rechercher des sujets similaires à "probleme rows count"