在VBA中,我为了使一个非空值Textbox控件自动获得焦点,写了一个过程,主体代码如下,
其中有行代码写错了,结果花了我4个小时才找到凭空多出来一个字符的原因,你说冤不冤。
有心人请试试,望能给个理由......
With TextBox1
.PasswordChar = "*"
.Text = "abcd" '此处实际是从其他函数获得该值。
Debug.Print "Txt1= " & .Text
If Len(.Text) > 0 Then '若TextBox1非空,自动获得焦点。
.SetFocus
.SelText = Len(.Text)
End If
Debug.Print "Txt2= " & .Text
'...此后面还有其他其他函数使用该.Text值
End With
其中有行代码写错了,结果花了我4个小时才找到凭空多出来一个字符的原因,你说冤不冤。
有心人请试试,望能给个理由......
With TextBox1
.PasswordChar = "*"
.Text = "abcd" '此处实际是从其他函数获得该值。
Debug.Print "Txt1= " & .Text
If Len(.Text) > 0 Then '若TextBox1非空,自动获得焦点。
.SetFocus
.SelText = Len(.Text)
End If
Debug.Print "Txt2= " & .Text
'...此后面还有其他其他函数使用该.Text值
End With
With TextBox1
.PasswordChar = "*"
.Text = "abcd" '此处实际是从其他函数获得该值。
Debug.Print "Txt1= " & .Text
If Len(.Text) > 0 Then '若TextBox1非空,自动获得焦点。
.SetFocus
'.SelText = Len(.Text)
.SelLength = Len(.Text) '应该是这样写
End If
Debug.Print "Txt2= " & .Text
'...此后面还有其他其他函数使用该.Text值
End With很容易发现的错误~~~~~~
.SelText = Len(.Text).SelStart = 0
.SelLength = Len(.Text)
.PasswordChar = "*"
.Text = "abcd" '此处实际是从其他函数获得该值。
Debug.Print "Txt1= " & .Text
If Len(.Text) > 0 Then '若TextBox1非空,自动获得焦点。
.SetFocus
.SelText = Len(.Text) '这个是错误的
End If
Debug.Print "Txt2= " & .Text
'...此后面还有其他其他函数使用该.Text值
End With
在 Excel VBA 中,当 .Text 为空时,会强制设置 .SelLength = 0。任何情况下,当 TextBox控件 的 .SelLength = 0 时,执行:
.SelText = [String]
等效于在 .SelStart 位置插入 [String] 这段文本内容。
再次仔细看了看MSDN:
“.SelText--返回或设置包含当前所选择文本的字符串;如果没有字符被选中,则为零长度字符串 ("") ”----
好像我的猜测也有根据:零长度字符串("")不就是指Chr(0)吗?唉!还是经验不足和基础不扎实呀。
当时根本就没想到这点,也没注意到文本框里的星号由“******”变为了“*******”,
害得我在自定义的字符串加解密函数里折腾了老半天......
VB/VBA 中,Chr(0) ≠ ""你可以 Debug.Print len(""), len(Chr(0))
试一下。