Copier/Coller colonnes avec cellule vide

Bonjour tout le monde

J'essaye de copier les données de certaines colonnes d'un fichier Excel pour les coller dans un autre fichier Excel. Pour ça j'ai utilisé ce code :

'Set the header for every used column of the matrix
With MATRIX_WS
    Set MATRIX_LABEL_H = .Range("A6").EntireRow.Find("Supplier label")
    Set MATRIX_DTC_H = .Range("A6").EntireRow.Find("Data Trouble Code (DTC)")
    Set MATRIX_ID_H = .Range("A6").EntireRow.Find("Requirement / Event_ID")
    Set MATRIX_QUALIF_H = .Range("A6").EntireRow.Find("Qualification time label")
    Set MATRIX_TIME_H = .Range("A6").EntireRow.Find("Healing time label")
    Set MATRIX_TRESHOLD_H = .Range("A6").EntireRow.Find("Healing threshold label")
    Set MATRIX_PYSIC_H = .Range("A6").EntireRow.Find("Physical detection threshold label")
    Set MATRIX_STATE_H = .Range("A6").EntireRow.Find("Fault shield calibration / Actiavtion Label")
    nbData = MATRIX_ID_H.End(xlDown).Row - MATRIX_LABEL_H.Row
End With

'Copy relevant date from Matrix file into Diff file
MATRIX_ID_H.Offset(1, 0).Resize(nbData, 1).Copy
DIFF_WS.Range("EventID").Offset(1, 0).PasteSpecial Paste:=xlPasteValues
MATRIX_LABEL_H.Offset(1, 0).Resize(nbData, 1).Copy
DIFF_WS.Range("MatrixSupplierLabel").Offset(1, 0).PasteSpecial Paste:=xlPasteValues
MATRIX_STATE_H.Offset(1, 0).Resize(nbData, 1).Copy
DIFF_WS.Range("MatrixActivation").Offset(1, 0).PasteSpecial Paste:=xlPasteValues
MATRIX_DTC_H.Offset(1, 0).Resize(nbData, 1).Copy
DIFF_WS.Range("MatrixDTCCode").Offset(1, 0).PasteSpecial Paste:=xlPasteValues
MATRIX_QUALIF_H.Offset(1, 0).Resize(nbData, 1).Copy
DIFF_WS.Range("MatrixQualificationTime").Offset(1, 0).PasteSpecial Paste:=xlPasteValues
MATRIX_TIME_H.Offset(1, 0).Resize(nbData, 1).Copy
DIFF_WS.Range("MatrixHealingTime").Offset(1, 0).PasteSpecial Paste:=xlPasteValues
MATRIX_TRESHOLD_H.Offset(1, 0).Resize(nbData, 1).Copy
DIFF_WS.Range("MatrixHealingThreshold").Offset(1, 0).PasteSpecial Paste:=xlPasteValues
MATRIX_PYSIC_H.Offset(1, 0).Resize(nbData, 1).Copy
DIFF_WS.Range("MatrixPhysicalThreshold").Offset(1, 0).PasteSpecial Paste:=xlPasteValues

Mais le souci c'est que dans le fichier ou je copie les données de certaines colonnes il y'a des cellules vides donc il ne copie/colle pas tout malgré les cellules vides. Le programme s'arrête et ne copie/colle plus rien :

Le fichier ou je copie certaines colonnes avec leurs données

image

Et le fichier ou je colle les données :

image

Et comme vous pouvez le voir au lieu d'avoir des centaines de lignes j'en ai seulement 2 du aux cellules vides du fichier initial.
J'ai testé en utilisant ce code pour faire en sorte de tout copier et coller malgré les cellules vides :

