2016-11-14 10 views
1

Excelワークシートのデータに起因するCSVファイルの空白セルを「無視」する方法を決定しようとしています。ExcelワークシートデータのCSVエクスポートで空白セルを無視する

ブランクセルは、ユーザーの入力から1行または下の行の結果になります(ただし、両方の行は決して入力されませんが、スクリプトで参照されるヘッダーは同じままでなければなりません)。 1つの行は1つのOSのディスク要件に関係し、その下の行は該当する場合は代替OSのディスク要件に関係します。ディスク要件のフォーマットは、現在のフォーマットのヘッダにも適用されます。

現在、VBAコードがExcelワークシートに適用されると、最初のOSディスク要件に関連する空白行の欠落データは、空白セルを入力することによって次の行の情報をプッシュします。 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からデータを持っていると思います:私は使用していVBAコード&セル(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

細胞(52、「C」)<> "、" then 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 

ように:ちょうど場合は、たとえば空白を取り除くためにIfステートメントを使用し

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または関数が定義されていません。また、 "BuildValuesString"をlogSTR = logSTR&BuildValuesString( "C"、 "18,19,20,21,22,26,27,28,29,30,31,32")の行です。私は何かを加えるのを忘れましたか – NeedToKnowBasis22

関連する問題