Excel 拆分分隔符必须设置为"&引用;但返回的值可能包含逗号

Excel 拆分分隔符必须设置为"&引用;但返回的值可能包含逗号,excel,string,vba,split,Excel,String,Vba,Split,我正在尝试运行一个程序,该程序应该从电子表格中提取数据,将数据分割成块,然后根据其“值”变量将其导入到我的表中。拉入数据的格式如下所示: “HL”,“赫克拉矿业公司矿业股票”,“NSM”,12.52,8.69,14.07,6.18 用于拆分行、定义值并将其分配给列的代码当前编写如下: Dim Resp As String: Resp = Http.ResponseText Dim Lines As Variant: Lines = Split(Resp, vbLf) Dim sL

我正在尝试运行一个程序,该程序应该从电子表格中提取数据,将数据分割成块,然后根据其“值”变量将其导入到我的表中。拉入数据的格式如下所示:

“HL”,“赫克拉矿业公司矿业股票”,“NSM”,12.52,8.69,14.07,6.18

用于拆分行、定义值并将其分配给列的代码当前编写如下:

Dim Resp As String: Resp = Http.ResponseText
    Dim Lines As Variant: Lines = Split(Resp, vbLf)
    Dim sLine As String
    Dim Values As Variant
    For i = 0 To UBound(Lines)
        sLine = Lines(i)
        If InStr(sLine, ",") > 0 Then
            Values = Split(sLine, ",")
            W.Cells(i + 2, 2).Value = Replace(Values(1), Chr(34), "")
            W.Cells(i + 2, 5).Value = Replace(Values(2), Chr(34), "")
            W.Cells(i + 2, 6).Value = Values(3)
            W.Cells(i + 2, 7).Value = Values(4)
            W.Cells(i + 2, 8).Value = Values(5)
            W.Cells(i + 2, 9).Value = Values(6)
            W.Cells(i + 2, 10).Value = Values(7)
            W.Cells(i + 2, 11).Value = Values(8)
            W.Cells(i + 2, 13).Value = Values(9)
        End If
Public Function splitLine(line As String) As String()

Dim regex As Object     
Set regex = CreateObject("vbscript.regexp")
regex.IgnoreCase = True
regex.Global = True
regex.Pattern = ",(?=([^" & Chr(34) & "]" & Chr(34) & "[^" & Chr(34) & "]" & Chr(34) & ")(?![^" & Chr(34) & "]" & Chr(34) & "))"
splitLine = Split(regex.Replace(line, ";"), ";") End Function
Values = splitLine(sLine)
问题出现在某些行返回的名称中包含逗号,例如:

“CDE”、“科乌尔矿业公司”、“NSM”,7.59,16.25,9.52,7.01

这导致了值(2)=“Coeur Mining”和值(3)=“Inc.”而不是值(2)=“Coeur Mining,Inc.”和值(3)=“NSM”

我已尝试将代码更新为以下内容:

Dim Resp As String: Resp = Http.ResponseText
    Dim Lines As Variant: Lines = Split(Resp, vbLf)
    Dim sLine As String
    Dim Values As Variant
    For i = 0 To UBound(Lines)
        sLine = Lines(i)
        If InStr(sLine, ",") > 0 Then
           ***If InStr(sLine, ",Inc.") Then
            sLine = Replace(sLine, ",inc.", "")
        End If***
            Values = Split(sLine, ",")
            W.Cells(i + 2, 2).Value = Replace(Values(1), Chr(34), "")
            W.Cells(i + 2, 5).Value = Replace(Values(2), Chr(34), "")
            W.Cells(i + 2, 6).Value = Values(3)
            W.Cells(i + 2, 7).Value = Values(4)
            W.Cells(i + 2, 8).Value = Values(5)
            W.Cells(i + 2, 9).Value = Values(6)
            W.Cells(i + 2, 10).Value = Values(7)
            W.Cells(i + 2, 11).Value = Values(8)
            W.Cells(i + 2, 13).Value = Values(9)
        End If
但是,即使使用嵌套的If语句在sLine字符串中查找“.Inc.”,它似乎也无法正常工作

是否存在我不了解的格式问题?我也尝试使用正则表达式函数,但我对excel/VBA非常陌生,无法让它了解如何正确格式化它

建议的正则表达式代码如下所示:

Dim Resp As String: Resp = Http.ResponseText
    Dim Lines As Variant: Lines = Split(Resp, vbLf)
    Dim sLine As String
    Dim Values As Variant
    For i = 0 To UBound(Lines)
        sLine = Lines(i)
        If InStr(sLine, ",") > 0 Then
            Values = Split(sLine, ",")
            W.Cells(i + 2, 2).Value = Replace(Values(1), Chr(34), "")
            W.Cells(i + 2, 5).Value = Replace(Values(2), Chr(34), "")
            W.Cells(i + 2, 6).Value = Values(3)
            W.Cells(i + 2, 7).Value = Values(4)
            W.Cells(i + 2, 8).Value = Values(5)
            W.Cells(i + 2, 9).Value = Values(6)
            W.Cells(i + 2, 10).Value = Values(7)
            W.Cells(i + 2, 11).Value = Values(8)
            W.Cells(i + 2, 13).Value = Values(9)
        End If
