2015-10-02 52 views
1

簡而言之,我將一個CSV文件導入到Excel工作表中,希望能夠區分CSV中沒有數據的單元格和單元格不在CSV中。空單元格vs導入文件中的空字符串

例如,讓下面是在文件「test.csv」文本

1,2,3,4 
5,,7, 
9,10 
13,14,15,16 

然後,在VBA宏,我加載此文件作爲查詢表(代碼從http://www.zerrtech.com/content/excel-vba-open-csv-file-and-import很大程度上覆制):

With Sheet1.QueryTables.Add(Connection:="TEXT;test.csv", _ 
    Destination:=Sheet1.Range("A1")) 
    .Name = "Table1" 
    .FieldNames = True 
    .RowNumbers = False 
    .FillAdjacentFormulas = False 
    .PreserveFormatting = True 
    .RefreshOnFileOpen = False 
    .RefreshStyle = xlOverwriteCells 
    .SavePassword = False 
    .SaveData = True 
    .AdjustColumnWidth = True 
    .RefreshPeriod = 0 
    .TextFilePromptOnRefresh = False 
    .TextFilePlatform = 437 
    .TextFileStartRow = 1 
    .TextFileParseType = xlDelimited 
    .TextFileTextQualifier = xlTextQualifierDoubleQuote 
    .TextFileConsecutiveDelimiter = False 
    .TextFileTabDelimiter = False 
    .TextFileSemicolonDelimiter = False 
    .TextFileCommaDelimiter = True 
    .TextFileSpaceDelimiter = False 
    .Refresh BackgroundQuery:=False 
End With 

它加載CSV導入細胞如下:

| A | B | C | D | 
---+-----+-----+-----+-----+ 
1 | 1 | 2 | 3 | 4 | 
---+-----+-----+-----+-----+ 
2 | 5 |  | 7 |  | 
---+-----+-----+-----+-----+ 
3 | 9 | 10 |  |  | 
---+-----+-----+-----+-----+ 
4 | 13 | 14 | 15 | 16 | 
---+-----+-----+-----+-----+ 

所以,我questio與空單元格C3和D3(未在CSV中定義)相比,n是如何分辨空單元格B2和D2(在CSV中定義爲空)之間的區別?如果沒有辦法從加載的查詢表執行此操作,是否有導入CSV的其他方法可以適應此問題?

回答

1

可能有更簡單的方法來確定每一行的總進口值,但現在:

Option Explicit 

Public Sub csvCounter() 
    Const FILE_NAME As String = "C:\empty.csv" 
    Const DELIM  As String = "," 

    Dim fso As Object, txt As Object, dat As String, i As Long, j As Long, x As Long 
    Dim lns As Long, itms As Long, itm As Variant, v1 As Variant, v2 As Variant 

    Set fso = CreateObject("Scripting.FileSystemObject") 
    Set txt = fso.OpenTextFile(FILE_NAME) 
    dat = txt.ReadAll 

    If InStr(dat, DELIM) > 0 And InStr(dat, vbCrLf) > 0 Then 
     v1 = Split(dat, vbCrLf)         'split by lines 
     lns = UBound(v1) + 1 
     ReDim v2(1 To lns, 1 To UBound(Split(v1(0), DELIM))) 'setup final Range (array) 

     For i = 1 To lns          'parse each line 
      itm = Split(v1(i - 1), DELIM)      'split it by delimiter 
      itms = UBound(itm) + 1 
      If x < itms Then 
       x = itms 
       ReDim Preserve v2(1 To lns, 1 To x + 1)   'resize Range to fit 
      End If 
      For j = 1 To itms 
       v2(i, j) = itm(j - 1)       'copy values 
      Next 
      v2(i, x + 1) = "Total: " & itms     'show count 
     Next 
     With Sheet1.Range("A1").Resize(lns, x + 1) 
      .Value2 = v2 
      .EntireColumn.AutoFit 
     End With 
    End If 
End Sub 

empty cell vs empty string

(導入CSV之後,它可能是太晚了區分它們)

+0

謝謝,這通常運作良好!雖然我在這個特定的實現中有兩個問題:1)它存儲整個文本文件3次,2)它丟失了引用標識符的概念。這些都只是令人討厭,比什麼都重要;應該有更好的內置解決方案! – chezy525