2009-01-19 9 views
2

J'ai les erreurs suivantes sur la ligne "rTemp.Value = vaTemp". Qu'est-ce que je fais mal ici? Suis-je sur la bonne voie?Comment copier une plage dans un classeur temporaire et y renvoyer une référence avec une fonction vba?

Function CreateTempRange(rSource As range) As range 
    ' Declarations 
    Dim rTemp As range 
    Dim vaTemp As Variant 
    Dim wsTemp As Worksheet 
    Dim wbTemp As Workbook 

    ' Open temp worksheet 
    Set wbTemp = Workbooks.Add 
    Set wsTemp = wbTemp.Worksheets.Add 

    ' Copy range into it and get a reference to the temp range 
    vaTemp = rSource.Value 
    Set rTemp = wsTemp.range("A1").Resize(UBound(vaTemp, 1), UBound(vaTemp, 2)) 
    rTemp.Value = vaTemp 

    ' Return the temp range 
    Set CreateTempRange = rTemp 
End Function 

Remarque: Cette fonction est destinée à être utilisée par d'autres fonctions et non appelée directement à partir d'une cellule.

Répondre

1
Set rTemp = wsTemp.range("A1").Resize(UBound(vaTemp, 1), UBound(vaTemp, 2) 

Il y aura une incompatibilité de type ici ... je ne suis pas sûr que cela ait vraiment du sens. ubound (a, 2) est utilisé pour les tableaux multidimensionnels et non les plages.

Je suppose que vous voulez prendre la valeur dans la cellule spécifiée, puis la copier plusieurs fois en fonction de sa valeur. Est-ce exact?

Espérons que ce qui suit devrait vous donner un exemple à utiliser. Si ce n'est pas le cas, éditez votre message et je verrai si je peux vous aider.

Function CreateTempRange(rSource As Range) As Range 
    '' Declarations 
    Dim rTemp As Range 
    Dim vaTemp As Variant 

    Dim wsTemp As Worksheet 
    Dim wbTemp As Workbook 

    '' Open temp worksheet 
    Set wbTemp = Workbooks.Add 
    Set wsTemp = wbTemp.Worksheets.Add 

    '' Copy range into it and get a reference to the temp range 
    vaTemp = rSource.Value 
    ''Set rTemp = wsTemp.Range("A1").Resize(UBound(vaTemp, 1), UBound(vaTemp, 2)) 

    Dim iTemp As Integer 
    On Error Resume Next 
    iTemp = CInt(vaTemp) 
    On Error GoTo 0 

    If iTemp < 1 Then 
     iTemp = 1 
    End If 
    Set rTemp = wsTemp.Range("A1:A" & iTemp) 
    rTemp.Value = vaTemp 

    '' Return the temp range 
    Set CreateTempRange = rTemp 
End Function 

Sub test() 

    Dim r As Range 
    Dim x As Range 
    Set r = ActiveSheet.Range("A1") 
    Set x = CreateTempRange(r) 

End Sub 
+0

Ma gamme sera une table pas une seule dimension. Je veux juste copier la gamme (lignes et cols) à la feuille de travail temporaire et renvoyer une référence à elle. –

+0

Ah, j'étais très confus ce que tu voulais. Je suppose que cela concerne certaines de vos autres questions. Pouvez-vous poster une question avec plus de détails sur ce que vous essayez d'accomplir globalement avec cette table temporaire et je vais voir si je peux faire quelque chose d'un peu plus utile. –

1
vaTemp = rSource.Value 

Comme vous ne spécifiez pas le paramètre RangeValueDataType à la méthode de la valeur de l'objet Range, il sera par défaut xlRangeValueDefault qui, pour des plages non vides, retourne un tableau de valeurs. Par conséquent, les parties UBound(..., 1) et UBound(..., 2) ont du sens.

Ce serait plus facile:

Function CreateTempRange(rSource As range) As range 
    ' Declarations 
    Dim rTemp As range 
    Dim wsTemp As Worksheet 
    Dim wbTemp As Workbook 

    ' Open temp worksheet 
    Set wbTemp = Workbooks.Add 
    Set wsTemp = wbTemp.Worksheets.Add 

    ' Create new range on that sheet starting at cell A1 
    Set rTemp = wsTemp.Range(Cells(1, 1), Cells(rSource.Rows.Count, _ 
     rSource.Columns.Count)) 
    rTemp.Value = rSource.Value 

    ' Return the temp range 
    Set CreateTempRange = rTemp 
End Function 

vous auriez encore besoin de code pour traiter les gammes qui consistent en des zones multiples (utiliser la propriété Areas.Count pour vérifier que)

+0

Je reçois toujours une différence de type sur cette ligne. Cela a-t-il fonctionné pour vous? –

+0

Fonctionne bien pour moi dans Excel 2003 – barrowc

1

je le ferais comme ce

Function CreateTempRange(src As Range) As Range 

Dim wbk As Workbook: Set wbk = Workbooks.Add 
Dim sht As Worksheet: Set sht = wbk.Worksheets.Add 

Call src.Copy(sht.Cells(1, 1)) 

Set CreateTempRange = Range(rSource.Address).Offset(1 - rSource.Row, 1 - rSource.Column) 

End Function 

Explication de la dernière ligne de code (comme demandé): -- Cela fait référence à la plage de la feuille de calcul actuelle (contenant le code) avec la même adresse locale que la plage source, donc si la plage source est C3: E5 sur 'Feuille X', Range(rSource.Address) fait référence à C3 : E5 sur la feuille actuelle.

Étant donné que nous avons collé la plage copiée dans la feuille actuelle en commençant par la cellule A1 plutôt que par la cellule C3 (je suppose que c'est votre exigence), nous devons alors décaler cette référence en conséquence. Le .Offset(1 - rSource.Row, 1 - rSource.Column) compense négativement cette plage par l'index de ligne (3) moins 1 et l'index de colonne (C ou 3) moins 1 de la plage source, de sorte que la référence résultante finale commence par la cellule A1 et conserve les mêmes dimensions .

Espérons que ça aide.

+0

Pouvez-vous expliquer ce qui se passe exactement ici? Je ne comprends pas l'utilisation de l'offset. Vous avez une réponse semblable à celle-ci dans une autre question ouverte. J'ai commenté qu'il semble que les plages partagent la même référence après cela. Est-ce vrai? Merci pour l'aide –

+0

Fondamentalement, j'utilise l'adresse locale de la gamme source pour obtenir ses dimensions, obtenir une référence à la plage équivalente sur la feuille cible et la décaler pour commencer à la cellule A1, ce qui donne une référence à la collée Les données. Les références résultantes sont complètement séparées. –

0

Deano, ce code fonctionne pour moi comme écrit. Quelle est l'erreur que vous obtenez?

+0

Lorsque vous parcourez le code, l'exécution s'arrête sur la ligne en question. –

+0

Gah! Je pense que je l'ai compris. J'appelle cette fonction d'une autre fonction. Est-ce autorisé? Lors de l'écriture d'un test Sub il a bien fonctionné. –

+0

Appel à partir d'une fonction ne devrait pas être un problème. Function TestIT() Dim rng As Range Set rng = CreateTempRange(ActiveSheet.Range("A1:C3")) TestIT = rng(2) End Function Œuvres. –

Questions connexes