web-dev-qa-db-fra.com

Copier une plage et coller des valeurs dans une plage spécifique d'une autre feuille

J'essaie de faire fonctionner une macro Excel mais je ne parviens pas à copier les valeurs à partir de cellules contenant une formule.

Jusqu’à présent, c’est ce que j’ai fait et cela fonctionne très bien avec les cellules ne contenant pas de formule.

Sub Get_Data()
Dim lastrow As Long

lastrow = Sheets("DB").Range("A65536").End(xlUp).Row + 1

Range("B3:B65536").Copy Destination:=Sheets("DB").Range("B" & lastrow)
Range("C3:C65536").Copy Destination:=Sheets("DB").Range("A" & lastrow)
Range("D3:D65536").Copy Destination:=Sheets("DB").Range("C" & lastrow)
Range("E3:E65536").Copy Destination:=Sheets("DB").Range("P" & lastrow)
Range("F3:F65536").Copy Destination:=Sheets("DB").Range("D" & lastrow)
Range("AH3:AH65536").Copy Destination:=Sheets("DB").Range("E" & lastrow)
Range("AIH3:AI65536").Copy Destination:=Sheets("DB").Range("G" & lastrow)
Range("AJ3:AJ65536").Copy Destination:=Sheets("DB").Range("F" & lastrow)
Range("J3:J65536").Copy Destination:=Sheets("DB").Range("H" & lastrow)
Range("P3:P65550").Copy Destination:=Sheets("DB").Range("I" & lastrow)
Range("AF3:AF65536").Copy Destination:=Sheets("DB").Range("J" & lastrow).

End Sub

Comment puis-je le faire pour qu'il colle les valeurs?

Si cela peut être modifié/optimisé, je l'apprécierais aussi.

10
BlueSun3k1

Vous pouvez changer

Range("B3:B65536").Copy Destination:=Sheets("DB").Range("B" & lastrow)

à

Range("B3:B65536").Copy 
Sheets("DB").Range("B" & lastrow).PasteSpecial xlPasteValues

En passant, si vous avez un fichier xls (Excel 2003), vous obtiendrez une erreur si votre lastrow est supérieur 3.

Essayez d'utiliser ce code à la place:

Sub Get_Data()
    Dim lastrowDB As Long, lastrow As Long
    Dim arr1, arr2, i As Integer

    With Sheets("DB")
        lastrowDB = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
    End With

    arr1 = Array("B", "C", "D", "E", "F", "AH", "AI", "AJ", "J", "P", "AF")
    arr2 = Array("B", "A", "C", "P", "D", "E", "G", "F", "H", "I", "J")

    For i = LBound(arr1) To UBound(arr1)
        With Sheets("Sheet1")
             lastrow = Application.Max(3, .Cells(.Rows.Count, arr1(i)).End(xlUp).Row)
             .Range(.Cells(3, arr1(i)), .Cells(lastrow, arr1(i))).Copy
             Sheets("DB").Range(arr2(i) & lastrowDB).PasteSpecial xlPasteValues
        End With
    Next
    Application.CutCopyMode = False
End Sub

Notez que le code ci-dessus détermine la dernière ligne non vide de la feuille DB dans la colonne A (variable lastrowDB). Si vous devez trouver lastrow pour chaque colonne de destination dans la feuille DB, utilisez la modification suivante:

For i = LBound(arr1) To UBound(arr1)
   With Sheets("DB")
       lastrowDB = .Cells(.Rows.Count, arr2(i)).End(xlUp).Row + 1
   End With

   ' NEXT CODE

Next

Vous pouvez également utiliser l'approche suivante à la place de Copy/PasteSpecial. Remplacer

.Range(.Cells(3, arr1(i)), .Cells(lastrow, arr1(i))).Copy
Sheets("DB").Range(arr2(i) & lastrowDB).PasteSpecial xlPasteValues

avec

Sheets("DB").Range(arr2(i) & lastrowDB).Resize(lastrow - 2).Value = _
      .Range(.Cells(3, arr1(i)), .Cells(lastrow, arr1(i))).Value
21
Dmitry Pavliv

Que diriez-vous si vous copiez chaque colonne d’une feuille dans des feuilles différentes?.

0
Gem