2016-01-12 4 views
2

Я создал макрос, который сохраняет значение .xlsx-файла в csv в определенном каталоге с именем csv = с именем файла Excel, который был написан с.Сохранение активной рабочей книги при использовании макроса из надстройки

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

Я думаю, что я имею проблемы с ActiveWorkbook против ThisWorkbook.

Следующий код является оригинальным, который работает, как предполагалось, когда он не используется в качестве дополнения в:

Sub CSV() 

Dim WS As Excel.Worksheet 
Dim SaveToDirectory As String 

Dim CurrentWorkbook As String 
Dim CurrentFormat As Long 

CurrentWorkbook = ThisWorkbook.FullName 
CurrentFormat = ThisWorkbook.FileFormat 

SaveToDirectory = "C:\SomeDirectory\" 
For Each WS In ThisWorkbook.Worksheets 
    Sheets(WS.Name).Copy 
    ActiveWorkbook.SaveAs Filename:=SaveToDirectory & ThisWorkbook.Name & ".csv", FileFormat:=xlCSV 
    ActiveWorkbook.Close savechanges:=False 
    ThisWorkbook.Activate 
Next 

Application.DisplayAlerts = False 
ThisWorkbook.SaveAs Filename:=CurrentWorkbook, FileFormat:=CurrentFormat 
Application.DisplayAlerts = False 
End Sub 

Однако, если этот код используется в оных в файл сохраняет с именем оных в Поэтому я изменил код и использовал ActiveWorkbook, но, похоже, значение изменяется, когда пришло время для сохранения.

Sub CSV2() 

On Error GoTo error_handler 
Dim WS As Excel.Worksheet 
Dim SaveToDirectory As String 

Dim CurrentWorkbook As String 
Dim CurrentFormat As Long 

CurrentWorkbook = ActiveWorkbook.Name 
CurrentFormat = ActiveWorkbook.FileFormat 

SaveToDirectory = "C:\SomeDirectory\" 
For Each WS In ActiveWorkbook.Worksheets 
    Sheets(WS.Name).Copy 
    ActiveWorkbook.SaveAs Filename:=SaveToDirectory & ThisWorkbook.Name & ".csv", FileFormat:=xlCSV 
    ActiveWorkbook.Close savechanges:=False 
    ThisWorkbook.Activate 
Next 

Application.DisplayAlerts = False 
ActiveWorkbook.SaveAs Filename:=CurrentWorkbook, FileFormat:=CurrentFormat 
Application.DisplayAlerts = False 

error_handler: 
    MsgBox Err.Description 

End Sub 

Я хочу написать свой файл Excel в csv. Сохраните этот CSV в каталоге, который определен. С именем csv = имя файла, из которого поступает информация. И чтобы иметь возможность делать это в любой книге, которую я открываю.

+0

Почему вы не используете переменную 'CurrentWorkbook', которую вы храните ранее? 'ThisWorkbook' ссылается на файл, в котором находится код. – brainac

+0

Когда я пытался использовать переменную «CurrentWorkbook», при выполнении макроса было несколько разных ошибок. – jonnySQL

ответ

3

Попробуйте этот код:

Sub CSV2() 

On Error GoTo error_handler 
    Dim aWB As Workbook 
    Dim WS As Excel.Worksheet 
    Dim SaveToDirectory As String 

    Dim CurrentWorkbook As String 
    Dim CurrentFormat As Long 
    Set aWB = ActiveWorkbook 
    CurrentWorkbook = aWB.Name 
    CurrentFormat = aWB.FileFormat 

    SaveToDirectory = "C:\SomeDirectory\" 
    For Each WS In aWB.Worksheets 
    WS.Copy 
    ActiveWorkbook.SaveAs Filename:=SaveToDirectory & aWB.Name & "_" & WS.Name & ".csv", FileFormat:=xlCSV 
    ActiveWorkbook.Close savechanges:=False 
    'ThisWorkbook.Activate 
    Next 

    Application.DisplayAlerts = False 
    aWB.SaveAs Filename:=CurrentWorkbook, FileFormat:=CurrentFormat 
    Application.DisplayAlerts = False 

Exit Sub 
error_handler: 
    MsgBox Err.Description 

End Sub 

добавить ws.name после awb.name, чтобы предотвратить такое же имя файла.

+1

Ваш взгляд хороший, но я бы не сохранил исходный файл. Я также хотел бы сократить использование ActiveWorkbook до минимума (я не хочу захватить ваше решение) – brainac

+1

@brainac, спасибо за комментарий, если мы хотим сохранить исходный файл, мы можем использовать: 'awb.save', когда мы используйте 'ActiveWorkbook' в этом коде, это не оригинальный файл, это новая книга, которую мы создали с помощью' ws.copy', поэтому мы не можем использовать 'awb.saveas Filename: = ...' вместо 'ActiveWorkbook. SaveAs Имя файла: = .... ' – Fadi

+0

Я назвал эту часть' aWB.SaveAs Filename: = CurrentWorkbook, FileFormat: = CurrentFormat'. Это то, что сделал OP, но я не уверен, действительно ли он это имел в виду. – brainac

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