如何获取 MS Excel 中单元格的显示值(对于转换为日期的文本)?
Excel 文件来源
我有一个 Excel 文件,它原本是一个 CSV 文件。目前我无法访问原始 CSV 文件。当最初在 Excel 中打开 CSV 文件时,列中的许多单元格Date
都会自动转换。
示例值
以下是该列中部分项目的示例Date
(间距表示左对齐和右对齐的单元格,主要是为了表明第二个日期未转换):
图表 1:
3/1/71
12/01/1882
Fall 1988
1993
如果我选择其中一个单元格并右键单击并选择格式,我将得到不同的东西:
m/d/yy
General
General
General
可能的逻辑
因此看起来 Excel 尚未转换 1882 年 12 月 1 日这个日期 - 可能是因为它“太旧”或者可能是因为其他原因。
如果我选择整列并将其更改为“常规”格式,则会给出以下内容(文本左对齐,数字右对齐):
25993
12/01/1882
Fall 1988
1993
我想要的是
我想要有一列,其中格式设置为“常规”或“文本”,并且它将显示以下日期:展览1多于。
我看见这个问题关于使用 DataFormatter 类(看起来像 Java?)以及一些使用宏和 VB 脚本的类似问题 - 但如果可能的话,我真的很想使用 excel 函数来做到这一点。
我尝试过的方法
我试过用这些东西,但没有效果:
CONCATENATE
- 获取日期字段,并在其前面添加空格
INDIRECT(ADDRESS(ROW(),5))
- 间接获取值
VALUE()
- 获取单元格的“值” - 与我想要的相反
TEXT()
- 可以明确指定格式,但仍然无法使其工作
CELL()
- 可用于获取单元格信息,如“内容” - 没有运气,但我确实看到我也可以用它来获取format
它会告诉我单元格是否显示为数字或“常规”,然后可能与IF
函数一起使用以某种方式将显示为日期的数字转换回实际日期......可能吗?
复制粘贴法
我看到的一种似乎有效的方法是选择值,将它们复制并粘贴到记事本中,然后将它们复制并粘贴回 excel 中(它有效地给出了显示的值 - 这正是我想要的)
唯一的问题是我希望有一个函数来执行此操作,因为 Excel 表中包含几十万行。
答案1
如果你向我们展示了所有可能的格式,那么这应该可行:
=TEXT(A1, IF(CELL("format",A1)="D4", "m/d/yy", "General"))
如果您有除 m/d/yy 之外的日期格式,请为它们添加测试。
答案2
一般答案:
与其尝试处理 CELL("format"...) 函数的结果,不如使用用户定义函数直接返回单元格的 NumberFormat 属性更容易。
在这种情况下,表达式“=TEXT(A1,NumberFormat(A1))”会直接给您显示的值。
为了实现此功能,您需要在工作表的模块中添加以下内容:
Public Function NumberFormat(CellRange As Range) As String
NumberFormat = CellRange.NumberFormat
End Function
答案3
答案相同,但功能不同(对我有用):
Public Function DisplayText(ByVal pRange As Range) As String
DisplayText = pRange.Text
End Function
只需使用 =DisplayText(A1)。如果您更改单元格格式,此函数将返回显示的文本
答案4
这对我有用。它与上面的帖子相同,但包含错误检查:
步骤 1:将以下公共函数复制并粘贴到 VBA 模块中:
Public Function CELLTEXT(target As Range) As String
If target.Cells.Count > 1 Then
MsgBox "CELLTEXT function requires a single cell as an input, please try again"
Exit Function
Else
CELLTEXT = target.Text
End If
End Function
第 2 步:在电子表格中尝试。在任意单元格中输入公式,例如:=CELLTEXT(A1)。然后这将输出 A1 显示的内容。