Excel VBA PasteSpecial ne colle pas uniformément

J'ai un rapport qui sert à importer des données relatives aux plans de travail, puis crée des charts et des statistics en fonction des données. Les calculs et les charts sont basés sur des tables et les tables sont remplies par VBA – l'user sélectionne le file, puis VBA vérifie qu'il correspond au format de file attendu et place tout au bon endroit.

TOUTEFOIS , la partie spéciale du code ne colle pas tout correctement. Plus précisément, il existe un certain nombre de colonnes avec des valeurs de date et lorsqu'elles sont collées, certaines d'entre elles (pas une colonne ou des lignes particulières, mais des cellules apparemment randoms) ne sont pas formatées comme des dates lorsqu'elles sont collées et ne sont donc pas capturées dans les formules lorsque je search un emploi dans des timeouts précis.

Dans le file source, toutes datatables sont sauvegardées à 100% en tant que date-valeur (si je place un filter sur datatables, tout est regroupé par année et peut être étendu à mois / jour / heure + si j'utilise une cellule de test à append 1 aux cellules, la prochaine date est affichée). Une fois collé dans la feuille de cible, certains sont encore une date de valeur, mais certains semblent être du text et affichés comme dd / mm / aaaa hh: mm mais qui ne sont pas calculés. Sur ces cellules, si je les touche, appuyez sur F2 puis sur Entrée, puis la cellule passe en une date valide (realine vers la droite puis est incluse dans les formules Daterange).

Voici le code:

Public Sub importdata() Dim wb1, wb3 As Workbook Dim ws1, ws3 As Worksheet Dim lrow As Long Dim WOtable As ListObject Dim searchcell As Range Set wb1 = ThisWorkbook Set ws1 = wb1.Sheets("Dashboard") Set WOtable = ws1.ListObjects("workorder") WOfile = Application.GetOpenFilename(FileFilter:="Excel Files (*.CSV),*.CSV", Title:="Select Workorder Extract To Be Opened",MultiSelect:=False) If WOfile = False Then Exit Sub Set wb3 = Workbooks.Open(WOfile) Set ws3 = wb3.Sheets(1) ws3.Range("M:M, O:O, Q:Q").EntireColumn.Delete If ws3.Range("A1").Value = "jobnumber" And ws3.Range("B1").Value ="jobdesc" And etc etc Then lrow = ws3.Range("A1").End(xlDown).Row ws3.Range("A2:O" & lrow).Copy WOtable.DataBodyRange(1, 1).PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False Application.CutCopyMode = False Else: MsgBox ("File selected to import workorder information was not in expected format, please check the file and retry.") End If wb3.Close False End Sub 

J'ai essayé d'append la ligne suivante avant de copyr pour la forcer en fonction de quelque chose que j'ai vu sur Google mais sans succès:

 ws3.Columns("E:K").NumberFormat = "DD/MM/YYYY HH:MM:SS" 

Merci pour toute aide

Comme discuté dans les commentaires, un exemple d'utilisation de la poussée des données dans une variante de tableau, puis le coller à la destination. Quelques commentaires:

  • Indiquez toujours quel type vous voulez pour chaque variable, les variables séparées par des virgules sur la même ligne ne prennent pas tous le dernier type.
  • Utiliser avec des instructions pour garder le code légèrement plus propre et réduire le nombre de references excel doit être résolu.
  • Comme vous n'avez pas effacé le contenu du tableau (simplement les écraser), j'ai reproduit ce comportement dans le code car je suppose qu'il est prévu.

Sous-titre:

 Public Sub importdata() Dim wb1 As Workbook, wb3 As Workbook Dim ws1 As Worksheet, ws3 As Worksheet Dim WOtable As ListObject Dim varTMP As Variant Set wb1 = ThisWorkbook Set ws1 = wb1.Sheets("Dashboard") Set WOtable = ws1.ListObjects("workorder") WOfile = Application.GetOpenFilename(FileFilter:="Excel Files (*.CSV),*.CSV", Title:="Select Workorder Extract To Be Opened", MultiSelect:=False) If WOfile = False Then Exit Sub Set wb3 = Workbooks.Open(WOfile) Set ws3 = wb3.Sheets(1) With ws3 .Range("M:M, O:O, Q:Q").EntireColumn.Delete If .Range("A1").Value = "jobnumber" And .Range("B1").Value ="jobdesc" And etc etc Then 'load data into variant array varTMP = .Cells(1, 1).CurrentRegion 'If you want to do any data manipulation on the array, do it here 'Paste array End With With WOtable.DataBodyRange Range(.Cells(1, 1), .Cells(0 + UBound(varTMP, 1), 0 + UBound(varTMP, 2))) = varTMP End With Else MsgBox ("File selected to import workorder information was not in expected format, please check the file and retry.") End If wb3.Close False End Sub