Problème de REF

Bonjour,

Mon problème est le suivant. J'ai un fichier test qui va générer à l'aide du premier onglet les données issues d'un deuxième fichier ( fichier autre test ) pour les onglets supports + foyers et armoire de mon fichier test. Le but est que la colonne appelé numéro de l'onglet support + foyers soit copier et coller dans l'onglet consommation. Hors lors de la copie du fichier et de ( l'exécution de la macro ), un problème de référence est créer dans l'onglet consommation ( surement du au fait que je supprime l'intégralité des données lorsque je charge le fichier autre test).

Pouvez vous m'aider svp?

9autre-test.xlsx (14.52 Ko)
10test.xlsm (36.29 Ko)

Bonjour,

En effet, c'est probablement la raison. Il faudrait faire un collage spécial en valeurs pour éviter ce problème.

Cdlt,

Bonjour,

Pouvez vous m'en dire plus sur ce " collage spécial " svp ?

Je ne souhaite pas passer par une macro, de nombreuse colonnes de l'onglet support + foyers vont être copié et collé dans d'autre onglet, ici je n'en ai mis que une pour l'exemple et la confidentialité

Cdlt

Je n'ai pas regardé vos fichiers, avec le code qui concerne la copie ce serait plus simple.

Quand on copie, on colle souvent normalement mais on a aussi la possibilité de coller seulement les valeurs, les formules ou les formats via ce fameux collage spécial. Sur excel, il faut faire clic droit/collage spécial ou accueil/la petite flèche sous coller/collage spécial. Ca dépend peut-être de la version.

Dans le code, on a par exemple :

rangeSource.copy
rangeDestination.paste

(un collage normal) qui devient :

rangeSource.copy
rangeDestination.pastespecial paste:=xlpastevalues

un collage valeurs.

Sachant qu'en général, cette méthode dans le code est plus lente et moins simple que reprendre directement les valeurs :

rangeDestination.value = rangeSource.value

Cdlt,

Bjr,

J'utilise déja un collage spécial dans mon code :

Application.ScreenUpdating = True

Dim pl As Range, sh As Worksheet
For Each sh In Worksheets(Array("Armoires", "Supports + Foyers"))
Set pl = sh.Cells.SpecialCells(xlCellTypeConstants, xlTextValues)
If Not pl Is Nothing Then
Cells(Rows.Count, Columns.Count).Copy
pl.PasteSpecial Paste:=xlPasteAll, Operation:=xlAdd
End If
Next sh
Fin:
End Sub

Le problème vient du fait que lorsque je fais référence a une des cellules de l'onglet Supports + foyers dans Consommation et que je charge un fichier de données, il y a un probleme de ref

Vu que mon fichier utilise des tableaux, je n'ai pas la possibilité de copier coller l'intégralité d'une colone d'un tableau ??

Je n'ai pas bien compris mais beaucoup de choses sont possibles...

S'il vous plait, il faut mettre le code entre les balises </> du ruban d'icônes :

Sub clem()

Dim pl As Range, sh As Worksheet

For Each sh In Worksheets(Array("Armoires", "Supports + Foyers"))
    Set pl = sh.Cells.SpecialCells(xlCellTypeConstants, xlTextValues)
    If Not pl Is Nothing Then
        Cells(Rows.Count, Columns.Count).Copy
        pl.PasteSpecial Paste:=xlPasteAll, Operation:=xlAdd
    End If
Next sh

Fin:
End Sub

Ici votre plage de destination est la plage des cellules constantes. Je pense que c'est déjà un problème. Je ne sais pas si le pastespecial xlpasteall se distingue de la méthode paste...

Bjr,

Ma macro est fonctionnel ce n'est pas le problème.. Je pense que vous n'avez pas fait le test avec mes fichiers de départ et vous avez mal compris mon problème. Je me trompe peut etre.. J'ai un problème de REF dans les cellules de mon onglet consommation lorsque je génère le premier fichier. Cela n'est pas lié a la macro. Je cherche a résoudre ce probleme de REF

Merci de votre aide en tout cas !

Cdlt

Oui, en effet, je n'ai pas regardé les fichiers...

A première vue, cette ligne (et les autres du même genre) sont en cause :

If Not wbdest.Sheets("Armoires").ListObjects(1).DataBodyRange Is Nothing Then wbdest.Sheets("Armoires").ListObjects(1).DataBodyRange.Delete

Il y a suppression de la source.

Il existe plusieurs solutions...

La possibilité qui me vient à l'esprit serait de mettre à jour la formule dans Consommation. Il serait bien de nommer les tableaux dans le code et manuellement le tableau de Consommation.

Ensuite, cette ligne :

range("Consommation").cells(1,1).formulalocal = "=INDEX(Armoires[NUMERO], LIGNE()-LIGNE(Consommation)+1)"

pourrait permettre de mettre à jour les formules en colonne 1.

Et vous avez bien un collage total qui plus est :

rng.Copy Destination:=wbdest.Sheets("Armoires").ListObjects(1).DataBodyRange.Cells(i, 1)

Cdlt,

