2015-10-05 5 views
2

Я пытаюсь экспортировать 15 рабочих листов из книги Excel в файлы CSV. Книга содержит 18 листов. Первые три листа не нужно экспортировать, поскольку они содержат необработанные данные, инструкции и вычисления.Экспорт рабочих листов XLSX (несколько) в виде отдельных CSV-листов с вложенными операциями if

Файлы CSV для импорта в Microsoft Dynamics AX. Мне нужно очистить любой cel, содержащий «~» до сохранения в виде csv. Но только из 15 листов для экспорта.

Я нашел несколько тем на этом форуме, которые позволяют мне создать csv успешно.

Моих V в конечном итоге глядя, как это: (взломать вместе нескольких кодовых наборов)

Sub SaveWorksheetsAsCsv() 
Dim WS As Excel.Worksheet 
Dim SaveToDirectory As String 
Dim CurrentWorkbook As String 
Dim CurrentFormat As Long 
CurrentWorkbook = ThisWorkbook.FullName 
CurrentFormat = ThisWorkbook.FileFormat 
' Store current details for the workbook 
SaveToDirectory = "C:\Temp\Prices\CSV\" 
For Each WS In ThisWorkbook.Worksheets 
If WS.Name <> "Instructions" And WS.Name <> "Parameters" And WS.Name <> "BI Data & Worksheet" Then 

    Sheets(WS.Name).Copy 
    For Each Cell In [b:b] 
    If Cell.Value = "~" Then Cell.ClearContents 
    'put any value you want here 
    Next Cell 
    Sheets(WS.Name).Copy 
    For Each Cell In [A:A] 
    If Cell.Value = "~" Then Cell.ClearContents 
    'put any value you want here 
    Next Cell 


    ActiveWorkbook.SaveAs Filename:=SaveToDirectory & WS.Name & ".csv", FileFormat:=xlCSV 
    ActiveWorkbook.Close SaveChanges:=False 
    ThisWorkbook.Activate 
End If 
Next 
Application.DisplayAlerts = False 
ThisWorkbook.SaveAs Filename:=CurrentWorkbook, FileFormat:=CurrentFormat 
Application.DisplayAlerts = True 
' Temporarily turn alerts off to prevent the user being prompted 
' about overwriting the original file. 
End Sub 

Где я бег на вопрос, что в то время как экспорт работает нормально, и выглядит CSV замечательно, все временные «копии» книг больше не закрываются заявлением ActiveWorkbook.Close SaveChanges:=False.

Я уверен, что это связано с моими вставками IF, но не может понять, что я делаю неправильно.

ответ

1

Вы можете вручную закрыть их после того, как все будет готово.

Dim wb As Workbook 

    Application.DisplayAlerts = False 

    'Loop though each workbook 
    For Each wb In Application.Workbooks 

     'Activate the workbook 
     wb.Activate 
     if wb.name = "something you want to close" then 
      wb.Close 
     end if 

    Next wb 

    Application.DisplayAlerts = True 

EDIT: Более подробную информацию по оригинальному вопросу. См. Комментарии

For Each WS In ThisWorkbook.Worksheets 
If WS.Name <> "Instructions" And WS.Name <> "Parameters" And WS.Name <> "BI Data & Worksheet" Then 

    'By doing this copy, Excel is opening an additional workbook. 
    'Let's call it "Book1" 
    'Book1 is now active 
    Sheets(WS.Name).Copy 
    For Each Cell In [b:b] 
    If Cell.Value = "~" Then Cell.ClearContents 
     'put any value you want here 
    Next Cell 

    'By doing this copy, Excel is opening an additional workbook. 
    'Let's call it "Book2". 
    'Book2 is now active. Book1 is no longer active. 
    Sheets(WS.Name).Copy 
    For Each Cell In [A:A] 
    If Cell.Value = "~" Then Cell.ClearContents 
     'put any value you want here 
    Next Cell 

    'This is working on the active workbook "Book2" 
    'Book1 is no longer active so it will not get saved or closed. 
    ActiveWorkbook.SaveAs Filename:=SaveToDirectory & WS.Name & ".csv", FileFormat:=xlCSV 
    ActiveWorkbook.Close SaveChanges:=False 
    ThisWorkbook.Activate 
End If 
Next 

Если вы делали копию только один раз, я думаю, что это будет работать так, как вы хотите.

Если вы хотите скопировать лист в ту же книгу, вы должны использовать аргумент After: = Sheets («SheetName»). Тогда вам не придется беспокоиться о закрытии книг.

Sheets(WS.name).Copy After:=Sheets("SomeSheetName") 
ActiveSheet.Name = "SomeNewSheetName" 

Надеюсь, что это поможет.

+0

Привет, Мэтью, благодарю вас за быстрый ответ. Это, безусловно, работает. Я бы заинтересовался тем, что я делаю неправильно с моим вложенным оператором if. –

+0

@Niels de Milliano Одновременно может быть активна только одна книга. Выполняя листы (WS.name).Скопируйте, вы открываете дополнительные книги, оставляя последнее неактивным. Я добавлю свой ответ, чтобы уточнить. Дай мне минуту. – MatthewD

0

спасибо! пятно на!

я удалил второй WS листов копии и все работает, как ожидалось:

На стороне записки: листы экспортировать в CSV есть формулы (вложенные если заявления) coppied вниз к строке 100000. Если выполняются определенные параметры, ячейки заполняются поиском другого cel на другом листе.

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

Отображая «~» в результате формулы, я могу полностью очистить ячейки до экспорта, используя вышеуказанный VBA.

Эта запятая в csv export for cel, содержащая fomula, но без содержимого, является проблемой, с которой многие сталкиваются, судя по количеству сообщений на форуме по этому вопросу. Надеюсь, этот трюк поможет кому-то.

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