Pourquoi ai-je des problèmes de l'affectation d'une Gamme à une gamme de Variantes

Je vais avoir quelques problèmes avec certains TRÈS simples lignes de code. Laissez-moi en détail les faits et voir si quelqu'un d'autre peut reproduire ce comportement. Si quelqu'un peut répliquer j'aimerais obtenir une explication de pourquoi cela se produit.

Donc permet moi de commencer avec un très simple ligne de code QUI FONCTIONNE:

Dim arr() As Variant
arr = Range("A1:A10")

ce n'est comme prévu, arr est attribué les Valeurs de A1:A10

maintenant, pourquoi ne pas en faire la ligne suivante de code de travail?

Dim arr() As Variant
arr = WorkSheets("Sheet1").Range("A1:A10")

J'obtiens une Erreur d'Exécution '13' incompatibilité de Type, même si la même gamme a été attribué à la matrice, juste sans la Feuille de calcul de la valeur.

Mais

Dim arr As Variant
arr = Worksheets("Sheet1").Range("A1:A10")

Et

Dim arr() As Variant
arr = Application.Transpose(Application.Transpose(Worksheets("Sheet1").Range("A1:A10")))

FONCTIONNE

Maintenant, avant de vous répondre s'il vous plaît laissez-moi vous donner quelques faits.

Dim arr() As Variant
arr = Worksheets(1).Range("A1:A10")

Ne Fonctionne Pas

et à l'aide de Sheets en place de Worksheets également se donnent tous la même erreur.

J'ai fait sûr que c'est la même feuille que l'actif référencé feuille en utilisant Range("A1:A10").Worksheet.Name Suivant le code de travail et en effet, dit Sheet1 dans la sortie.

Pas d'autres classeurs sont ouverts donc il ne peut pas être référence à un autre classeur.

Maintenant le dernier bout de code ne fait qu'ajouter à ma confusion, car il fonctionne tout à fait!

Dim arr() As Variant
Dim SampleRange As Range

Set SampleRange = Worksheets("Sheet1").Range("A1:A10")
arr = SampleRange

