2016-11-14 125 views
1

我想確定一種方法,用於'忽略'由Excel工作表數據導致的CSV文件上的空白單元格。忽略空白單元格CSV導出Excel工作表數據

空白單元格將是用戶在一行或下一行中輸入的結果(但是兩行將永遠不會被填充,但腳本中引用的標頭需要保持不變)。一行涉及到一個操作系統的磁盤需求,而下面的一行涉及另一個操作系統的磁盤需求(如果適用);磁盤要求的格式仍然適用於當前格式的標題。

當前VBA代碼應用於Excel工作表時,空白行中與第一個OS磁盤需求相關的缺失數據通過輸入空白單元「推送」下一行的信息。我想找到一種方法讓VBA代碼「忽略」空白行,並將前進行的數據輸入到該單元格中。我使用的VBA代碼:

Sub WriteCSVFile() 

Dim My_filenumber As Integer 
Dim logSTR As String 

My_filenumber = FreeFile 

logSTR = logSTR & "Header1" & " , " 
logSTR = logSTR & "Header2" & " , " 
logSTR = logSTR & "Header3" & " , " 
logSTR = logSTR & "Header4" & " , " 
logSTR = logSTR & "Header5" & " , " 
logSTR = logSTR & "Header6" & " , " 
logSTR = logSTR & "Header7" & " , " 
logSTR = logSTR & "Header8" & " , " 
logSTR = logSTR & "Header9" & " , " 
logSTR = logSTR & "Header10" & " , " 
logSTR = logSTR & "Header11" & " , " 
logSTR = logSTR & "Header12" & " , " 
logSTR = logSTR & "Header13" & " , " 
logSTR = logSTR & Chr(13) 
logSTR = logSTR & Cells(18, "C").Value & " , " 
logSTR = logSTR & Cells(19, "C").Value & " , " 
logSTR = logSTR & Cells(20, "C").Value & " , " 
logSTR = logSTR & Cells(21, "C").Value & " , " 
logSTR = logSTR & Cells(22, "C").Value & " , " 
logSTR = logSTR & Cells(26, "C").Value & " , " 
logSTR = logSTR & Cells(27, "C").Value & " , " 
logSTR = logSTR & Cells(28, "C").Value & " , " 
logSTR = logSTR & Cells(29, "C").Value & " , " 
logSTR = logSTR & Cells(30, "C").Value & " , " 
logSTR = logSTR & Cells(31, "C").Value & " , " 
logSTR = logSTR & Cells(32, "C").Value & " , " 

如果沒有數據從logSTR = logSTR &將細胞(31, 「C」)值& 「」 我想有數據從logSTR = logSTR所得。 &單元格(32,「C」)。值&「,」放置在該單元格中,而不是留下空白。這將允許數據的格式(用逗號分隔的3個值)與Header11,Header12和Header13(而不是Header12,Header13和No Header)對齊。

logSTR = logSTR & Chr(13) 
logSTR = logSTR & "" & " , " 
logSTR = logSTR & "" & " , " 
logSTR = logSTR & "" & " , " 
logSTR = logSTR & "" & " , " 
logSTR = logSTR & "" & " , " 
logSTR = logSTR & Cells(36, "C").Value & " , " 
logSTR = logSTR & Cells(37, "C").Value & " , " 
logSTR = logSTR & Cells(38, "C").Value & " , " 
logSTR = logSTR & Cells(39, "C").Value & " , " 
logSTR = logSTR & Cells(40, "C").Value & " , " 
logSTR = logSTR & Cells(41, "C").Value & " , " 
logSTR = logSTR & Cells(42, "C").Value & " , " 
logSTR = logSTR & Chr(13) 
logSTR = logSTR & "" & " , " 
logSTR = logSTR & "" & " , " 
logSTR = logSTR & "" & " , " 
logSTR = logSTR & "" & " , " 
logSTR = logSTR & "" & " , " 
logSTR = logSTR & Cells(46, "C").Value & " , " 
logSTR = logSTR & Cells(47, "C").Value & " , " 
logSTR = logSTR & Cells(48, "C").Value & " , " 
logSTR = logSTR & Cells(49, "C").Value & " , " 
logSTR = logSTR & Cells(50, "C").Value & " , " 
logSTR = logSTR & Cells(51, "C").Value & " , " 
logSTR = logSTR & Cells(52, "C").Value & " , " 

