最近在尝试用excel来制作一个英语词库生成工具,具体是在sheet中放入英语单词,中文解释,英标。然后通过VBA将他们解析为格式固定的txt文件,最后导入到背单词的软件中。在这个过程中,遇到了一些问题:当使用VBA提取excel单元格中的英标内容时,经常出现乱码。
如图,在excel单元格中英标是正常显示的:
但如下图,通过vba编码提取单元格中的英标时,时常出现乱码,这里显示的是solemn中的英标(excel中的第二行第三列)
在此请教一下各位,如何正确的提取excel表单中的英标?
附上程序代码,程序十分简单还在完善阶段。
Public Sub 生成QA1()Dim i, n As Integer
Dim temp As String
i = [a65536].End(xlUp).Row '判断行数
'生成文本文件
temp = ThisWorkbook.Path & "\QA词库1.txt"Set fs = CreateObject("Scripting.FileSystemObject")
Set a = fs.CreateTextFile(temp, True)
'Call AddFontResource("Ksphonet.ttf")For n = 1 To i
a.writeline ("Q: " & Cells(n, 1) & Cells(n,3))
Dim str As Variant
str = Split(Cells(n, 2), Chr(10)) 'chr(10)回车符
For i = 0 To UBound(str)a.writeline ("A: " & str(i))Next i'a.WriteLine ("A: " & Cells(n, 2))
a.writelineNext
a.CloseMsgBox "词库成功生成!注意生成的文本文件还需转换成中欧ISO的字符集才可以使用!"End Sub
如图,在excel单元格中英标是正常显示的:
但如下图,通过vba编码提取单元格中的英标时,时常出现乱码,这里显示的是solemn中的英标(excel中的第二行第三列)
在此请教一下各位,如何正确的提取excel表单中的英标?
附上程序代码,程序十分简单还在完善阶段。
Public Sub 生成QA1()Dim i, n As Integer
Dim temp As String
i = [a65536].End(xlUp).Row '判断行数
'生成文本文件
temp = ThisWorkbook.Path & "\QA词库1.txt"Set fs = CreateObject("Scripting.FileSystemObject")
Set a = fs.CreateTextFile(temp, True)
'Call AddFontResource("Ksphonet.ttf")For n = 1 To i
a.writeline ("Q: " & Cells(n, 1) & Cells(n,3))
Dim str As Variant
str = Split(Cells(n, 2), Chr(10)) 'chr(10)回车符
For i = 0 To UBound(str)a.writeline ("A: " & str(i))Next i'a.WriteLine ("A: " & Cells(n, 2))
a.writelineNext
a.CloseMsgBox "词库成功生成!注意生成的文本文件还需转换成中欧ISO的字符集才可以使用!"End Sub
多谢MY兄提醒。抱歉抱歉,第一次发图片贴,还不熟悉。现在补上图片。请大家指教:第一张图如下:
第二张图如下:
http://hi.csdn.net/attachment/201012/24/59088_1293166184EGeW.jpg
这个我也有研究国,只是刚刚接触VBA,一切都还不熟悉.不知道怎么在VBA下引进字体,也不知道如何将字符串设置成该类字体。所以才上来请教大家,如果能有源代码贴出来就更好了,多谢多谢
我感觉并不是EXCEL的问题,因为英标符号在excel中能够正常显示。只是通过VBA读取单元格的内容时才发生乱码,具体参见我的第二张截图。
数据本身就是从excel的单元格中提取出來的,应该不需要再写回到excel中看字体吧?!
既然是取英标,看一眼字体能咋了?
你显示的时候用跟EXCEL里面一样的字体就能显示出来
VB的菜单:工具-》选项-》编辑器格式 里面可以设置成相同的字体
最终保存的时候也必须使用同一种字体
否则肯定乱码
具体方法:打开控制面板—字体,点文件—安装新字体,在打开的对话框中选择你解压后的字体所在的位置(先选择驱动器,然后再选择文件夹),在字体列表中选择你要安装的字体(一定要选),确定就行了。这种方法可用程序实现:
Call AddFontResource("xxx.ttf") 'xxx为字体文件名
Call SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0)另外,在VB的text中显示其他字体的例子:
text1.Font=“font.ttf” '设置字体
text1.text="xxx"还有一个有用的函数chr,比如Chr(-24082)为五角星,此函数用于得到双字节字符集(DBCS:double-byte character set)代码对应的字符。以上信息希望对你有帮助。引用自:http://zhidao.baidu.com/question/66307630.html
兄弟一共回了两个贴。我在这里一并回答一下。百度知道上的这个信息我一早就搜索到了,当时也认为自己找到了解决的办法。可惜经过实验,没有解决问题(也许是我应用错误,兄弟可以贴出完整代码,这样更加直观)。此外百度知道上该回答的信息并不完全。AddFontResource还需和其他的函数一块使用,这里只给出了一个函数。
另一个回帖提到的ASW函数,我之前也有用过。遇到乱码的字符串,立刻报错,原因不明。兄弟既然已经测试通过了,可否将代码贴出来我参考一下。
yiguangqiang88兄,是第一个认真尝试帮我解决问题的朋友,如此用心,小弟非常感谢!
不知道这个有没有用……
VbExcell.Cells(i, j + 3).Font.Name = "Symbol" '或你自带的.ttf字体
在代码中你必需要激活这个字体Private Declare Function AddFontResource Lib "gdi32" Alias "AddFontResourceA" (ByVal lpFileName As String) As Long
Private Declare Function RemoveFontResource Lib "gdi32" Alias "RemoveFontResourceA" (ByVal lpFileName As String) As Long'增加字体:
Call AddFontResource("c:\myApp\myFont.ttf")'删除字体:
Call RemoveFontResource("c:\myApp\myFont.ttf")
兄弟有心了,多谢,但是与字体无关。经过我的一天的实验,乱码涉及到ANSI与Unicode的映射以及windows的代码页。现在问题已经解决了。
这是因为中文的操作系统下VBA代码编辑窗口用的是默认的字符编码GB2312,该套字符编码是ANSI码的汉字扩展版。国际英标字符没有包含在这套字符集中(即GB2312)。文本数据中如果出现编码方案未定义的字符,Windows就会使用缺省字符,通常是?(如果我没说明白的話,兄弟可以自己去查询一下关于windows代码页的资料)
我在写我的Palm PDA的ZDic的词典时也遇到了显示不正确的问题。但是正如19楼所说,只需要导入即可。只是显示时的字体问题。不用担心