Public Function splitLine(line As String) As String()

Dim regex As Object     
Set regex = CreateObject("vbscript.regexp")
regex.IgnoreCase = True
regex.Global = True
regex.Pattern = ",(?=([^" & Chr(34) & "]" & Chr(34) & "[^" & Chr(34) & "]" & Chr(34) & ")(?![^" & Chr(34) & "]" & Chr(34) & "))"
splitLine = Split(regex.Replace(line, ";"), ";") End Function
Values = splitLine(sLine)

任何帮助都将不胜感激,更多信息或实际excel文件的副本可根据要求提供。

看起来您必须通过“帮助器”函数处理字符串,该函数模拟文本到列的“引用文本”参数

虽然不雅观(可能很容易改进),但这适用于您的示例

Option Explicit

Sub test()
    Dim str As String, var As Variant

    str = """CDE"",""Coeur Mining, Inc."",""NSM"",7.59,16.25,9.52,7.01"
    With Worksheets("Sheet1")
        Debug.Print str
        str = cleanQuotedCommas(str)
        var = Split(str, Chr(44))
        With .Cells(2, "B").Resize(1, UBound(var) + 1)
            .Value = var
            .Replace what:=ChrW(8203), replacement:=Chr(44), lookat:=xlPart
            .Replace what:=Chr(34), replacement:=vbNullString, lookat:=xlPart
            .Value = .Value2
        End With
    End With
End Sub

Function cleanQuotedCommas(str As String) As String
    Dim i As Long, j As Long, k As Long
    i = InStr(1, str, Chr(34), vbBinaryCompare)
    Do While CBool(i)
        j = InStr(i + 1, str, Chr(34), vbBinaryCompare)
        k = InStr(i + 1, str, Chr(44), vbBinaryCompare)
        If k > i And k < j Then
            str = Replace(str, Chr(44), ChrW(8203), i, 1, vbBinaryCompare)
        End If
        Debug.Print str
        i = InStr(j + 1, str, Chr(34), vbBinaryCompare)
    Loop
    cleanQuotedCommas = str
End Function
选项显式
子测试()
Dim str作为字符串,var作为变量
str=“”CDE“,”科厄矿业公司“,”NSM“,”7.59,16.25,9.52,7.01”
带工作表(“表1”)
调试。打印str
str=干净的引号逗号(str)
var=分割(str,Chr(44))
带.Cells(2,“B”).Resize(1,UBound(var)+1)
.Value=var
.替换内容:=ChrW(8203),替换:=Chr(44),查看:=xlPart
.Replace what:=Chr(34),replacement:=vbNullString,lookat:=xlPart
.Value=.Value2
以
以
端接头
函数cleanQuotedCommas(str作为字符串)作为字符串
我长,j长,k长
i=InStr(1,str,Chr(34),vbBinaryCompare)
边做边用CBool(i)
j=InStr(i+1,str,Chr(34),vbBinaryCompare)
k=InStr(i+1,str,Chr(44),vbBinaryCompare)
如果k>i且k


请注意双精度数字的右对齐和文本的左对齐。

这是一个基于正则表达式的拆分行函数,它将返回字符串数组。它将从包含引号的条目中排除周围的引号,并且不会在“包含”逗号上拆分:


我以为你在读一个CSV文件,但是,一旦我真的读了这个问题,我看到你正在从http获取信息。尝试将原始字符串放在某个单元格中,然后使用文本到列,指定文本以逗号分隔,文本分隔符为
”。然后处理Excel生成的单元格,这将正确地保留文本字符串中的逗号不变。在您给出的示例中,“Coeur Mining,Inc。,逗号和Inc之间有一个空格。If语句省略了该空格。这可能会使您的代码工作得更好,但这不是一个非常通用的解决方案。如果你有一家律师事务所,“杜威、夏特姆和豪”怎么办?您需要一种方法来检测引号对之间的逗号。谢谢Rich,我相信您可能是对的,因为它可能缺少空格。我刚刚查看了股票的网页,似乎标题中有一个空格。我将尝试更新代码行,看看是否有效果。根据我在50个符号中看到的情况,我在名称中唯一返回“,”的名称是注册公司。不过我同意,最好找到一个更广泛的解决方案,专门在引号中查找逗号。不幸的是,我已经尝试了几个小时,还没有找到一个有效的解决方案YOWE3K-我试图使用一个文本到列函数,但无法让程序使用它,我不知道我是否没有在代码的正确位置行,或者是否有另一个问题。不幸的是,正如在最初的帖子中所说的,除了非常基本的excel函数之外,我对任何东西都是非常陌生的,最近(2周前)才开始尝试在我的工作表中加入VBA。我是一个典型的快速学习者,但是我对这个话题还是很生疏,以至于我不知道我使用的大多数函数是如何工作的,即使我知道如何使用它们。