2016-11-14 3 views
1

Я пытаюсь определить метод для «игнорирования» пустых ячеек в файле CSV, который получается из данных листа Excel.Игнорирование пустых ячеек в CSV Экспорт данных рабочего листа Excel

Пустая ячейка будет результатом ввода пользователя в одну строку ИЛИ строку ниже (обе строки никогда не будут заполнены, однако заголовок, на который делается ссылка в скрипте, должен оставаться тем же). Одна строка относится к требованиям к дискам в одной ОС, а строка ниже ее относится к требованиям к дискам другой ОС, если это применимо; формат требований к диску будет по-прежнему применяться к заголовку в его текущем формате.

В настоящее время, когда код VBA применяется к листу Excel, недостающие данные из пустой строки, относящиеся к первым требованиям к диску ОС, «толкают» информацию следующей строки, вводя пустую ячейку. Я хотел бы найти способ, чтобы код 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, «С») Значение & «» Я хотел бы иметь данные из 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») <> "" 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 

так, что весь ваш код будет сократить до:

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

Вы можете поместить их в любой модуль своего проекта, так как они не объявлены как «Частные». Поэтому вы можете разместить их в том же модуле, где 'SuB WriteCSVFile2()' равно – user3598756

+0

. Хорошо, я попробовал, и я получил следующую ошибку: «Ошибка компиляции: Sub или Function not defined» и выделяет «BuildValuesString» на строка logSTR = logSTR & BuildValuesString («C», «18,19,20,21,22,26,27,28,29,30,31,32»). Мне что-то не хватает? – NeedToKnowBasis22

Смежные вопросы