vbNewline vs Chr(10)作为Windows vs. Mac OSX中的换行分隔符

问题描述 投票:2回答:3

我有一个Excel子程序,它使用Split()函数将CSV数据从一个单元格拆分为一个数组。但是,根据我使用的Excel / OS的版本,用作换行符分隔符的字符会更改:

Excel 2011 / Mac OSX:

 fullArray = Split(CSV, vbNewLine) 'successfully returns array

 fullArray = Split(CSV, Chr(10)) 'fails and returns only a single cell

Excel 2007 / Windows 7:

  fullArray = Split(CSV, Chr(10)) 'successfully returns array

  fullArray = Split(CSV, vbNewLine) 'fails and returns only a single cell

其他人都注意到了这一点/并解释了为什么会这样吗?

excel vba excel-vba compatibility
3个回答
3
投票

如果需要支持多个操作系统(或同一操作系统上的不同版本),则可以查看条件编译语句。

您可以参考此内置编译器常量列表:

http://www.utteraccess.com/wiki/index.php/Conditional_Compilation#Built_In_Compiler_Constants

将定界符变量定义为字符串,并将其分配给函数结果。

Dim dlmt as String

dlmt = newLine()

fullArray = Split(CSV, dlmt)

该函数然后使用条件编译常量来检查操作系统:

Function newLine() As String

#If Win32 Or Win64 Then
    ret = Chr(10)
#ElseIf Mac Then
    ret = vbNewLine
#End If

newLine = ret

End Function

坦白地说,我记得没有必要在此处使用条件编译,除非您具有某些版本中不会编译的方法/属性。您可以使用Application.OperatingSystem的更简单的属性:

Function newLine() As String

Select Case Application.OperatingSystem
    Case Like "Windows*" 
        ret = Chr(10)
    Case Else
        ret = vbNewLine
End Select

End Function

1
投票

正如约翰在评论中提到的,两个操作系统具有不同的NewLine字符。

因此,在拆分之前,请先检查存在哪个字符,然后再拆分。例如

newL = InStr(1, CSV, vbNewLine)
vbChrTen = InStr(1, CSV, Chr(10))

If newL > 0 And vbChrTen > 0 Then
    MsgBox "The string contains both. How would you like to handle it?"
    '
    '~~> Rest of the code
    '
ElseIf newL > 0 Then
    fullArray = Split(CSV, vbNewLine)
ElseIf vbChrTen > 0 Then
    fullArray = Split(CSV, Chr(10))
Else
    MsgBox "The string doesn't contain either of the de-limiters. How would you like to handle it?"
    '
    '~~> Rest of the code
    '
End If

0
投票

类似“ Windows *”的情况无效。这对我有用:

 ' User has Windows or Mac for NewLine
Dim mynewLine As String
If left(Application.OperatingSystem, 7) = "Windows" Then
    mynewLine = Chr(10)
Else
    mynewLine = vbNewLine
End If
© www.soinside.com 2019 - 2024. All rights reserved.