【发布时间】:2018-06-28 09:46:33
【问题描述】:
我有一个带有工作表的工作簿来显示一堆数据。 第一行是标题行,每一列都与特定格式相关联。 此工作表从外部数据源(文件导入)自动更新(通过 VBA 宏代码)。
数据值更新后,格式也会更新(并应用到新行)。在 rColumn 之后的代码提取中是标题下方的数据列范围。 rColumn 从第 2 行开始,而标题在第 1 行。sType 是与标题关联的类型:
On Error GoTo ErrorHandler
With rColumn
.Validation.Delete
Select Case sType
Case "text"
.Value = CStr(.Value)
.NumberFormat = "@"
Case "integer"
.Value = CLng(.Value)
.NumberFormat = "0"
Case "float"
.Value = CDbl(.Value)
.NumberFormat = "0.0"
Case "percentage"
For Each c In rColumn
.Value = CDbl(.Value)
Next c
.NumberFormat = "0.00%"
Case "Image"
.NumberFormat = "@"
Case "currency euro"
.Value = CDbl(.Value)
.NumberFormat = "#,##0.00 $"
Case "currency USD"
.Value = CDbl(.Value)
.NumberFormat = "#,##0.00 [$USD]"
End Select
End With 'rColumn
当我检查单元格格式时,它没问题,我可以看到列格式已设置。
奇怪的是单元格没有按预期呈现。在下面的示例中,列 03ATT cur USD 预计将呈现为美元的货币,而 04ATT cur eur 列将呈现为欧元的货币......
如果我选择一个单元格,请说 03ATT cur USD 列中值为 3 的单元格
并验证它(按回车键 - 注意我不会更改单元格中的值)然后应用预期的格式。
我不得不提一下,在更新数据之前,使用以下代码禁用 GUI 和计算刷新(以加快处理速度):
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.Calculation = xlCalculationManual
但在数据更新和格式更新之后,它们会被重置,以便刷新 GUI:
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
这是一个问题,为什么我在应用块代码中显示的格式时没有得到正确的格式(这篇文章的上半部分)。 我在 Win 10 上使用 Excel 2016。
考虑到关于这篇文章的评论,问题似乎在于将数据单元格值(实际上是范围单元格值)从一种数字表示转换为另一种。目标表示必须与源值兼容。应用 CStr() CLgn() 等转换会在发生转换的确切行上引发错误 13“类型不匹配”。描述不言自明,但我无法弄清楚问题所在。例如,使用 CLng() 转换的值 9535(在 did 中是一个整数 - 实际上 VBA 中的 Long 更好)会惨遭失败。有没有搞错 ?我想知道转换是否可以应用于范围值?
【问题讨论】:
-
单元格是否包含实际的“数字”数据,或“数字格式为文本”?
-
那些你认为是日期和数字的值是看起来像日期或数字的文本。您可以看到,一旦您进入单元格并退出,它就会恢复为真实数字并接受数字格式。最后的证明是,作为文本,默认是左对齐的。一旦它变成一个真实的数字,它就会右对齐,因为所有数字和日期都是默认的。
-
使用 text-to-columns、固定宽度、finish 将看起来像日期或数字的文本快速转换为真实的日期或数字。
-
@Chronocidal 某些值可能会在某些时候被格式化为文本,然后从一张纸复制到另一张纸然后格式化
-
@Jeeped 为什么如果应用另一种格式,它会显示为文本。这些应该如何转换?