在Excel VBA中从UCS2 Little Endian转换为ANSI

时间:2014-08-05 00:41:58

标签: excel vba excel-vba character-encoding

在我正在运行的一些测试中,我有一些自动生成的.htm文件。我一直在努力解析数据并将其带入excel。我终于意识到问题是实验室设备输出的文件是用UCS-2 Little Endian编码的。为了将文件读入文本流,它需要是ANSI或Unicode。

有没有办法可以在不使用外部应用程序的情况下在两种编码之间进行转换?

感谢。

编辑:
所以我尝试按照Noodles的回答用StrConv实现一个解决方案。但是,它似乎没有像我期望的那样工作。以下是我的代码。有没有人知道为什么它不起作用?

Sub ParseReport()                                                               'Parses TX Compliance report generated by LeCroy Scope

    Application.ScreenUpdating = False                                          'Turn off screen updating until end of sub
    On Error Resume Next                                                        'ignore errors
    Dim fso As New FileSystemObject
    Set rStart = Range("A1")                                                    'set starting cell to A0
    sPath = Range("B3").Value & "\"                                             'set file path (pulled from cell B3)
    sPart = ActiveSheet.Name                                                    'set part name to be active sheet name
    sEnd = "<"                                                                  'set end string to "<" (used in for loops below to pull result values from file)

    For iVT = 0 To 24 Step 6                                                    'loop through all VT runs (hilighted in yellow in worksheet)

        For iPort = 0 To 4                                                      'loop through all ports within each VT parameter

            sVT = rStart.Offset(4, 1 + iVT).Value                               'get VT parameter for filename
            sPort = rStart.Offset(5, 1 + iVT + iPort).Value                     'get port information for filename
            sFileName = sPath & sPart & "_" & sPort & "_" & sVT & ".htm"        'set filename
            Set sFile = fso.OpenTextFile(sFileName, ForReading, TristateTrue)   'open file in text stream as unicode
            sFileText = sFile.ReadAll                                           'parse entire file into string
            sAnsiFile = StrConv(sFileText, vbFromUnicode)                        'convert from unicode to system default
            File.Close                                                          'close text stream

            Debug.Print sFileText

            For iTest = 0 To 52                                                 'loop through each test run on part

                sTest = rStart.Offset(6 + iTest, 0).Value                       'get test name from worksheet
                iBegin = InStr(sFileText, sTest) + Len(sTest) + 28              'set beginning character index for string parsing
                iEnd = InStr(iBegin, sFileText, sEnd)                           'set ending character index for string parsing
                sValue = Mid(sFileText, iBegin, iEnd - iBegin)                  'extract result data from file text
                rTest.Offset(iTest, iVT + iPort + 1) = sValue                   'place result data in appropriate cell

            Next                                                                'next test
        Next                                                                    'next port
    Next                                                                        'next VT run

    Application.ScreenUpdating = True                                               'turn on screen updating

End Sub

目前,字符串sFileText和sAnsiFile(我最终想要解析并带入工作表)没有填充.htm文件中的全文。当我运行代码时,sFileText和sAnsiFile的locals输出如下:

sFileText:“ÿþ&lt;:Variant / String
sUniFile:“?&lt;:Variant / String

提前感谢您的帮助。

EDIT2:
我这么大的疏忽:我忘了.htm文件包含标题中的编码。我正在使用的文件是UTF-16。我不确定这是否有所作为。

感谢。

EDIT3:
好吧,所以我选择了面条的答案,因为他确实回答了我的问题。然而,它并没有解决我的问题,主要是因为我认为我问的是错误的问题。无论如何,在我下面的评论中,我注意到解决了我的问题的修复(出于某种原因,在.OpenTextFile方法中添加“False”作为参数使其工作)。使用此修复程序,实际上不需要StrConv()函数。以下是更新后的代码。

