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?
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:=xlpastevaluesun 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.valueCdlt,
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 SubIci 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.DeleteIl 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 SubJ'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 !
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
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
'finIl 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