VBA以编程方式修复“错误”的单元格?

所以我在date上有点麻烦 我已经读了很多关于它的date格式很奇怪,这似乎很常见。

当我将xlsx文件或csv文件的数据带入我自己的工作簿(通过vba加载macros)时,date会变成文本格式。 加载macros只是打开所需的文件,将所有行复制并粘贴到当前的书籍中,然后closures该文件。

我检查了我的源文件,所有的date格式正确 – dd / mm / yyyy并正确显示在源xlsx和csv文件中。 当我把数据带入时,date变成文本格式,你看到的只是例如: 40246这实际上是: 09/03/2010

我检查了我的文件,它们都是作为date存储的。 我尝试过格式化为数字,文本,特殊的,所有的变化,然后改回date,没有任何反应。

列中的每个单元格(只有1列)都有绿色的错误指示符,并且信息显示“该单元格被设置为文本格式,或者以撇号开头”,但它们都不是。 我确信我的excel或源文件中没有撇号。 但是,如果我点击“转换为数字”的错误,然后更改格式返回date,它修复。

我想在代码中做到这一点,整个列,转换为数字,然后更改为date。 但我似乎无法弄清楚如何做到这一点。

我试着改变格式,如: ActiveCell.numberformat = "0.00" (我只是尝试了1细胞练习),但没有清除错误,当我改变它回到date什么都没有发生。 我试图录制一个macros的单击错误框中的“转换为数字”,但代码中没有任何内容。 有没有一个vba命令来修复错误的单元格? 我知道这是一个iserror (或类似的东西)函数来告诉如果单元格有错误,但我不知道用什么命令来实际修复错误。

有什么build议么?

如果我突出显示整个列,然后单击错误中的“转换为数字”,它会转换整个列,在此处我可以将其转换为date修复它,这就是我想让macros执行的操作。不希望每次用户都有这个问题时不得不跑过来修复它(而且我并不觉得自己可以让他们自己做,而且最简单的方法就是这样)

在这里输入图像说明

注意到这个小绿色指示器,在那里它说“转换为数字”,我可以做,然后改变格式date后,但它是奇怪的如何没有代码在logging的macros,当我点击转换为数字。

编辑

加载代码:

 openfnameandpath = Application.GetOpenFilename(Title:="Select File To Be Opened") 'get file path dim openfnameandpath as string dim loadworkbook as workbook dim numrows as long, numcols as long openfnameandpath = Application.GetOpenFilename(Title:="Select File To Be Opened") 'get file path Set loadWorkbook = Workbooks.Open(openfnameandpath) loadWorkbook.Sheets(1).Activate 'in case a different sheet was active numrows = Cells.find("*", [A1], , , xlByRows, xlPrevious).Row numcols = Cells.find("*", [A1], , , xlByColumns, xlPrevious).Column loadWorkbook.Sheets(1).Range("A1", Cells(numRows, numCols)).Copy Sheets(1).Cells(1, 1) = loadWorkbook.Close False 

我把它解决了,问题依然存在。

select您的单元格并运行:

 Sub DateFixer() Dim r As Range, d As Date, v As String For Each r In Selection v = r.Text d = CDate(CLng(v)) r.Clear r.NumberFormat = "dd/mm/yyyy" r.Value = d Next r End Sub 

CSV中的date必须格式化为#01/12/2014# – date周围有八号(#)。 这让我疯狂,直到我发现它。

另一个选项(如果你不能控制CSV)是使用datevalue()来转换信息。 如果date位于列a中,则使用= DateValue(A1)创build一个新的列B,然后复制列B,并将“粘贴值”复制到列A中,然后删除列B

想到我会添加另一个解决scheme,效果很好..发现这一点,而扭转。 这个公式: =Text(K2, "dd/mm/yyyy")也很好。 所以我把它调整成了一个很好的macros:

 Sub dateFixer3() Dim format As String 'added after format = InputBox("Please Enter Date Format") 'added after application.screenupdating = false ActiveCell.EntireColumn.Insert Cells(2, ActiveCell.column).Activate 'ActiveCell.FormulaR1C1 = "=Text(rc[1], ""dd/mm/yyyy"")" ActiveCell.FormulaR1C1 = "=Text(rc[1], """ & format & """)" ' added after ActiveCell.EntireColumn.FormulaR1C1 = ActiveCell.FormulaR1C1 'copies formula for entire column ActiveCell.EntireColumn.Copy ActiveCell.Offset(0, 1).EntireColumn.PasteSpecial xlPasteValues 'paste values in original column 'ActiveCell.Offset(0, -1).EntireColumn.Delete xlShiftToLeft 'delete inserted column Application.CutCopyMode = False 'added after application.screenupdating = true End Sub 

使用:激活所需列中的任何单元格,然后运行macros。 它使用活动单元格几次,但只有.activate一次,以确保第二行(节省一个标题的空间)是一个工作,而不是随机行。

*注意: application.screenupdating = false / application.screenupdating = true在开始/结束是没有必要的,但它使得用户看不到整个插入,复制,粘贴,删除业务(这吓倒了我的用户,大声笑)

编辑

注意评论,我添加了几行,并注释了一对夫妇。 更新的代码允许用户input他们想要的任何格式。 它可以从具有许多标准格式的“格式单元格”选项中查找。 但这种方式运行时,有时可能是dd / mm / yyyy,或者他们更喜欢yyyy / mm / dd等等,而且,它会保留原始数据,以便用户可以查看更改,然后决定kep并删除原来的,或者不保存并删除新的列

如果用户想要格式化整个列,macros实际上可以用来代替右键单击和使用格式单元格,将格式更改为任何内容(数字,文本,常规等等)。