【问题标题】:VBA to programmatically fix "errored" cells?VBA以编程方式修复“错误”单元格?
【发布时间】:2014-05-06 13:34:35
【问题描述】:

我在约会方面遇到了一些麻烦。我已经阅读了很多关于它的内容,而且日期格式很奇怪似乎很常见。

我的情况是,当我将 xlsx 文件或 csv 文件中的数据带入我自己的工作簿(通过 vba 加载宏)时,日期被格式化为文本。加载宏只是打开所需的文件,将所有行复制并粘贴到当前书籍中,然后关闭该文件。

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

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

列中的每个单元格(只有 1 列)都有绿色错误指示符,并且信息显示“此单元格格式为文本或前面带有撇号”,但两者都不是。我确保我的 excel 或源代码中没有撇号。但是,如果我在该错误上单击“转换为数字”,然后将格式更改回最新,它会修复。

我想在代码中执行此操作,获取整个列,转换为数字,然后更改为日期。但我似乎无法弄清楚如何做到这一点。

我尝试过更改格式,例如:ActiveCell.numberformat = "0.00"(我只是尝试使用 1 个单元格进行练习)但这并没有清除错误,当我将其更改回最新时,什么也没发生。我尝试录制我在错误框中单击“转换为数字”的宏,但代码中没有任何内容。是否有用于修复错误单元格的 vba 命令?我知道有一个iserror(或类似的东西)函数来判断单元格是否有错误,但我不知道使用什么命令来实际修复错误。

有什么建议吗?

如果我突出显示整个列,然后在错误中单击“转换为数字”,它会转换整个列,此时我可以转换为修复它的日期,这就是我希望宏做的事情..我不想每次用户遇到这个问题时都跑过去修复它(我不相信我可以让他们自己解决,这真的是最简单的)

注意绿色的小指示器,它显示“转换为数字”,我可以这样做,然后将格式更改为日期,但是当我单击转换为数字时,录制的宏中没有代码,这很奇怪。

编辑

加载代码:

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

我把它简化了,问题仍然存在。

【问题讨论】:

  • 你的VBA加载宏有问题,能分享一下代码吗?
  • 发布了我的加载代码,我已经将其缩减为我发布的内容并且存在问题。看不到那里的任何东西会对此有何影响..
  • somcoe 你的回答很有效。我只是错过了.value = .value 部分......它很愚蠢,你必须包括它。因此,要完成它,我所要做的就是在末尾添加.numberformat = "dd/mm/yyy",然后将其更改为日期。

标签: excel vba date


【解决方案1】:

选择您的单元格并运行:

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

【讨论】:

  • 当我添加 screenupdating = false 和 if 语句来检查从 50k 到 200k 行的任何地方的空白(我希望没有任何但我从来没有那么幸运)时,这很有效,它需要而没有屏幕更新位
  • 干得好!很高兴您能够根据自己的需要调整代码并对其进行更新以提高其性能!
  • 我认为你是我曾经有过的第一批给我“路要走”评论的人之一..也许还有其他几个..但不是很多..day = made,谢谢你:)
【解决方案2】:

CSV 中的日期必须格式化为 #01/12/2014# - 日期周围有八字形 (#)。这让我发疯,直到我发现它。

另一个选项(如果您无法控制 CSV)是使用 datevalue() 来转换信息。如果日期在 a 列中,则使用 =DateValue(A1) 创建一个新的 B 列,然后复制 B 列,并将值“粘贴”到 A 列,然后删除 B 列

【讨论】:

  • 不起作用..我尝试按照您的建议插入一个新列,但我还提出了:=DATEVALUE("40246"),但它没有用。两次我都得到#VALUE错误。如果我输入日期:=DATEVALUE(09/03/2010") 我得到数字:40246 哈哈,但不是相反
【解决方案3】:

我想我会添加另一个效果很好的解决方案.. 在搞砸的时候发现了这个。这个公式:=Text(K2, "dd/mm/yyyy") 也很好用。所以我把它改编成一个也很好用的宏:

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

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

*注意:application.screenupdating = false / application.screenupdating = true 在开头/结尾不是必要,但它使用户看不到整个插入、复制、粘贴、删除业务(这让我的用户感到害怕,哈哈)

编辑

注意 cmets,我添加了几行并注释掉了几行。更新后的代码允许用户输入他们想要的任何格式。它可以从具有许多标准格式的“格式单元格”选项中查找。但是这种方式在运行时有时可能是 dd/mm/yyyy 或者他们可能更喜欢 yyyy/mm/dd 等...此外,它会保留原始数据,以便用户可以查看更改,然后决定保留并删除原始数据,还是不保留和删除新列

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

【讨论】:

  • 更新为更加动态和更安全(保留原始数据)
猜你喜欢
  • 1970-01-01
  • 2015-05-11
  • 2015-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
  • 2010-10-02
相关资源
最近更新 更多