Donc, en utilisant la MÊME GAMME définie de la même façon sur la même feuille fonctionne maintenant quand je l'affecter à une Variable de Portée. et de l'utiliser! Et comme prévu, cela fonctionne à la fois avec le WorkSheets et Sheets fonction indépendamment de la définition de la feuille (je peux utiliser l'index ou le Nom de la feuille de calcul et tous les beaux travaux)

Si ça aide quelqu'un, je suis en train de tester cela avec Excel 2007 sur un ordinateur Windows XP. Je n'ai pas encore testé sur toutes les autres machines, mais j'ai l'intention de tester sur 2003 et 2010 sur Windows 7 et Windows 8, n'ont tout simplement pas eu la chance encore.

Mise à JOUR: Pas sûr à 100% si c'est le même problème qu'avec le tableau, mais à partir d'une faible profondeur de vue, il semble être:

 Range("B1:B3") = Range("A1:A3") 

Le code ci-dessus ne fonctionnera pas, même si A1:A3 est peuplée, les dates, les valeurs numériques, les chaînes, la formule de quoi que ce soit, il va écrire les blancs en B1:B3

Mais

Range("B1:B3").Value = Range("A1:A3").Value

Et

Range("B1") = Range("A1")

ne travail!

Aussi de travail est:

Range("B1:B3") = Application.Transpose(Application.Transpose(Range("A1:A3")))
  • arr = Worksheets(1).Range("A1:A10").Value œuvres
  • Ce n'est pas pour moi, je n'ai également tester avec Value2, rien ne fonctionne tout a été testé, juste oublié que j'ai testé, j'obtiens toujours la même erreur. Incompatibilité de Type, de l'OS et des versino d'excel que vous utilisez?
  • Excel 2003 / Excel 2013, win 8.1.
  • Je pense que cela a quelque chose à voir avec le comportement par défaut de la référence à Range. Souvent Range(X) peut être utilisé pour se référer au contenu de la gamme X. Si nous l'instancier, comme l'ensemble des biens d'une Feuille de calcul, je pense que nous nous y référons codé en dur "de la Gamme-ness" de celui-ci. Cependant, cela n'explique pas pourquoi il à une variable, il contourne. Heureusement, quelqu'un peut venir l'expliquer. Value elle n'en résout, pour moi, de toute façon, si. Win7, XL2010.
  • C'est intéressant, quand vous simplement utilisé arr = Worksheets(1).Range("A1:A10") fait-il? comme le Value propriété est généralement la propriété par défaut utilisé dans VBA lorsqu'une propriété n'est pas spécifiée? Et même si ce n'pourquoi la variable prendre une autre propriété, alors la matrice?
  • Et juste pour être clair... j'ai l'expérience de l'original de votre les problèmes de la même SAUF que quand j'ai ajouter .Value à la fin. Si je le fais, pas d'erreurs dans l'un des tests ci-dessus.
  • Je n'ai aucune idée de pourquoi la seconde méthode ne fonctionne pas lorsque le premier ne. Ce n'est généralement pas comment vous pouvez affecter une plage directement à un tableau cependant: généralement vous déclarer arr comme Variant, et non pas comme un tableau de variants, qui est ce que vous avez ici. En utilisant juste une simple Variante, vous ne verrez pas ce problème. L'ajout de .Value à la fin de votre deuxième méthode résout également le problème, ce doit être quelque chose lié à compter sur la propriété par défaut étant différente entre les deux approches.
  • arr = Worksheets(1).Range("A1:A10") ne fonctionne pas. arr = ActiveSheet.Range("A1:A10") ne fonctionne pas ainsi. Mais `arr = ActiveSheet.Range("A1:A10").Valeur " fonctionne sans aucun problème..je suis confus, parce que .Value doit être la propriété par défaut de Range objet
  • changer Dim arr() As Variant à Dim arr As Variant résout le problème pour moi et arr = Worksheets(1).Range("A1:A10") fonctionne très bien!
  • J'ai assigné le de NOMBREUX de NOMBREUX tableaux dans le passé, tout simplement jamais remarqué ce bug que j'ai généralement toujours Dim et Affecter toutes mes variables au début de tout le code, juste pour la facilité de mise à jour dans le futur, mais juste quelque chose que je jouais avec et remarqué, je pense que j'ai d'abord appris à dim les tableaux d'un an ou deux il ya, basé sur un article de la Puce Pearson. Je vais essayer et le lien de l'article si je peux le retrouver si.
  • est correcte. Retrait (), en laissant Dim arr As Variant va corriger le problème sur le Worksheets... partie. Maintenant, comment faire pour comprendre tout cela. 😀
  • Ouais gradation dans la manière fixe aussi pour moi, pour l'enregistrement de l'article, je parlais de l'été Ici
  • Une AUTRE CHOSE ÉTRANGE: Dim arr() As Variant: arr = Sheet1.Range("A1:A10") bien travailler. Notez que j'ai utilisé arr() avec des crochets
  • Peut-être quelque chose de complètement indépendants, mais lors de l'utilisation de vous code EXACT il a bien fonctionné, mais lors de l'utilisation d'une feuille avec un nom différent, dans mon testin j'ai utilisé de l'Échantillon (première renommé de la feuille, puis a couru votre code et changé seulement la feuille Sheet1 à l'Échantillon, et j'ai obtenu une erreur de compilation.
  • Je vois que la page: je suppose que je n'ai jamais utilisé cette notation, mais vous avez raison, c'est comment Puce est-il...
  • à cette image. Votre fiche a deux noms: pour VBA variable et le nom de l'onglet (entre parenthèses). I. e. si vos feuilles a nom "VBE_intro" (comme sur la photo), vous devez utiliser Sheet1.Range("a1") dans le code VBA. Est-il vrai pour vous? Je veux dire que vous devez utiliser Sheeti correspondant au nom de "l'Échantillon" entre parenthèses pour l'utiliser comme variable VBA
  • Probablement lié à la liaison de la Feuille de calcul de référence comme la liaison tardive (Dim arr() As Variant: Dim sheet As Worksheet: Set sheet = Worksheets("Sheet1"): arr = sheet.Range("A1:A10")) fonctionne très bien. En utilisant VarPtr de lire l'adresse de retour de Range("A1:A10") (et liaison tardive), ils retournent les références de l'objet alors que Worksheets("Sheet1").Range("A1:A10") retourne un objet à l'intérieur d'une variante (décalage de 1==9), qui est probablement la prévention de la Plage->Variante() de conversion.
  • Travaillant à l'extérieur de ce que vous avez dit, je pense que c'est parce que Range n'est pas un membre de la Worksheets classe, mais au lieu de la Worksheet classe, afin d'obtenir le Range variable à partir de feuilles de travail de la classe, excel a déjà pour convertir les paramètres Saisis dans le Worksheets classe de convertir cet objet dans le Worksheet objet qu'il a besoin pour obtenir le Range membre de cet objet. Mais je ne comprends pas, c'est que Si j'utilise le VarType ou TypeName fonction à la fois des représentations qu'ils reviennent tous de la même Range type, donc avec ce que vous dites, il semble
  • que les deux méthodes retournent Range les variables de type, où un autre renvoie la Value bien tandis que l'autre n'a pas, le même raisonnement explique pourquoi, lorsque l'indiquer explicitement la Value Bien travaillé pour à peu près tout le monde. Je suppose que je ne suis pas à un niveau de programmation, alors je peux comprendre le POURQUOI de cela, et c'est exactement pourquoi j'ai posé la question. Je suis à la recherche d'un niveau plus profond de connaissances ici. @simoco tag vous également que vous semblait intéressé comme I.
  • Que tout est Ok, mais je ne comprends pas pourquoi cela fonctionne Dim arr As Variant: arr = Worksheets("Sheet1").Range("A1:A10") mais ce doesen"Dim arr() As Variant: arr = Worksheets("Sheet1").Range("A1:A10")? Note à l'parenthèses après arr()
  • Dang Nab-bits, qui contredit tout ce que j'ai Pensée je viens de comprendre. Parce que clairement, c'EST de retourner la Valeur de la propriété de la Gamme de Classe dans les deux situations.
  • ok, pourquoi cela ne fonctionne pas Dim arr() As Variant: arr = Worksheets("Sheet1").Range("A1:A10"), mais cela fonctionne Dim arr() As Variant: arr = Worksheets("Sheet1").Range("A1:A10").Value (pour moi et pour BK201)? C'est à moi de les confondre, car .Value est par défaut de la propriété..
  • Que je PENSE est expliqué dans mon double commentaire, que, sans indiquer explicitement la vous voulez que le Value Propriété de la Range classe, qu'après qu'excel fait tout le travail de conversion Worksheets("Sheet1") à la Worksheet fonction (notez l'absence de S, parce que, selon la boîte à outils en VBA Range n'EST PAS un membre de WorkSheets) que vous êtes, puis en demandant pour la Range Propriété de la Worksheet classe et c'est EXACTEMENT ce qu'il est de retour, pas une Propriété de la Range classe, mais la Range Objet lui-même. Mais alors que les processus de pensée obtient jeté hors
  • Lorsque vous prenez en compte cela fonctionne Dim arr As Variant: arr = Worksheets("Sheet1").Range("A1:A10")
  • je pense que Tim déjà dit. il y a une différence entre arr As Variant et arr() as Variant. arr As Variant peut contenir des objets. arr() As Variant ne peut pas et ne peuvent donc pas être attribuées à des Objets. suivant cette logique, excel ne peut pas assumer la propriété par défaut Value lors de l'attribution arr = Worsheets("Sheet1").Range("A1:A10") déjà, elle échoue.
  • C'est 100% faux et est avérée fausse par le fait que Dim arr() As Variant : arr = Range("A1:A10") fonctionne sans problèmes, arr() as Variant EST assigné avec des objets et excel NE supposons la propriété par défaut Value lors de l'attribution...
  • j'ai posté une réponse pour vous aider à faire voir mon point de vue. désolé, c'est long à monter dans un commentaire, donc je l'ai posté en tant que réponse.

InformationsquelleAutor user2140261 | 2014-01-27