LenB功能不起作用(VBA)

时间:2016-06-07 14:47:36

标签: vba

我目前正在开发一个 Access 2010 应用程序,该应用程序的文本框接受日文字符(KANJI)的输入。一旦焦点(On Exit事件)在​​文本框中丢失,它将检查所有字符是否都是双字节,否则它将生成警告消息。您可以参考以下代码:

If LenB(StrConv(Trim(strJapanese), vbFromUnicode)) <> Len(Trim(strJapanese)) * 2 Then
    'Inform the user to input double-byte Japanese characters
End If

问题是即使我在文本框中输入双字节字符,也满足上述条件。这意味着字符串的字节长度等于其长度。

请注意,在我的同事的计算机中使用此访问工具并输入日文字符将不符合上述条件 - 这是预期的行为。这是我的环境问题吗?我们使用相同的操作系统和相同的MS Office版本,所以我不明白为什么我们没有相同的结果。

我很感激有关此事的任何帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

我不知道LenB,但是如果你只是想检查一个字符串是否包含汉字,那么只需循环遍历字符串中的每个字符并检查AscW(char)就更容易了。这将返回表示字符的Unicode值的数字,并且所有汉字都包含在&amp; H4E00(一)和&amp; H9FAF(龯)之间。唯一的例外是汉字迭代标记々,它是Unicode&amp; H3005。

注意:对于&amp; H1和&amp; H7FFF,AscW返回从1到32767的正数,并且对于&amp; H8000和&amp; HFFFF,它从-32768到-1返回负数。这种分裂恰好发生在汉字Unicode块的中间,所以你不能简单地使用一个开关语句“Case&amp; H4E00 to&amp; H9FAF”......你必须将它拆分为“Case&amp; H4E00 To&amp; amp ; H7FFF,&amp; H8000 To&amp; H9FAF“。

Function containsOnlyKanji(str As String) As Boolean
 If Len(str) = 0 Then Exit Function 'empty strings don't have any kanji so return false
 Dim i As Long
 For i = 1 To Len(str)
  Select Case AscW(Mid(str, i, 1))
  Case &H4E00 To &H7FFF, &H8000 To &H9FAF, &H3005: 'do nothing, these are kanji
  Case Else: Exit Function                         'non kanji! don't have to check the rest
  End Select
 Next i
 containsOnlyKanji = True 'if we've made it this far, the user must have entered only kanji
End Function

我知道这并没有直接回答你的问题,我讨厌当人们发布没有直接回答问题的答案,但希望这会做你需要的。 (另外,如果你想包括片假名和平假名,它们分别包含在Unicode块&amp; H30A1到&amp; H30FE和&amp; H3040到&amp; H309F中。)