2015-10-01 29 views
1

我正在使用我在此處找到的函數:Apend2CSV將更改的行追加到CSV文件。我現在已經在幾個不同的項目中成功地使用了這個過程,但是這一次它忽略了我試圖追加的前兩列。據我所知,一切都設置正確,我希望有一個更好的眼睛可以指出我的問題在哪裏。該代碼由一個Worksheet_Change事件觸發,但它是一個單獨的過程,因爲它也被程序的其他部分調用。將行附加到.csv文件不知何故丟失了前兩列數據

在這種情況下,範圍(「A4:BB4」)應該追加,但實際上只有範圍(「C4:BB4」)。這是一個計算範圍,其中包含公式的計算範圍,通過將"的每個實例替換爲"",並在將值附加到值之前將所有值包含在引號中來說明.csv的潛在古怪性,例如文本中的引號和逗號。

下面的代碼:

Sub Append2CSV() 
    Sheets("ToCSV").Calculate 
    Dim tmpCSV As String 
    Dim f As Integer 
    Const CSVFile As String = "C:\TheCSV\WBCSV.csv" 

    f = FreeFile 
    Open CSVFile For Append As #f 

    tmpCSV = Range2CSV(Sheets("ToCSV").Range("A4:BB4")) 

    Print #f, tmpCSV 
    Close #f 
    ThisWorkbook.Saved = True 
End Sub 

Private Function Range2CSV(list) As String 
    Dim tmp As String 
    Dim cr As Long 
    Dim r As Range 

    If TypeName(list) = "Range" Then 
     cr = 1 
     For Each r In list.Cells 
      If r.Row = cr Then 
       If tmp = vbNullString Then 
        tmp = r.Value 
       Else 
        tmp = tmp & "," & r.Value 
       End If 
      Else 
       cr = cr + 1 
       If tmp = vbNullString Then 
        tmp = r.Value 
       End If 
      End If 
     Next 
    End If 
    Range2CSV = tmp 
End Function 

下面是.csv文件中的文本:

