Copier une feuille et obtenir la feuille résultante de l'objet?
Est-il facile/court façon d'obtenir de l'Excel.objet de feuille de calcul de la nouveau feuille que vous obtenez lorsque vous copiez une feuille de calcul?
ActiveWorkbook.Sheets("Sheet1").Copy after:=someSheet
Il s'avère que le .Copie de la méthode retourne un Booléen à la place d'un objet de feuille de calcul. Sinon, j'aurais pu faire:
set newSheet = ActiveWorkbook.Sheets("Sheet1").Copy after:=someSheet <-- doesn't work
Donc, j'ai écrit quelques 25 lignes de code pour obtenir l'objet (liste de toutes les feuilles avant de la copier, de la liste de toutes les feuilles après, et comprendre que l'on est dans la dernière liste seulement. Tous très longue dans VBA), mais je suis à la recherche d'une plus élégant, plus court de solution.
- Êtes-vous de la copie vers un nouveau classeur, ou dans le même classeur?
- dans le même classeur
- "Si vous ne spécifiez pas que ce soit Avant ou Après, Microsoft Excel crée un nouveau classeur qui contient la feuille copiée." -- msdn.microsoft.com/en-us/library/ff837784.aspx. Donc, spécifiez avant ou après, et si oui, pourquoi êtes-vous eu des problèmes?
- Je ne utilisez un
after:=
j'avais oublié mon code pour le rendre plus court, et il n'était pas au courant de l'implication (qui n'est pas vraiment pertinent, en fait). J'ai édité ma question. - Bien sûr, il est pertinent, voir @Tim réponse.
- yep, je comprends maintenant... 🙂
Vous devez vous connecter pour publier un commentaire.
Je crois que j'ai enfin cloué cette question - c'est l'été me rend fou, aussi! Il aurait vraiment été sympa si MS fait Copier retourner un objet de feuille, de même que la méthode Add...
Le truc, c'est l'indice qui VBA alloue une nouvelle feuille copiée est pas déterminé... comme d'autres l'ont noté, cela dépend beaucoup de feuilles masquées. En fait, je pense que l'expression Feuilles(n) est en fait interprété comme "le n-ième visible de la feuille". Donc, sauf si vous écrivez une boucle de test de chaque feuille de la propriété visible, à l'aide de ce code est lourde de danger, à moins que le classeur est protégé de sorte que les utilisateurs ne plaisante pas avec les feuilles de propriété visible. Trop dur...
Ma solution à ce dilemme est:
index des Fiches.Count-1
Voici mon code qui semble maintenant être à l'épreuve des balles...
Dans mon cas, j'ai eu quelque chose comme ceci (H indiquant une feuille masquée)
1... 2... 3(H)... 4(H)... 5(H)... 6... 7... 8(H)... 9(H)
.Copie D'Après:=.Draps(2) crée une nouvelle feuille AVANT la prochaine
VISIBLE de la feuille c'est à dire, il est devenu le nouvel indice 6. PAS à l'indice 3, comme vous vous en doutez.
Espère que ça aide 😉
After:=.Sheets(Sheets.Count)
vous collezBefore:=.Sheets(1)
. PuisSet Sh = .sheets(1)
fonctionnera toujours, que certains autres feuilles sont cachés ou pas; dès que la feuille de copier/coller est visible, bien sûr.Une autre solution que j'ai utilisée serait de copier la feuille à un endroit où vous savez que son index, aka première. De là, vous pouvez facilement avoir une référence pour tout ce dont vous avez besoin, et après que vous pouvez vous déplacer librement à l'endroit où vous voulez.
Quelque chose comme ceci:
Mise à JOUR:
set
déclaration.Je me rends compte de ce post est de plus d'un an, mais je suis venu ici à la recherche d'une réponse à la même question concernant la copie des feuilles et des résultats inattendus causés par les feuilles masquées. Aucune de vraiment adapté à ce que je voulais principalement en raison de la structure de mon classeur. Essentailly il a un très grand nombre de feuilles et de ce qui est affiché est entraînée par un utilisateur sélection de la fonctionnalité spécifique, en plus de l'ordre du visible feuilles est importnat pour moi donc je n'ai pas envie de jouer avec ceux-ci. Donc, ma solution a été de compter sur Excelle par défaut de convention de nommage d'une copie de feuilles, et explicitement renommer la nouvelle feuille par son nom. L'exemple de Code ci-dessous (en aparté, mon classeur a 42 feuilles et seulement 7 sont visibles en permanence, et la
after:=Sheets(Sheets.count)
mettre ma feuille copiée dans le milieu de la 42 feuilles, en fonction de ce que les feuilles sont visibles à la fois.De toute façon, posté juste au cas où il soit utile à quelqu'un d'autre
Mis à jour avec les suggestions de Daniel Labelle:
Pour gérer les éventuelles feuilles masquées, faire de la feuille source visible, de le copier, d'utiliser le
ActiveSheet
méthode renvoie la référence à la nouvelle feuille, et de réinitialiser les paramètres de visibilité:Cela devrait être un commentaire en réponse à @TimWilliams, mais c'est mon premier post, donc je ne peux pas commenter.
C'est un exemple de problème @RBarryYoung mentionné, liées à feuilles masquées. Il y a un problème lorsque vous essayez de mettre votre copie d'après la dernière feuille et la dernière feuille est caché. Il semble que, si la dernière feuille est caché, il conserve toujours l'indice le plus élevé, de sorte que vous besoin de quelque chose comme
Situation similaire lorsque vous essayez de copier avant de caché première feuille.
Il est exact que des feuilles de calcul masquées cause de la nouvelle feuille de calcul de l'indice de non-séquentiel de chaque côté de la feuille de calcul source. J'ai trouvé que Rachel la réponse de travaux si vous êtes à la copie avant de. Mais vous auriez à régler si vous êtes à la copie après.
Une fois que le modèle est visible et copié, le nouvel objet de feuille de calcul est tout simplement le ActiveSheet si vous copiez la source avant ou après.
Comme une préférence, vous pouvez le remplacer:
"Set newSheet = .La précédente" avec "Set newSheet = Application.ActiveSheet".
Espérant que cela sera utile à certains d'entre vous.
J'ai essayé de créer un générique fiable "wrapper" pour la feuille.Méthode de copie à des fins de réutilisation à travers de multiples projets depuis des années.
J'ai essayé plusieurs approches ici et j'ai trouvé que Mark Moore, la réponse à être une solution fiable dans tous les scénarios. C'est à dire l'un à l'aide du "Modèle (2)" nom pour identifier la nouvelle feuille.
Dans mon cas, aucune solution à l'aide de la "ActiveSheet méthode" a inutiles que, dans certains cas, la cible classeur a été dans un non-Active ou cachés Classeur.
De même, certains de mes Classeurs ont caché des feuilles mélangées avec visible feuilles dans différents endroits; au début, au milieu, à la fin; et c'est pourquoi j'ai trouvé les solutions à l'aide de l'Avant: et Après: options aussi peu fiable en fonction de l'ordre du visible et du caché des feuilles, le long de avec le facteur supplémentaire lors de la feuille source est cachée aussi.
Donc après plusieurs ré-écrit, j'ai fini avec la fonction wrapper suivant:
REMARQUE: Même cette solution permet d'avoir des problèmes si la source de la fiche Nom est plus que de 27 caractères, comme le maximum de nom de la feuille est de 31, mais c'est généralement sous mon contrôle.
Basé sur Trevor Norman méthode, j'ai développé une fonction pour copier une feuille et renvoie une référence à la nouvelle feuille.
Code:
Ce sera toujours insérer la feuille copiée à la fin du classeur de destination.
Après cela, vous pouvez faire toutes les démarches, renomme, etc.
Utilisation:
Ou si vous souhaitez que le comportement de l'interface pour être plus semblable à la méthode de Copie (avant/après), vous pouvez utiliser:
Comme déjà mentionné ici, le copier/coller de la feuille la plus à gauche (indice = 1), puis l'affecter à une variable, puis de le déplacer où vous le souhaitez. Le collage de la Feuille de
Before
signifie que vous n'avez pas besoin de vérifier et éventuellement révéler toute la feuille.Je ne suis pas en mesure de tester ce droit maintenant, mais je ne vois pas pourquoi cela ne fonctionnerait pas. 🙂
Vieux post, mais n'est pas sûre de faire réapparaître les feuilles ou l'ajout de suffixes pour les noms.
C'est mon approche: