Excel VBA - 输入单元格时存储的值会更改格式

dyl*_*lee 5 excel vba

我有一个表格,我需要根据客户端作业 ID 为每个客户端作业填写一些信息,然后我在 VBA 中使用 vlookup 提取信息。

Dim jobID as double, path as String, creationDate as date
For i = 2 to 100
    jobID = Sheet11.Cells(i, 1).Value
    path = Application.WorksheetFunction.VLookup(jobID, Sheet9.Range("A:G"), 7, False)
    creationDate = Application.WorksheetFunction.VLookup(jobID, Sheet9.Range("A:M"), 13, False)
    Sheet11.Cells(i, 6).Value = creationDate
    Sheet11.Cells(i, 8).Value = path
Next i
Run Code Online (Sandbox Code Playgroud)

表 9 中的路径看起来像“180,28,60,91,40,178”或“179,143,141,142,178”并且具有“General”格式。工作表 9 中的创建日期看起来像“2015-11-12 11:44”并且具有 yyyy-mm-dd h:mm 自定义日期格式。然而,当存储的值如图所示输入到 sheet11 中时,一些路径被转换为数字,例如“179,143,141,142,178”变成了“179143141142178”,尽管有些像我想要的那样保留为字符串,例如“180,28,60,91,40,178” . 大多数日期也丢失了时间信息(h:mm 信息)并以 yyyy-mm-dd 格式输入到 sheet11 中,而一些保留了原始格式。

有人可以帮我维护日期中的所有信息并防止存储为字符串的路径变成数字吗?

小智 2

Excel 正在尽力修复它认为数据中存在错误的内容。

标准千位分隔符每隔三个数字放置一个逗号。这是表达数字的标准方法。179,143,141,142,178可以看作一个实数。

当 Excel 看到类似的值时,180,28,60,91,40,178它不知道如何处理它,因为用逗号分隔的两个数字不是表达数值的标准方法,因此它将它们视为文本。

如果您尚未手动更改单元格对齐方式,请加宽列并查看值。默认情况下,文本值在单元格中左对齐;默认情况下,数值和日期(被视为数字)在单元格中右对齐。这将快速向您展示 Excel“认为”什么是数字以及它“认为”什么是文本。

将目标路径格式化为文本,而不是常规。设置目标日期的格式以包含时间值。

Dim jobID as double, path as String, creationDate as date
For i = 2 to 100
    jobID = Sheet11.Cells(i, 1).Value
    path = Application.WorksheetFunction.VLookup(jobID, Sheet9.Range("A:G"), 7, False)
    creationDate = Application.WorksheetFunction.VLookup(jobID, Sheet9.Range("A:M"), 13, False)
    Sheet11.Cells(i, 6).NUMBERFORMAT = "yyyy-mm-dd h:mm"
    Sheet11.Cells(i, 6).Value = creationDate
    Sheet11.Cells(i, 8).NUMBERFORMAT = "@"
    Sheet11.Cells(i, 8).Value = path
Next i
Run Code Online (Sandbox Code Playgroud)

附录:

我发现您的源值可能是文本和数字的混搭[。找到源行并使用它来提取Range.Text 属性可能更合适。

Dim jobID as double, path as String, creationDate as date, rw as variant
For i = 2 to 100
    jobID = Sheet11.Cells(i, 1).Value
    rw = Application.Match(jobID, Sheet9.Columns("A"), 0)
    if not iserror(rw) then 
        path = Sheet9.Cells(rw, "G").TEXT  'this will return whatever is displayed; not the underlying value
        creationDate = Sheet9.Cells(rw, "M").VALUE2
        Sheet11.Cells(i, 6).NUMBERFORMAT = "yyyy-mm-dd h:mm"
        Sheet11.Cells(i, 6).Value = creationDate
        Sheet11.Cells(i, 8).NUMBERFORMAT = "@"
        Sheet11.Cells(i, 8).Value = path
    end if
Next i
Run Code Online (Sandbox Code Playgroud)