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:=xlPasteValuesMais 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
Et le fichier ou je colle les données :
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 vMais ç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
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).CopyVous 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.RowMATRIX_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 DBonjour 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 aRowDonc 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 ?
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 feuillemais vous pourriez le faire pour chaque colonne
DerLigne = ActiveSheet.Cells(Rows.Count, numcol ).End(xlUp).Row ' colonne numcoldirectement 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