J'ai regardé le code et l'ai modifié (car j'ai l'impression que c'est moi qui vous avais aidé à le construire^^). Je ne l'ai pas testé cependant :

Sub Rectangleàcoinsarrondis1_Cliquer()

Dim wsDestArmoires As Worksheet, wsDestFoyers As Worksheet, wsSourceArmoires As Worksheet, wsSourceFoyers As Worksheet
Dim sfilename$

With Application.FileDialog(msoFileDialogOpen) 'Affiche la fenêtre "Ouvrir"
    .Filters.Clear 'Efface les filtres existants.
    .Filters.Add "Classeurs Excel", "*.xls; *.xlsx; *.xlsm" 'Définit une liste de filtres pour le champ "Type de fichiers".
    .Show
    If Not .SelectedItems.Count = 1 Then Exit Sub 'On sort si aucun fichier n'a été sélectionné
    sfilename = .SelectedItems(1)
End With

'feuilles destination (classeur exécutant)
With ThisWorkbook
    Set wsDestArmoires = .Sheets("Armoires")
    Set wsDestFoyers = .Sheets("Supports + Foyers")
End With

'feuilles sources et mises à jour tableaux
With Workbooks.Open(sfilename)
    Set wsSourceArmoires = .Sheets("Armoire")
    Set wsSourceFoyers = .Sheets("Support + Foyer")
    Application.ScreenUpdating = False
    Call MettreAJour(wsSourceArmoires, wsDestArmoires, "Armoires")
    Call MettreAJour(wsSourceFoyers, wsDestFoyers, "Foyers")
    .Close False
    Application.ScreenUpdating = True
End With

End Sub

Sub MettreAJour(wsSource As Worksheet, wsDest As Worksheet, NomTableau$)

Dim t, sRef$, nvl&

With wsDest
    With wsSource.Range("A1").CurrentRegion
        sRef = .Address
        t = .Offset(2, 0).Resize(.Rows.Count - 2, .Columns.Count) ' pour enlever le super titre fusionné et l'en-tête
    End With
    If .ListObjects.Count = 0 Then .ListObjects.Add(Source:=.Range(sRef), xllistobjecthasheaders:=xlYes).Name = NomTableau
    With .Range(NomTableau)
        nvl = .Rows.Count - Application.CountBlank(.Columns(1)) + 1
        .Cells(nvl, 1).Resize(UBound(t), UBound(t, 2)) = t
    End With
End With

End Sub

J'ai déjà essayé de le débarrasser des variables superflues. J'ai factorisé le code de la mise à jour en créant une macro paramétrée qui est appelée suivant certains paramètres justement (feuille source, feuille destination et nom du tableau sur la feuille de destination).

Ici, on ajoute les données à la suite des autres !

Sinon, j'ai effacé le code de fin pour l'instant car je n'ai pas bien compris. Que cherchez-vous à faire ?

Et aussi, j'ai renommé les tableaux structurés !

11test.xlsm (31.85 Ko)

Cdlt,

Bonjour,

Mille merci pour votre aide et l'intérêt que vous m'accorder. Je comprend votre code et effectivement il est plus trivial.

Pour la dernière partie de mon code, elle était inutile, surement un test que j'avais oublier d'enlever.

Le code ne gère pas la dimension du tableau pour l'onglet consommation. Il faudrait qu'il soit de la meme dim que le tableau suppports + foyers finalement. Je ne sais pas comment gérer cela

Cependant, le fait que les données se mettent à la suite des autres est un problème mais on verra plus tard pour le résoudre ce n'est vraiment pas la priorité.

Merci a vous

Ah oui, pour l'instant, le code ignore l'onglet consommation. Et qu'est-ce qu'il faudrait faire alors avec cet onglet consommation précisément ?

Pour les données qui viennent à la suite, que faut-il ? Remplacer les précédentes données ? Ce serait presque plus simple.

Bjr,

Je veux que la colonne numéro de l'onglet supports + foyers soit totalement coller dans la colonne numéro de l'onglet consommation. C'est ce mécanisme que je n'arrive pas a faire.. Le traitement des infos de mon fichier est basé sur cela par la suite, et cette opération sera repeter plein de fois pour différentes colones de supports + foyers

Merci a vous

Je me permet de vous relancer,

Cdlt

Bonjour,

Oui, tu as raison de me relancer . Je n'ai pas bien compris : il faut copier la colonne Numéro de Supports dans Consommation. A la suite des données ? Faut-il le faire également pour Armoires ? Il faut le faire dans la macro MettreAJour ou indépendemment ?

Bonjour,

Dans l'onglet supports + foyers, je veux copier les données de la colonne numéro de supports pour la coller dans l'onglet consommation dans la colonne numéro. Peu importe si c'est dans la maccro ou non, cette manipulation sera effectué pour de nombreuses colonnes mais dans un premier temps juste pour celle la. Merci de votre aide

Re,

Si, ça importe quand même un peu. Certaines façons permettent d'optimiser le code s'il est indifférent selon la page...

Si je pose des questions, c'est pour comprendre et proposer un code adéquat mais vu que tu n'y réponds pas, je propose un ultime essai (partie à modifier) selon ce que je comprends, à savoir écraser les données :

'début
With Workbooks.Open(sfilename)
    Set wsSourceArmoires = .Sheets("Armoire")
    Set wsSourceFoyers = .Sheets("Support + Foyer")
    Application.ScreenUpdating = False
    Call MettreAJour(wsSourceArmoires, wsDestArmoires, "Armoires")
    Call MettreAJour(wsSourceFoyers, wsDestFoyers, "Foyers")
    range("Conso[NUMERO]").clearcontents
    range("Conso[NUMERO]").resize(range("Foyers[NUMERO]").count).value = range("Foyers[NUMERO]").value
    .Close False
    Application.ScreenUpdating = True
End With
'fin

Il faut renommer le tableau5 "Conso" et sa colonne numéro "NUMERO". Il est préférable d'avoir des noms de colonnes identiques d'un tableau à l'autre si ces colonnes traitent la même information.

Cdlt,

Bonjour,

Finalement il faudrait que la taille du tableau consommation soit de la même taille que celui généré dans l'onglet Support + Foyers ( via le fichier de données )

Cdlt

Rechercher des sujets similaires à "probleme ref"