单元格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代码中不起作用的规则,或者更准确地说,会产生与在工作表中不同的结果?
答案 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,只有一个例外:如果在输入数字之前单元格格式是文本,则将其视为文本(不进行转换)。如果稍后更改格式,则不适用。
简单测试:
25
(格式化常规)=ISNUMBER(A1)
(将为TRUE)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: 所有未初始化的变量
您可以在开始时看到所有变量都没有值且变体类型v
为空。
SC2: 已初始化变量且v
已分配值
执行最多v = r.value2
行后,所有变量类型都已确认(例如Range/Range
等),变体v
现在为Variant/Double
。
SC3: 重新分配v
上的值,但使用工作表函数Text
执行使用工作表函数Text
的最后一行,变体v
类型变为Variant/String
。我认为这证实函数Text
按预期工作,将数字25
转换为字符串类型。
至于将VBA
生成的值传递给工作表的行为,它由上面的Docmarti's post覆盖。