Excel VBA PasteSpecial不粘贴一致

我有一个用于导入与工作计划有关的数据的报告,然后根据这些数据创build图表和统计数据。 计算和图表基于表格,表格由VBA填充 – 用户select文件,然后VBA检查它是否符合预期的文件格式,并将所有内容放在正确的位置。

但是 ,代码的pastespecial部分不能正确粘贴所有内容。 特别是有一些列的date值,当粘贴其中的一些(不是一列或特定的行,但看似随机的单元格)没有被格式化为粘贴date,因此当我在特定的时间范围内寻找工作时,不被捕获公式。

在源文件中,所有的数据都是100%保存为一个date值(如果我把一个filter的数据,它是按年份分组,并可以扩大到月/日/时间+如果我使用testing单元格来添加1到显示下一个date的单元格)。 一旦粘贴到目标表,然后一些仍然是一个date值,但一些似乎是文本和显示为dd / mm / yyyy hh:mm但从计算中错过。 在这些单元格上,如果我走到他们按F2然后回车然后单元格更改为一个date值(重新排列到右侧,然后包含在date范围公式中)。

这里是代码:

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 

我已经尝试添加下面的行之前复制强制它基于我在谷歌上看到的东西,但无济于事:

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

谢谢你的帮助

正如评论中所讨论的,将数据推入变体数组然后将其粘贴到目的地的示例用法。 几点意见:

  • 总是说明每个variables需要哪种types,同一行上的逗号分隔variables并不全部采用最后一种types。
  • 使用语句来保持代码稍微更清晰,并减lessexcel需要解决的引用数量。
  • 由于您没有清除表格的内容(只是覆盖了它们),我在代码中复制了这种行为,因为我认为它是有意的。

编辑子:

 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