Sub ParseReport()                                                               'Parses TX Compliance report generated by LeCroy Scope

    Application.ScreenUpdating = False                                          'Turn off screen updating until end of sub
    On Error Resume Next                                                        'ignore errors
    Dim fso As New FileSystemObject
    Set rStart = Range("A1")                                                    'set starting cell to A0
    sPath = Range("B3").Value & "\"                                             'set file path (pulled from cell B3)
    sPart = ActiveSheet.Name                                                    'set part name to be active sheet name
    sEnd = "<"                                                                  'set end string to "<" (used in for loops below to pull result values from file)

    For iVT = 0 To 24 Step 6                                                    'loop through all VT runs (hilighted in yellow in worksheet)

        For iPort = 0 To 4                                                      'loop through all ports within each VT parameter

            sVT = rStart.Offset(4, 1 + iVT).Value                               'get VT parameter for filename
            sPort = rStart.Offset(5, 1 + iVT + iPort).Value                     'get port information for filename
            sFileName = sPath & sPart & "_" & sPort & "_" & sVT & ".htm"        'set filename
            Set sFile = fso.OpenTextFile(sFileName, ForReading, False, TristateTrue)    'open file in text stream as unicode
            sFileText = sFile.ReadAll                                           'parse entire file into string
            File.Close                                                          'close text stream

            Debug.Print sFileText

            For iTest = 0 To 52                                                 'loop through each test run on part

                sTest = rStart.Offset(6 + iTest, 0).Value                       'get test name from worksheet
                iBegin = InStr(sFileText, sTest) + Len(sTest) + 28              'set beginning character index for string parsing
                iEnd = InStr(iBegin, sFileText, sEnd)                           'set ending character index for string parsing
                sValue = Mid(sFileText, iBegin, iEnd - iBegin)                  'extract result data from file text
                rTest.Offset(iTest, iVT + iPort + 1) = sValue                   'place result data in appropriate cell

            Next                                                                'next test
        Next                                                                    'next port
    Next                                                                        'next VT run

    Application.ScreenUpdating = True                                               'turn on screen updating

End Sub

感谢所有帮助过的人。

2 个答案:

答案 0 :(得分:2)

StrConv函数

返回按指定转换的Variant(String)。

语法

StrConv(string, conversion, LCID)

StrConv函数语法具有以下命名参数:

部分描述

字符串必填。要转换的字符串表达式。

需要转化。整数。指定要执行的转换类型的值的总和。

LCID可选。 LocaleID,如果与系统LocaleID不同。 (系统LocaleID是默认值。)

设置

转换参数设置为:

常量:值 - 描述

  • vbUpperCase:1 - 将字符串转换为大写字符。
  • vbLowerCase:2 - 将字符串转换为小写字符。
  • vbProperCase:3 - 将字符串中每个单词的第一个字母转换为大写。
  • vbWide:4 - 将字符串中的窄(单字节)字符转换为宽(双字节)字符
  • vbNarrow:8 - 将字符串中的宽(双字节)字符转换为窄(单字节)*字符
  • vbKatakana:16 - 将字符串中的平假名字符转换为片假名字符。
  • vbHiragana:32 - 将字符串中的片假名字符转换为平假名字符。
  • vbUnicode:64 - 使用系统的默认代码页将字符串转换为Unicode。
  • vbFromUnicode:128 - 将字符串从Unicode转换为系统的默认代码页。

答案 1 :(得分:1)

我丢失了我的其他身份证,所以我是一个新的面条。

你的第一个代码想要工作的原因是它说

Set sFile = fso.OpenTextFile(sFileName, ForReading, TristateTrue) 

表示fname = sFilename ,打开模式= ForReading ,CREATE = -1(TriStateTrue)未指定可选格式。创建为True或False,因此您指定创建文件(如果它不存在)并以ANSI默认打开(我知道它说ASCII但Windows使用ANSI)。

你可以做的是省略参数(寻找额外的逗号)。

Set sFile = fso.OpenTextFile(sFileName, ForReading, , TristateTrue) 

我注意到你使用了这个

Application.ScreenUpdating = False                                          

因此,如果您对性能最小化点感兴趣(每个点都是查找),尤其是在循环中。

有两种方法。一种方法是,如果要多次访问,请将对象设置为最低对象。

例如(慢)

set xlapp = CreateObject("Excel.Application")
msgbox xlapp.worksheets(0).name

(更快,因为每次使用对象时都会忽略一个点)

set xlapp = CreateObject("Excel.Application")
set wsheet = xlapp.worksheets(0)
msgbox wsheet.name

第二种方式是with。  您一次只能激活一个with

这会跳过100次查找。

with wsheet
For x = 1 to 100
 msgbox .name
Next
end with