A,AscendSKU,UPCNumber,VendorPartNumber,MFGPartNumber,Divison,G,PhysicalQOHAtTimeOfRecord,AscendQOHAtTimeOfRecord,ChosenVendor,Status,L,M,N,O,P,Q,R,S,Cost,Price,V,W,Location,DateRecordCreated,Z,UniqueID,DateTimeSerial,CurrentAscendQOH,CurrentAscendQOO,CurrentAscendYTD,Brand,ClickHereToStartBuyerModeCategory,AH,DateRecordModified,AJ,AK,AL,AM,AN,AO,AP,AQ,AR,AS,AT,AU,AV,AW,AX,AY,ChangedDuringBuyerMode 
"","11833300044D","879410002474","ST6284","ST6284","1","1181 HI-RISE 1-1/8""x31.8 STEM","","0","Hawley","","","","","","","","","","9.01","19.99","","","","42277","","42277.5861111111---...---11833300044D","42277.5861111111","","","","ELEVEN81","Parts - Stems - Mountain and Hybrid","","42277.6491435185","","","","","","","","","","","","","","","","","" 
"","CHA27625539K","719676285276","60814-0424","60814-0424","1","16 SPEC CHAMONIX HELMET","","2","Specialized Bicycle Components","","","","","","","","","","19.6","49.99","","","","42277","","42277.5841550926---...---CHA27625539K","42277.5841550926","","","","Specialized","Accessories - Helmets - Road - z.Mens","","42277.6491666666","","","","","","","","","","","","","","","","","" 
"","CHA27625539K","719676285276","60814-0424","60814-0424","1","16 SPEC CHAMONIX HELMET","","2","Specialized Bicycle Components","","","","","","","","","","19.6","49.99","","","","42277","","42277.5841550926---...---CHA27625539K","42277.5841550926","","","","Specialized","Accessories - Helmets - Road - z.Mens","","42277.6491666666","","","","","","","","","","","","","","","","","" 
"","WMS291257455","072774380459","38045","38045","1","WM SOLID RR AXLE SET 3/8x26x126x175","0","0","J & B Importers","","","","","","","","","","1.69","5.99","","","","42041","","42041.6198495370---...---WMS291257455","42041.619849537","","","","WHEEL MASTER","Parts - Hubs - Axles and Nuts and Cones","","42277.6496064815","","","","","","","","","","","","","","","","","" 
"","WMS291257455","072774380459","38045","38045","1","WM SOLID RR AXLE SET 3/8x26x126x175","0","0","J & B Importers","","","","","","","","","","1.69","5.99","","","","42041","","42041.6198495370---...---WMS291257455","42041.619849537","","","","WHEEL MASTER","Parts - Hubs - Axles and Nuts and Cones","","42277.6496064815","","","","","","","","","","","","","","","","","" 
"","FLS17361201Z","036121700116","FL4050","FL4050","1","FL SHOCK OIL 5WT--.--16OZ GET 2","","0","Bicycle Technologies International","O","","","","","","","","","8.95","19.99","","","","42063","","42063.7094444444---...---FLS17361201Z","42063.7094444444","","","","FINISH LINE","Accessories - Maintenance - Suspension Fluid","","42277.6517939815","","","","","","","","","","","","","","","","","" 
"","FLS17361201Z","036121700116","FL4050","FL4050","1","FL SHOCK OIL 5WT--.--16OZ GET 2","","0","Bicycle Technologies International","O","","","","","","","","","8.95","19.99","","","","42063","","42063.7094444444---...---FLS17361201Z","42063.7094444444","","","","FINISH LINE","Accessories - Maintenance - Suspension Fluid","","42277.6552893519","","","","","","","","","","","","","","","","","" 
"","FLS17361201Z","036121700116","FL4050","FL4050","1","FL SHOCK OIL 5WT--.--16OZ GET 2","","0","Bicycle Technologies International","O","","","","","","","","","8.95","19.99","","","","42063","","42063.7094444444---...---FLS17361201Z","42063.7094444444","","","","FINISH LINE","Accessories - Maintenance - Suspension Fluid","","42277.6552893519","","","","","","","","","","","","","","","","","" 
"","SPE298655664","719676126357","542-3700","542-3700","1","SPEC FLATBOY GLUELESS PATCHKIT '14""","8","18","Specialized Bicycle Components","","","","","","","","","","1.44","2.99","","","","42063","","42063.7109722222---...---SPE298655664","42063.7109722222","","","","Specialized","Accessories - Flat Repair and Prevention - Patch Kits - Glueless","","42277.6569791666","","","","","","","","","","","","","","","","","" 
+0

您還可以添加CSV文件的樣本嗎?幾行可能會有所幫助。 – transistor1

+0

對不起,我沒有辦法做到這一點。我如何添加文件? –

+1

您可以編輯您的文章(單擊編輯)並粘貼文件的前3-5行 - 如果數據敏感,也可以粘貼數據模型。這是我們可以看到它是如何格式化的 – transistor1

回答

1

,我會在我的2C

子扔來進行測試:

Sub Tester() 
    Dim s, fso 
    s = getCsvContent(Range("A1").CurrentRegion) 
    Set fso = CreateObject("scripting.filesystemobject") 
    With fso.createtextfile("C:\users\yournamehere\desktop\temp.csv", True) 
     .write s 
     .Close 
    End With 
End Sub 

功能的範圍轉換成CSV:

