web-dev-qa-db-fra.com

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

Ce script fonctionne bien lorsque je regarde la feuille "Temp". Mais quand je suis dans une autre feuille, alors la commande de copie échoue

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 du mal à le coller.

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

Que puis-je faire d'autre

27
Aziz

Votre problème est que, parce que les références Cell à l’intérieur des Range ne sont pas qualifiées, elles font référence à une feuille par défaut, qui peut ne pas être celle que vous souhaitez. Pour les modules standard, le module ThisWorkbook, les classes personnalisées et les modules de formulaire utilisateur, la valeur par défaut est la ActiveSheet. Pour le code Worksheet derrière les modules, c'est cette feuille de travail. 

Pour les modules autres que le code de la feuille de travail derrière les modules, votre code indique en réalité

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

Pour le code de feuille de travail derrière les modules, votre code dit en fait

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

Dans les deux cas, la solution est la même: qualifiez complètement les références de plage avec le classeur requis:

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
34
chris neilsen

J'ai moi-même rencontré un problème comme celui-ci: j'essayais de rechercher dans une feuille de calcul distincte pour voir si la couleur d'une cellule correspond à la couleur d'une cellule dans une liste et renvoie une valeur de chaîne: si vous utilisez .Cells (row, column ), vous avez seulement besoin de ceci: Feuilles ("nom_feuille"). Cellules (rangée, colonne) pour référencer cette plage de cellules.

Je parcourais un bloc de 500 cellules et cela fonctionne étonnamment vite pour moi.

Je n'ai pas essayé avec .Copy, mais je suppose que cela fonctionnerait de la même manière.

3
Anonymous

Cela ira, je n'aime pas utiliser (xlDown) dans le 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
GMalc