web-dev-qa-db-fra.com

Pourquoi Range fonctionne-t-il, mais pas Cells?

J'essaie de déplacer certaines données d'un classeur dans un autre en attribuant les valeurs d'une plage à une autre. Lorsque j'utilise la syntaxe de plage normale pour spécifier la plage de destination (plage ("A1: B2")), mon code fonctionne, mais si j'essaie d'utiliser la plage, la syntaxe des cellules (plage (cellules (1,1), cellules (2) , 2))) mon code ne fonctionne pas.

J'active le classeur de destination (ActiveWorkbook) et le code s'exécute dans le classeur source (ThisWorkbook).

Ce code fonctionne:

ActiveWorkbook.Worksheets(1).Range("A1:B2").Value _
= ThisWorkbook.Worksheets(1).Range(Cells(1, 1), Cells(2, 2)).Value

Mais ce code ne:

ActiveWorkbook.Worksheets(1).Range(Cells(1, 1), Cells(2, 2)).Value _
= ThisWorkbook.Worksheets(1).Range(Cells(1, 1), Cells(2, 2)).Value

L'erreur que j'obtiens est l'erreur d'exécution '1004': erreur définie par l'applicatif ou définie par l'objet.

Est-ce que quelqu'un sait pourquoi l'utilisation de l'objet Cellules me pose des problèmes ou s'il y a un autre problème que je ne connais pas?

16
user2597163

Le problème est que Cells n'est pas qualifié, ce qui signifie que la feuille à laquelle ces cellules se réfèrent est différente selon l'endroit où se trouve votre code. Chaque fois que vous appelez Range ou Cells ou Rows ou UsedRange ou quoi que ce soit qui renvoie un objet Range, et que vous ne spécifiez pas sur quelle feuille il se trouve, la feuille est attribuée selon:

  • Dans le module de classe d'une feuille: cette feuille indépendamment de ce qui est actif
  • Dans tout autre module: l'ActiveSheet

Vous qualifiez la référence Range, mais la référence Cells n'est pas qualifiée et pointe probablement vers la feuille active. C'est comme écrire

ThisWorkbook.Worksheets(1).Range(ActiveSheet.Cells(1, 1), ActiveSheetCells(2, 2)).Value

ce qui bien sûr n'a aucun sens à moins que ThisWorkbook.Worksheets (1) ne soit actif. J'aime souvent utiliser un bloc With pour m'assurer que tout est parfaitement qualifié.

With Sheets(1)
    .Range(.Cells(1,1), .Cells(2,2)).Value = "something"
End With

Mais vous vous référez à deux feuilles différentes, donc vous feriez mieux d'utiliser des variables de feuille courtes comme:

Dim shSource As Worksheet
Dim shDest As Worksheet

Set shSource = ThisWorkbook.Worksheets(1)
Set shDest = Workbooks("myBook").Worksheets(1)

shDest.Range(shDest.Cells(1, 1), shDest.Cells(2, 2)).Value = _
    shSource.Range(shSource.Cells(1, 1), shSource.Cells(2, 2)).Value

Mais vraiment, si vous allez coder en dur les arguments Cells, vous pouvez nettoyer cela comme

shDest.Cells(1, 1).Resize(2, 2).Value = shSource.Cells(1, 1).Resize(2, 2).Value
36
Dick Kusleika