工作表和VBA中的公式工作方式不同
单元格A1包含数字25,它是右alignment的,意味着它是一个数字,而不是文本。
D1包含公式:
=“”&A1
D1中的25是左alignment的,意味着它是文本。 这由下面的公式确认,它返回1:
= IF(D1 = “25”,1,0)
下面的VBA代码将25放在F1中,但是25是右alignment的,并且IFtesting返回0:
Range("F1") = "" & Range("A1")
任何解释的差异?
E1包含以下给出左alignment25的公式,并且IFtesting返回1:
TEXT(A1, “0”)
但是,下面的代码给出了一个右alignment的25和IFtesting返回0:
Range("F1") = Application.WorksheetFunction.Text(Range("A1"), "0")
不是我必须使用TEXT
函数。 我只是想知道为什么它的工作原理与工作表中的不同。
任何规则,告诉什么时候或什么工作表函数将无法在VBA代码中工作,或者更确切地说,会得到不同于在工作表中的结果?
当数据用vba写入单元格时,如果需要,就调用内部types转换函数,即数据types与单元格的numberformat属性不同。
你不希望这个转换函数被调用。
要避免调用此转换函数,请在写入数据之前为单元格select适当的Numberformat属性。
Range("b4").NumberFormat = "@" Range("b4") = Application.WorksheetFunction.Text(Range("A1"), "0")
你只是在Excel中弄错了什么是数字。
一般来说所有的input都是一个string 在单元格中写入“25”。 但是:如果可能的话,Excel会将所有input转换为数字值。 也用于date和时间。
为了防止这种情况,您只需在单元格中插入'
在您的”文本“前面”。
令人困惑的部分是公式的不同行为。 公式将始终输出“结果”和“数据types”。
所以=1+1
将是数字,因为最后一个动作是math。 =Left(1+1,1)
将是文本,因为最后一个动作是基于文本的。
对于=A1
它将简单地复制types。 如果有一个公式,那么这将是相同的。 但是,如果有“直接input”,它将总是尝试转换为数字,如果它不能被转换,或者如果它以一个前导'
( A1
本身已经这样做)开始,它将只是文本。
结果:如果单元格中有一个平面25
,无论你怎么input25,它总是“数字”。
对于较新的Excel,只有一个例外:如果单元格格式在input数字之前是文本,则将被视为文本(不转换)。 如果您稍后更改格式,这不适用。
简单testing:
- 在A1中input
25
(格式化一般) - 在A2中input
=ISNUMBER(A1)
(将为TRUE) - 将A1的格式设置为“text”(A2将仍然为TRUE)
- 在A1中input
25
(现在A2将变成FALSE)
这可能会失败(Excel在这里有时会混淆)。 尝试一个新的工作表。 ;)
希望你理解你的逻辑错误;)
细胞排列没有说明细胞的内容。 忘记任何被“暗示”的东西。 当您在处女工作表上开始时,所有单元格的格式都是“常规”,这意味着Excel将决定您input的格式。 如果你input一个数字,格式将是“数字”。 如果你input一个看起来像Excel的date格式将是“date”,对于大多数其他的东西格式将是“文本”。 因此,如果在格式为“常规”的单元格中input“25”,Excel将会认识到这是一个数字,尽pipe存在前导空格,请将其读取为数字,然后将单元格格式化为右侧。 无论您是通过手动input还是使用VBA,都会发生这种情况。 然后,您可以根据需要继续格式化alignment。 但是,如果在格式为“文本”的单元格中input数字25,则Excel会将该数字识别为文本,并将其格式化为左侧(除非将明确的水平alignment格式设置为右侧)。
处理在这方面可能遇到的任何问题的最佳方法是为要写入的单元格设置NumberFormat
和HorizontalAlignment
属性。 您可以手动或使用VBA来执行此操作。
在工作表中使用的工作表函数的行为方式与在VBA中使用的方式相同。 考虑下面的代码:
注意:范围(“B1”)包含一个数值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
的数据types。
SC1: 所有variables未初始化
你可以看到,在开始时,所有variables都没有值,variablestypesv
是空的。
SC2: variables已初始化,并赋值为v
在执行直到v = r.value2
行后,所有variablestypes都被确认(例如Range/Range
等),variablesv
现在是Variant/Double
。
SC3: 在v
上重新赋值,但使用工作表函数Text
执行使用工作表函数Text
的最后一行,variablesv
types变为Variant/String
。 我认为这证实了函数Text
按预期工作,将数字25
转换为stringtypes。
至于将VBA
生成值传递给工作表的行为,由Docmarti的post覆盖。