【问题标题】:Excel VBA - stored value changes format when entered into a cellExcel VBA - 输入单元格时存储值更改格式
【发布时间】:2016-09-23 04:17:29
【问题描述】:

我有一个表格,我需要根据客户作业 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

工作表 9 中的路径看起来像“180,28,60,91,40,178”或“179,143,141,142,178”,并且具有“常规”格式。工作表 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 中,而有些日期保持原始格式。

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

【问题讨论】:

  • 在复制值之前,您需要设置目标单元格的 NumberFormat。

标签: vba excel


【解决方案1】:

如果您不想格式化单元格,那么这里是最简单的方法

Sheet11.Cells(i, 8).Value = "'" & path

【讨论】:

  • 我更喜欢Chr(39),但' 可以。
  • Chr(39) 是 7 个字符。 "'" 是 3 :D
  • ... 和 vbNullString 是十二个字符,而 "" 是两个字符,但 vbNullString 执行得更快。
  • 没错!但是Chr(39)"'" 几乎相同。性能方面 "'"Chr(39) 快,因为 excel 必须将 Chr(39) 转换为 ' 但差异很小。在这种情况下,较短的字符串优先:)
  • ...除非你更喜欢练习你已经记住的 ASCII 表(可能还有一点狂妄自大)。
【解决方案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

附录:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    相关资源
    最近更新 更多