'Loop through each row in the matrix and copy relevant data to the diff worksheet
For v = 2 To nbData + 1
    'Copy Event ID
    If Not IsEmpty(MATRIX_ID_H.Cells(v, 1)) Then
        DIFF_WS.Range("EventID").Cells(DIFF_WS.Range("EventID").Rows.CountLarge + 1, 1) = MATRIX_ID_H.Cells(v, 1)
    End If

    'Copy Supplier Label
    If Not IsEmpty(MATRIX_LABEL_H.Cells(v, 1)) Then
        DIFF_WS.Range("MatrixSupplierLabel").Cells(DIFF_WS.Range("MatrixSupplierLabel").Rows.CountLarge + 1, 1) = MATRIX_LABEL_H.Cells(v, 1)
    End If

    'Copy Activation Label
    If Not IsEmpty(MATRIX_STATE_H.Cells(v, 1)) Then
        DIFF_WS.Range("MatrixActivation").Cells(DIFF_WS.Range("MatrixActivation").Rows.CountLarge + 1, 1) = MATRIX_STATE_H.Cells(v, 1)
    End If

    'Copy DTC Code
    If Not IsEmpty(MATRIX_DTC_H.Cells(v, 1)) Then
        DIFF_WS.Range("MatrixDTCCode").Cells(DIFF_WS.Range("MatrixDTCCode").Rows.CountLarge + 1, 1) = MATRIX_DTC_H.Cells(v, 1)
    End If

    'Copy Qualification Time
    If Not IsEmpty(MATRIX_QUALIF_H.Cells(v, 1)) Then
        DIFF_WS.Range("MatrixQualificationTime").Cells(DIFF_WS.Range("MatrixQualificationTime").Rows.CountLarge + 1, 1) = MATRIX_QUALIF_H.Cells(v, 1)
    End If

    'Copy Healing Time
    If Not IsEmpty(MATRIX_TIME_H.Cells(v, 1)) Then
        DIFF_WS.Range("MatrixHealingTime").Cells(DIFF_WS.Range("MatrixHealingTime").Rows.CountLarge + 1, 1) = MATRIX_TIME_H.Cells(v, 1)
    End If

    'Copy Healing Threshold
    If Not IsEmpty(MATRIX_TRESHOLD_H.Cells(v, 1)) Then
        DIFF_WS.Range("MatrixHealingThreshold").Cells(DIFF_WS.Range("MatrixHealingThreshold").Rows.CountLarge + 1, 1) = MATRIX_TRESHOLD_H.Cells(v, 1)
    End If

    'Copy Physical Detection Threshold
    If Not IsEmpty(MATRIX_PYSIC_H.Cells(v, 1)) Then
        DIFF_WS.Range("MatrixPhysicalThreshold").Cells(DIFF_WS.Range("MatrixPhysicalThreshold").Rows.CountLarge + 1, 1) = MATRIX_PYSIC_H.Cells(v, 1)
    End If
Next v

Mais ça ne fonctionne pas.
Merci par avance !

Update :
Après re avoir testé avec ce code :

'Set the header for every used column of the matrix
With MATRIX_WS
    Set MATRIX_LABEL_H = .Range("A6").EntireRow.Find("Supplier label")
    Set MATRIX_DTC_H = .Range("A6").EntireRow.Find("Data Trouble Code (DTC)")
    Set MATRIX_ID_H = .Range("A6").EntireRow.Find("Requirement / Event_ID")
    Set MATRIX_QUALIF_H = .Range("A6").EntireRow.Find("Qualification time label")
    Set MATRIX_TIME_H = .Range("A6").EntireRow.Find("Healing time label")
    Set MATRIX_TRESHOLD_H = .Range("A6").EntireRow.Find("Healing threshold label")
    Set MATRIX_PYSIC_H = .Range("A6").EntireRow.Find("Physical detection threshold label")
    Set MATRIX_STATE_H = .Range("A6").EntireRow.Find("Fault shield calibration / Actiavtion Label")
    nbData = MATRIX_ID_H.End(xlDown).Row - MATRIX_LABEL_H.Row
End With

