2017-04-22 7 views
1

スプレッドシートからデータを取り込み、データをチャンクに分割してから、テーブルの "値"バリアントに基づいています。 、スプリットデリミタは「、」に設定する必要がありますが、返される値にカンマが含まれている可能性があります

「HL」、「ヘクラ鉱業会社鉱業株」、「NSM」、12.52,8.69,14.07,6.18

分割ラインのためのコード:データの形式は次のようになり引き込ん値を定義し、次のように列に割り当てることは、現在書かれている:

「CDE」:

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 

問題は線の一部は、このようなことの中にカンマが含まれる名前を返すことで発生しました、 "Coeur Mining、Inc。"、 "NSM"、7.59,16.25,9.52,7.01

これは、値(2)= "Coeur Mining"および値(3)= "Inc." Values(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 

それは文は株式会社、「探している場合は、ネストされたとしても機能していないと思われるが。 " sLine文字列内。

フォーマットに関する問題はありますか?私も正規表現の関数を使用しようとしましたが、私はExcel/VBAで非常に新しく、正しくフォーマットする方法を理解することができませんでした。

正規表現次のように与えられた示唆されたコード:

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) 

任意の助けを大幅に高く評価されるであろう、より多くの情報又は実際のコピーは、ファイルを要求に応じて提供することができる優れ。

+2

私は、CSVファイルを読んでいた考えていたが、Iあなたがhttpから情報を得ているのを見てください。どこかのセルに元の文字列を入れてから、テキストを '' 'のテキスト区切り文字でコンマで区切って指定するText to Columnsを使用してください。次にExcelが生成したセルで作業します。 – YowE3K

+0

「Coeur Mining、Inc.」の例では、コンマとIncの間に空白があります。If文ではスペースが省略されています。これはコードの動作を良くするかもしれませんが、非常に一般的な解決策ではありません。法律事務所「Dewy、Cheatem、Howe」をお持ちの場合はどうなりますか?引用符のペアの間にあるコンマを検出する方法が必要です。 –

+0

リッチありがとう、スペースが足りないかもしれないということであなたが正しいかもしれないと信じています。私はちょうどその株式のウェブページを見て、タイトルにスペースがあるように見えます。私はコード行を更新し、それが効果があるかどうかを見てみましょう。名前の中に "、"が付いた唯一の名前に入れた50個のシンボルを見ることができます。しかし、私は同意します。引用符でコンマを探す広範な解決策を見つける方が良いでしょう。残念ながら私は数時間それを試してきましたが、まだ解決策を見つけていません –

答えて

1

文字列の「引用符付きテキスト」パラメータを模倣した「ヘルパー」機能によって文字列を処理する必要があるようです。

これはあなたのサンプルでは機能しません。

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 

enter image description here

注倍とテキストの左位置合わせのための真数の右アラインメント。

0

正規表現ベースのSplitLine関数は、文字列の配列を返します。それはそれを持って、これらのエントリから、周囲の引用符を除外します、そして、それはカンマ「付属」に分割しないでしょう。私は実際に質問を読んでたら

Option Explicit 

Public Function splitLine(line As String) As String() 
    Dim regex As Object, matchcol As Object, match As Object 
    Dim I As Long, S() As String 

Set regex = CreateObject("vbscript.regexp") 
With regex 
    .Global = True 
    .Pattern = """([^""\r\n]*)""|([^,\r\n]+)" 
    If .test(line) = True Then 
     Set matchcol = .Execute(line) 
     ReDim S(0 To matchcol.Count - 1) 
     I = 0 

     'matches surrounded by quotes will be in 0 
     'matches without quotes will be in 1 
     For Each match In matchcol 
      With match 
       S(I) = .submatches(0) & .submatches(1) 
      End With 
      I = I + 1 
     Next match 
    End If 
End With 
splitLine = S 
End Function 
関連する問題