工作表中的公式和VBA的工作方式不同

时间:2017-07-08 00:33:17

标签: excel vba excel-vba excel-formula

单元格A1包含数字25,它是右对齐的,暗示它是数字,而不是文本。

D1包含公式:

  

=“”& A1

D1中的25左对齐,暗示着它的文字。这由以下公式确认,该公式返回1:

  

= IF(D1 = “25”,1,0)

以下VBA代码在F1中放置25但25是右对齐且IF测试返回0:

Range("F1") = "" & Range("A1")

对差异的任何解释?

E1包含以下公式,该公式给出左对齐25且IF测试返回1:

  

TEXT(A1, “0”)

但是,以下代码给出了右对齐25,IF测试返回0:

Range("F1") = Application.WorksheetFunction.Text(Range("A1"), "0")

不是我必须使用TEXT功能。我只是想知道它为什么与工作表中的工作方式不同。

任何说明何时或哪些工作表函数在VBA代码中不起作用的规则,或者更准确地说,会产生与在工作表中不同的结果?

4 个答案:

答案 0 :(得分:4)

当数据由vba写入单元格时,如果需要,则调用内部类型转换函数,即数据类型与单元格的numberformat属性不同。

您不希望调用转换函数。

要避免调用此转换函数,请在写入数据之前为单元格选择正确的Numberformat属性。

Range("b4").NumberFormat = "@"
Range("b4") = Application.WorksheetFunction.Text(Range("A1"), "0")

答案 1 :(得分:2)

您只是错误地了解Excel中的数字。

一般来说,ALL输入是一个字符串。同时写作" 25"在一个牢房里。 但是:如果可能,Excel会尽可能将所有输入转换为数值。也适用于日期和时间。

为防止出现这种情况,您只需在"文字"前面插入'即可。在牢房里。

令人困惑的部分是公式的不同行为。 公式将始终输出"结果"和"数据类型"。

所以=1+1将是数字,因为最后一个动作是数学。 =Left(1+1,1)将是文本,因为最后一个操作是基于文本的。

对于=A1,它只会复制该类型。如果有一个公式,那么这将是相同的。但是,如果有一个"直接输入"它总是会尝试转换为数字,只有文本才能被转换,或者如果它以前导'开头(A1本身已经这样做了。)

结果:如果单元格中有一个普通的25,它将永远是"数字"无论"怎么"你输入25。

对于较新的Excel,只有一个例外:如果在输入数字之前单元格格式是文本,则将其视为文本(不进行转换)。如果稍后更改格式,则不适用。

简单测试:

  • 在A1中输入25(格式化常规)
  • 在A2中输入=ISNUMBER(A1)(将为TRUE)
  • 将A1的格式设置为" text" (A2仍为TRUE)
  • 在A1中输入25(现在A2将变为FALSE)

这可能会失败(Excel有时会混淆自己)。尝试使用新表。 ;)

希望您理解逻辑中的错误;)

答案 2 :(得分:0)

细胞比对没有说明细胞的内容。忘掉它所暗示的任何东西。当您开始处理原始工作表时,所有单元格的格式为“常规”,这意味着Excel将决定您输入的格式。如果输入数字,格式将为“数字”。如果您输入看起来像Excel的日期,格式将是“日期”,对于大多数其他东西,格式将是“文本”。 因此,如果在格式为“常规”的单元格中输入“25”,Excel将识别出这是一个数字,尽管有前导空格,读取它是数字,并将单元格格式化为右侧。无论您是手动输入还是使用VBA,都会发生这种情况。然后,您可以根据需要继续格式化对齐。 但是,如果在格式为文本的单元格中输入数字25,Excel会将数字识别为文本并将其格式化为左侧(除非您明确将水平对齐格式化为右侧)。

处理在这方面可能遇到的任何问题的最佳方法是,为要写入的单元格设置mylist <- list(c('a','b','c'),c('d','e'),'f') headers <- rep(NA, length(mylist)) for (i in 1:length(mylist)){ headers[i] <- paste("heading", i, sep = "") } names(mylist) <- headers NumberFormat属性。您可以手动或使用VBA执行此操作。

答案 3 :(得分:0)

工作表中使用的工作表函数的行为/工作方式与VBA中使用的相同。请考虑以下代码:

注意:范围(&#34; B1&#34;)包含数值 25

Dim r As Range, v As Variant
Dim wf As WorksheetFunction: Set wf = Application.WorksheetFunction

With Sheet1
    Set r = .Range("B1")
    v = r.Value2
    v = wf.Text(r.Value2, "0")
End With

现在使用本地窗口,让我们检查变体v的数据类型。

SC1: 所有未初始化的变量 All variables not initialized

您可以在开始时看到所有变量都没有值且变体类型v为空。

SC2: 已初始化变量且v已分配值

Variant v set to Variant/Double

执行最多v = r.value2行后,所有变量类型都已确认(例如Range/Range等),变体v现在为Variant/Double

SC3: 重新分配v上的值,但使用工作表函数Text

enter image description here

执行使用工作表函数Text的最后一行,变体v类型变为Variant/String。我认为这证实函数Text按预期工作,将数字25转换为字符串类型。

至于将VBA生成的值传递给工作表的行为,它由上面的Docmarti's post覆盖。