'Copy relevant date from Matrix file into Diff file
MATRIX_ID_H.Offset(1, 0).Resize(nbData, 1).Copy
DIFF_WS.Range("EventID").Offset(1, 0).PasteSpecial Paste:=xlPasteValues
MATRIX_LABEL_H.Offset(1, 0).Resize(nbData, 1).Copy
DIFF_WS.Range("MatrixSupplierLabel").Offset(1, 0).PasteSpecial Paste:=xlPasteValues
MATRIX_STATE_H.Offset(1, 0).Resize(nbData, 1).Copy
DIFF_WS.Range("MatrixActivation").Offset(1, 0).PasteSpecial Paste:=xlPasteValues
MATRIX_DTC_H.Offset(1, 0).Resize(nbData, 1).Copy
DIFF_WS.Range("MatrixDTCCode").Offset(1, 0).PasteSpecial Paste:=xlPasteValues
MATRIX_QUALIF_H.Offset(1, 0).Resize(nbData, 1).Copy
DIFF_WS.Range("MatrixQualificationTime").Offset(1, 0).PasteSpecial Paste:=xlPasteValues
MATRIX_TIME_H.Offset(1, 0).Resize(nbData, 1).Copy
DIFF_WS.Range("MatrixHealingTime").Offset(1, 0).PasteSpecial Paste:=xlPasteValues
MATRIX_TRESHOLD_H.Offset(1, 0).Resize(nbData, 1).Copy
DIFF_WS.Range("MatrixHealingThreshold").Offset(1, 0).PasteSpecial Paste:=xlPasteValues
MATRIX_PYSIC_H.Offset(1, 0).Resize(nbData, 1).Copy
DIFF_WS.Range("MatrixPhysicalThreshold").Offset(1, 0).PasteSpecial Paste:=xlPasteValues
image

On peut voir qu'il y'a plus de données qui ont été colle mais toujours insuffisant car il manque beaucoup de données, notamment les ID qui sont pas collées etc.

Bonjour,

sans aller plus loin dans l'investigation, je pense qu'il y a un problème au niveau de chaque ligne du type

MATRIX_STATE_H.Offset(1, 0).Resize(nbData, 1).Copy

Vous faites un resize du copier en utilisant le nombre de lignes remplies de la colonne "Requirement / Event_ID"

nbData = MATRIX_ID_H.End(xlDown).Row - MATRIX_LABEL_H.Row

MATRIX_ID_H.End(xlDown).Row s'arrête à la 1ère ligne vide - 1 dans votre exemple = 2

que vous utilisez pour tous les copier-coller

Un exemple pour récupérer la dernière ligne non vide d'une colonne, ici la colonne 1 puis la colonne correspondant à un Range

DerLigne = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row ' colonne 1
DerLigne = ActiveSheet.Cells(Rows.Count, Range("D5").Column).End(xlUp).Row ' colonne D

Bonjour clr,
Merci pour votre contribution à mon problème.

J'étais parti sur autre chose si vous pouviez me dire si c'est correct.

Je pensais avoir besoin d'une boucle qui boucle chaque ligne de la feuille originale. Je devais vérifierquelle est la dernière ligne de données pour m' assurer que toutes les données sont lues et passées au deuxième classeur. Je dois donc obtenir la dernière ligne d’une colonne ou il y aura une valeur obligatoirement (je pense). Je suppose que la colonne Requirement / Event_ID pourrait être une bonne colonne pour ça. J'ai besoin donc qu'il verifie la derniere ligne de cette colonne.

Utiliser un truc de ce genre :

Dim aRow as Long 'On déclare une ligne active à utiliser dans la boucle
For aRow = 1 to lastRow
    'Ce qu'on doit faire sur cette rangée
Next aRow

Donc en gros je souhaite copier/coller les données de 8 colonnes qui m'interessent, concernant ce que j'ai dit avant je souhaite faire ça avec la colonne Requirement / Event_ID mais dans cette colonne de cette dernière ligne il n’y a pas de valeurs, dois-je choisir une autre colonne ?

image

La capture que je vous ai envoyée comporte deux colonnes parmi les huit que j’utilise pour copier les données et les coller dans l’autre fichier Excel, qui sont Requirement / Event_ID et Supplier label.

Le plus simple est de récupérer la dernière ligne de toute la feuille. le code

DerLigne = ActiveSheet.Cells.Find("*", , , , xlByRows, xlPrevious).Row 'de la feuille

mais vous pourriez le faire pour chaque colonne

DerLigne = ActiveSheet.Cells(Rows.Count, numcol ).End(xlUp).Row ' colonne numcol

directement dans une boucle du genre où vous auriez masqué les colonnes non concernées par la copie dans le classeur source

For col = 1 to dercol

If Columns(col).EntireColumn.Hidden = False then

Derligne = ActiveSheet.Cells(Rows.Count, numcol ).End(xlUp).Row ' colonne numcol

Range(Cells(2, col), Cells(Derligne, col)).copy

.........

' positionnement sur la feuille de destination et la ligne / colonne de destination

Range(Cells(2, coldest)).PasteSpecial Paste:=xlPasteValues

end if

Next

Rechercher des sujets similaires à "copier coller colonnes vide"