Excel VBA, obtenir la plage à partir d'une feuille inactive

Ce script fonctionne bien lorsque je regarde la feuille "Temp". Mais quand je suis dans une autre feuille, la commande copy échoue.. Il donne une "erreur définie par L'Application ou définie par l'objet"

Sheets("Temp").Range(Cells(1), Cells(1).End(xlDown)).Copy
Sheets("Overview").Range("C40").PasteSpecial

Je peux utiliser ce script à la place, mais j'ai des problèmes avec le coller

Sheets("Temp").Columns(1).Copy
Sheets("Overview").Range("C40").PasteSpecial
  • Je ne veux pas activer la feuille "Temp" pour obtenir ceci

Que puis-je faire d'autre

27
demandé sur pnuts 2011-11-08 12:55:07

3 réponses

Votre problème est que parce que les références Cell à l'intérieur des Range ne sont pas qualifiées, elles se réfèrent à la valeur par défaut ActiveSheet. Donc, votre code dit en fait

Sheets("Temp").Range(ActiveSheet.Cells(1), ActiveSheet.Cells(1).End(xlDown)).Copy
Sheets("Overview").Range("C40").PasteSpecial

Voici une version mieux formée

Dim sh1 As Worksheet
Dim sh2 As Worksheet

Set sh1 = ActiveWorkbook.Sheets("Temp")
Set sh2 = ActiveWorkbook.Sheets("Overview")

With sh1
    .Range(.Cells(1,1), .Cells(1,1).End(xlDown)).Copy
End With
sh2.Range("C40").PasteSpecial
32
répondu chris neilsen 2015-08-26 11:05:55

J'ai rencontré un problème comme ça moi: j'ai essayé de chercher dans une feuille de calcul distincte pour voir si la couleur d'une cellule correspondait à la couleur d'une cellule dans une liste et retourne une chaîne de valeur: si vous êtes en utilisant .Cellules (ligne, colonne), vous avez seulement besoin de cela: Feuilles ("sheetname").Cells(ligne, colonne) pour référencer cette gamme de cellules.

Je faisais une boucle à travers un bloc de 500 cellules et cela fonctionne étonnamment rapidement pour moi.

Je ne l'ai pas essayé avec .Copie, mais je suppose que ce serait de la même façon.

3
répondu Anonymous 2015-01-15 23:29:52

Cela fera l'affaire, je n'aime pas utiliser (xlDown) au cas où une cellule est vide.

Dim lRow As Long
lRow = Sheets("Temp").Cells(Cells.Rows.Count, "A").End(xlUp).Row

With Sheets("Temp")
     .Range("A1:A" & lRow).Copy Sheets("Overview").Range("C40")
End With

Ou si vous voulez simplement utiliser des colonnes...

Sheets("Temp").Columns(1).SpecialCells(xlCellTypeConstants).Copy Destination:=Sheets("Overview").Range("C40")
1
répondu GMalc 2017-11-14 21:34:32