Function getCsvContent(rng As Range) 
    Dim data, r As Long, c As Long, sep, lb, s, tmp 
    data = rng.Value 
    s = "" 
    lb = "" 
    For r = 1 To UBound(data, 1) 
     s = s & lb 
     sep = "" 
     For c = 1 To UBound(data, 2) 
      tmp = data(r, c) 
      If IsError(tmp) Then tmp = "#Error!" '<<handle errors 
      If InStr(tmp, """") > 0 Then 
       tmp = Replace(tmp, """", """""") 
      End If 
      If InStr(tmp, ",") > 0 Then 
       tmp = """" & tmp & """" 
      End If 
      s = s & sep & tmp 
      sep = "," 
     Next c 
     lb = vbNewLine 
    Next r 
    getCsvContent = s 
End Function 
+0

謝謝蒂姆。這實際上確實抓住了以前缺少的前2列(至少在你的Tester())中,但是由我的公式生成的「」表示空白值,以及「在文本字段內指示實際」這個問題會被搞砸了,問題是很多被追加的字段可以包含逗號和雙引號。 –

+0

如果我從中間刪除了2個If InStr()語句,它會起作用,我會用實際上在這裏附加了一下 –

+0

是的,那是做的,我必須堅持使用我的公式,但是我需要能夠附加一個如下所示的字符串:STEM,1181,HI-RISE 1-1/8「-BLK其中逗號和」是附加文本的一部分,我的公式將雙引號轉換爲2個雙引號,並將所有字段用雙引號括起來,這樣當準備好追加時,這個字符串看起來就像這樣:「 STEM,1181,HI-RISE 1-1/8「」 - BLK「 –

0

這適用於多行,以及:

Private Function Range2CSV(list) As String 
    Dim tmp As String 
    Dim cr As Long 
    Dim r As Range 

    If TypeName(list) = "Range" Then 
     cr = list.Row 
     For Each r In list.Cells 
     If r.Row = cr Then 
      tmp = IIf(tmp = vbNullString, r.Value2, tmp & "," & r.Value2) 
     Else 
      tmp = IIf(r.Rows.Count Mod r.Row, tmp & vbCrLf & r.Value2, tmp & "," & r.Value2) 
      cr = r.Row 
     End If 
     Next 
    End If 
    Range2CSV = tmp 
End Function 

與排A4測試它:含BB4系列1,2,3,... 54

結果:

A,AscendSKU,UPCNumber,VendorPartNumber,MFGPartNumber,Divison,G,PhysicalQOHAtTimeOfRecord,AscendQOHAtTimeOfRecord,ChosenVendor,Status,L,M,N,O,P,Q,R,S,Cost,Price,V,W,Location,DateRecordCreated,Z,UniqueID,DateTimeSerial,CurrentAscendQOH,CurrentAscendQOO,CurrentAscendYTD,Brand,ClickHereToStartBuyerModeCategory,AH,DateRecordModified,AJ,AK,AL,AM,AN,AO,AP,AQ,AR,AS,AT,AU,AV,AW,AX,AY,ChangedDuringBuyerMode 
"","11833300044D","879410002474","ST6284","ST6284","1","1181 HI-RISE 1-1/8""x31.8 STEM","","0","Hawley","","","","","","","","","","9.01","19.99","","","","42277","","42277.5861111111---...---11833300044D","42277.5861111111","","","","ELEVEN81","Parts - Stems - Mountain and Hybrid","","42277.6491435185","","","","","","","","","","","","","","","","","" 
"","CHA27625539K","719676285276","60814-0424","60814-0424","1","16 SPEC CHAMONIX HELMET","","2","Specialized Bicycle Components","","","","","","","","","","19.6","49.99","","","","42277","","42277.5841550926---...---CHA27625539K","42277.5841550926","","","","Specialized","Accessories - Helmets - Road - z.Mens","","42277.6491666666","","","","","","","","","","","","","","","","","" 
"","CHA27625539K","719676285276","60814-0424","60814-0424","1","16 SPEC CHAMONIX HELMET","","2","Specialized Bicycle Components","","","","","","","","","","19.6","49.99","","","","42277","","42277.5841550926---...---CHA27625539K","42277.5841550926","","","","Specialized","Accessories - Helmets - Road - z.Mens","","42277.6491666666","","","","","","","","","","","","","","","","","" 
"","WMS291257455","072774380459","38045","38045","1","WM SOLID RR AXLE SET 3/8x26x126x175","0","0","J & B Importers","","","","","","","","","","1.69","5.99","","","","42041","","42041.6198495370---...---WMS291257455","42041.619849537","","","","WHEEL MASTER","Parts - Hubs - Axles and Nuts and Cones","","42277.6496064815","","","","","","","","","","","","","","","","","" 
"","WMS291257455","072774380459","38045","38045","1","WM SOLID RR AXLE SET 3/8x26x126x175","0","0","J & B Importers","","","","","","","","","","1.69","5.99","","","","42041","","42041.6198495370---...---WMS291257455","42041.619849537","","","","WHEEL MASTER","Parts - Hubs - Axles and Nuts and Cones","","42277.6496064815","","","","","","","","","","","","","","","","","" 
"","FLS17361201Z","036121700116","FL4050","FL4050","1","FL SHOCK OIL 5WT--.--16OZ GET 2","","0","Bicycle Technologies International","O","","","","","","","","","8.95","19.99","","","","42063","","42063.7094444444---...---FLS17361201Z","42063.7094444444","","","","FINISH LINE","Accessories - Maintenance - Suspension Fluid","","42277.6517939815","","","","","","","","","","","","","","","","","" 
"","FLS17361201Z","036121700116","FL4050","FL4050","1","FL SHOCK OIL 5WT--.--16OZ GET 2","","0","Bicycle Technologies International","O","","","","","","","","","8.95","19.99","","","","42063","","42063.7094444444---...---FLS17361201Z","42063.7094444444","","","","FINISH LINE","Accessories - Maintenance - Suspension Fluid","","42277.6552893519","","","","","","","","","","","","","","","","","" 
"","FLS17361201Z","036121700116","FL4050","FL4050","1","FL SHOCK OIL 5WT--.--16OZ GET 2","","0","Bicycle Technologies International","O","","","","","","","","","8.95","19.99","","","","42063","","42063.7094444444---...---FLS17361201Z","42063.7094444444","","","","FINISH LINE","Accessories - Maintenance - Suspension Fluid","","42277.6552893519","","","","","","","","","","","","","","","","","" 
"","SPE298655664","719676126357","542-3700","542-3700","1","SPEC FLATBOY GLUELESS PATCHKIT '14""","8","18","Specialized Bicycle Components","","","","","","","","","","1.44","2.99","","","","42063","","42063.7109722222---...---SPE298655664","42063.7109722222","","","","Specialized","Accessories - Flat Repair and Prevention - Patch Kits - Glueless","","42277.6569791666","","","","","","","","","","","","","","","","","" 
A4:BB4 
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54 
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54 
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54 
A5:BB5 
54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 
54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 
54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 
A4:BB5 
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54 
54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54 
54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54 
54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 
+0

沒有任何變化。它仍然離開前兩列。 –

+0

我在複製問題並進行測試後做出並更新,請確認 –

+0

它仍然從2列中刪除。我現在想出了一個解決方法,但是我確實想知道世界上發生了什麼......我的解決方法是移動數據以追加2列,並追加原始範圍,包括2右邊的列。這就得到了我所需要的數據,但這只是讓我難以置信!感謝你的幫助。我必須暫時去,但明天我會回頭看這個東西。 –

0

不知道該Range2CSV功能是專門做,但是這會工作,如果你只是想獲得一個範圍爲CSV字符串:

Private Function Range2CSV(ByVal list As Range) As String 
    Dim tmp As String 
    Dim r As Range 
    Dim rowNum As Long 

    rowNum = list.Cells(1, 1).Row 
    For Each r In list.Cells 
     If r.Row <> rowNum Then 
      rowNum = r.Row 
      tmp = Left(tmp, Len(tmp) - 1) & vbCrLf 'remove last comma and start new line 
     End If 
     tmp = tmp & r.Value & "," 
    Next 
    tmp = Left(tmp, Len(tmp) - 1) & vbCrLf 'remove final comma 

    Range2CSV = tmp 
End Function 
+0

好而短。這隻適用於一行,但應該沒問題,除了行首的額外「,」(你可能想在最後刪除它:Range2CSV = Right(tmp,Len(tmp) - 1) ' –

+0

啊好點 - 固定的,也可以做多行! – codersl

+0

這個工作並增加了額外的行,但它也增加了一個額外的空白行與每個追加...我想也許這是最後的&vbCrLf,但刪除,導致新行添加到現有行的末尾而不是新行。 –

0

爲了應對空白的第一小區的問題,您可以添加以下指示行代碼(測試)。最終,這個答案沒有解決其他問題。

Private Function Range2CSV(list) As String 
    Dim tmp As String 
    Dim cr As Long 
    Dim r As Range 

    If TypeName(list) = "Range" Then 
     cr = 1 
     For Each r In list.Cells 
      If r.Row = cr Then 
       If tmp = vbNullString Then 
        tmp = r.Value 
        If tmp = vbNullString Then tmp = "," ' <~~~~ add this line 
       Else 
        tmp = tmp & "," & r.Value 
       End If 
      Else 
       cr = cr + 1 
       tmp = r.Value 
      End If 
     Next 
    End If 
    Range2CSV = tmp 
End Function 
+0

當我提前提到空白細胞時,我很抱歉。它們中沒有一個實際上是空白的,只是可以使用「作爲文本標識符從csv中檢索到excel的值。在附加過程中,所有」空白「值都由」「表示。因此,我可以附加一個整行的空白值如下所示:「」,「」,「」,「」,「」,「」,「」,「」,「」,「」。是;它仍然以某種方式錯過了前兩列。 –

0

試試這個,但是這隻輸出list中的最後一行數據。

Private Function Range2CSV(list) As String 
    Dim sLine As String, sVal As String 
    Dim cr As Long 
    Dim r As Range 

    If TypeName(list) = "Range" Then 
     cr = 0 ' Current Row 
     For Each r In list.Cells 
      ' Check row changes 
      If r.Row <> cr Then 
       sLine = "" 
       cr = r.Row 
      End If 
      If r.Row = cr Then 
       ' Store cell value 
       If IsEmpty(r) Then 
        sVal = """""" ' "" in the string output 
       Else 
        sVal = r.Value 
       End If 
       ' Set or Join the values together 
       If Len(sLine) = 0 Then 
        sLine = sVal 
       Else 
        sLine = sLine & "," & sVal 
       End If 
      End If 
     Next 
    End If 

    Range2CSV = sLine 
End Function 
0

我決定,我想繼續嘗試考慮一個範圍內實際上爲空(空)的第一個單元格被追加到.csv文件的可能性用引號將文本包裝起來等等。下面是我想到的。它的工作原理與第一個單元格中的值或缺少值相匹配,或者在附加範圍內的任何其他地方。

事實證明,這種方法在處理數千行時實際上效率很低(需要幾分鐘才能完成。)Tim Williams提供的解決方案要快得多,只需不到6秒即可完成。

Private Function Range2CSV(list) As String 
Dim tmp As String 
Dim cr As Long 
Dim r As Range 
Dim St As Integer 

St = 1 
tmp = vbNullString 
If TypeName(list) = "Range" Then 
    cr = list.Row 
    For Each r In list.Cells 
     If r.Row = cr Then 
      tmp = IIf(St = 1, """" & Replace(r.Value, """", """""") & """", tmp & "," & """" & Replace(r.Value, """", """""") & """") 
     Else 
      tmp = IIf(r.Rows.Count Mod r.Row, tmp & vbCrLf & """" & Replace(r.Value, """", """""") & """", tmp & "," & """" & Replace(r.Value, """", """""") & """") 
      cr = r.Row 
     End If 
     St = 2 
    Next 
End If 
Range2CSV = tmp 
End Function 

感謝大家的意見。 Paul Bica,你的回答最接近我,但它對這一行的概念有問題:tmp = IIf(tmp = vbNullString,r.Value2,tmp &「,」& r.Value2) 通過定義St並檢查無論循環是在查看範圍中的第一個單元格,我都能夠說明該單元格是否具有適當處理該tmp的值。