Open "Z:\SHARED DRIVE\RequestDirectory\" & ThisWorkbook.Name & ".csv" For Append As #My_filenumber 
    Print #My_filenumber, logSTR 
Close #My_filenumber 


End Sub 
+0

只需使用IF語句淘汰例如,如果空白單元格(52,「C」)<> 「」然後logSTR = logSTR&Cells(52,「C」)。Value&「,」 – Absinthe

回答

1

像下面,你可以使用一個輔助功能:

Function BuildValuesString(colIndex As String, rows As String) As String 
    Dim val As Variant 

    For Each val In Split(rows, ",") 
     If Cells(val, colIndex) <> "" Then BuildValuesString = BuildValuesString & Cells(val, colIndex).Value & " , " 
    Next val 
End Function 

,並利用它在你的主代碼中,例如:

logSTR = logSTR & Cells(18, "C").Value & " , " 
logSTR = logSTR & Cells(19, "C").Value & " , " 
logSTR = logSTR & Cells(20, "C").Value & " , " 
logSTR = logSTR & Cells(21, "C").Value & " , " 
logSTR = logSTR & Cells(22, "C").Value & " , " 
logSTR = logSTR & Cells(26, "C").Value & " , " 
logSTR = logSTR & Cells(27, "C").Value & " , " 
logSTR = logSTR & Cells(28, "C").Value & " , " 
logSTR = logSTR & Cells(29, "C").Value & " , " 
logSTR = logSTR & Cells(30, "C").Value & " , " 
logSTR = logSTR & Cells(31, "C").Value & " , " 
logSTR = logSTR & Cells(32, "C").Value & " , " 

將成爲:

logSTR = logSTR & BuildValuesString("C", "18,19,20,21,22,26,27,28,29,30,31,32") 

,並以同樣的方式,你可以使用其他兩個幫手:

Function BuildNullStrings(numNullStrings As Long) As String 
    Dim iNullStrings As Long 

    For iNullStrings = 1 To numNullStrings 
     BuildNullStrings = BuildNullStrings & "" & " , " 
    Next iNullStrings 
End Function 

Function BuildHeadersString(maxHeader As Long) As String 
    Dim iHeader As Long 

    For iHeader = 1 To maxHeader 
     BuildHeadersString = BuildHeadersString & "Header" & iHeader & " , " 
    Next iHeader 
End Function 

讓你的整個代碼將向下縮短:

Sub WriteCSVFile2() 

    Dim My_filenumber As Integer 
    Dim logSTR As String 

    My_filenumber = FreeFile 

    logSTR = logSTR & BuildHeadersString(13) 
    logSTR = logSTR & Chr(13) 

    logSTR = logSTR & BuildValuesString("C", "18,19,20,21,22,26,27,28,29,30,31,32") 

    logSTR = logSTR & Chr(13) 
    logSTR = logSTR & BuildNullStrings(5) 

    logSTR = logSTR & BuildValuesString("C", "36,37,38,39,40,41,42") 

    logSTR = logSTR & Chr(13) 
    logSTR = logSTR & BuildNullStrings(5) 

    logSTR = logSTR & BuildValuesString("C", "46,47,48,49,50,51,52") 


    Open "Z:\SHARED DRIVE\RequestDirectory\" & ThisWorkbook.Name & ".csv" For Append As #My_filenumber 
     Print #My_filenumber, logSTR 
    Close #My_filenumber 


End Sub 
+0

非常感謝您的回覆 - 我正在嘗試應用您的建議,但我對VBA很新,而且我似乎無法形象在哪裏把你在開頭提到的'助手'放在哪裏。這些意味着在VBA代碼本身中「分離」嗎?我有你的縮短例子,但助手函數似乎分離自己,這是正常的嗎? – NeedToKnowBasis22

+0

你可以把它們放在你的項目的任何模塊中,因爲它們沒有被聲明爲'Private'。所以你也可以把它們放在'SuB WriteCSVFile2()'爲 – user3598756

+0

的同一個模塊中。好吧,我試了一下,出現以下錯誤「編譯錯誤:Sub或Function not defined」,它突出顯示了「BuildValuesString」on logSTR = logSTR&BuildValuesString(「C」,「18,19,20,21,22,26,27,28,29,30,31,32」)行。我錯過了添加什麼嗎? – NeedToKnowBasis22

相關問題