2015-07-08 3 views
1

Я создал макрос, который должен обновлять все источники данных. Источниками данных являются серверы sql, и по мере необходимости автоматически подтягивает окно пароля. Если вы уже вводили пароль на сервер с момента последнего открытия Excel, он не запрашивает пароль.Обновление книги и сохранение с помощью VBA

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

Sub BSR_Refresher() 
'Refreshes the spreadsheet and copies it with today's date 

'Clears all filters 

On Error Resume Next 
ActiveWorkbook.ShowAllData 


'Refreshes Spreadsheet 

    For Each objConnection In ThisWorkbook.Connections 
    'Get current background-refresh value 
    bBackground = objConnection.OLEDBConnection.BackgroundQuery 

    'Temporarily disable background-refresh 
    objConnection.OLEDBConnection.BackgroundQuery = False 

    'Refresh this connection 
    objConnection.Refresh 

    'Set background-refresh value back to original value 
    objConnection.OLEDBConnection.BackgroundQuery = bBackground 
    Next 

'Saves Spreadsheet 

ActiveWorkbook.SaveAs Filename:=ActiveWorkbook.Path & "\\Company.local\AnyDrive\Company\Projects\Project001\Reporting\Report Updates" & Format(Date, ddmmyyyy) & ".xls" 
     End Sub 

Из моего знания VBA этого необходимо сделать следующее:

1) Очистить все фильтры из таблиц

2) запустить обновление данных (списаны из Here)

3) Сохранить в \\Company.local\AnyDrive\Company\Projects\Project001\Reporting\Report Updates (подделка имена, фактическая структура) с именем файла как FileName 08/07/2015 (где FileName - текущее имя файла)

Любые подсказки относительно того, почему это так?

EDIT:

Согласно комментариям, его не сохранения документов, как я требую.

==================

Я изменил код, и это до сих пор не работает. Я перемещал ситуацию, поскольку цикл приводил к повторному удалению одного из листов из-за добавления шага «удалить лист».

Sub BSR_Refresher() 
'Refreshes the spreadsheet and copies it with today's date 

' Gets name to save new workbook as 
    Dim StrSaveName As String 
    Dim StrFolderPath As String 
    StrSaveName = "Report" & Format(Date, ddmmyyyy) & ".xlsx" 
    StrFolderPath = "\\Company.local\anyDrive\Company\Projects\Project-001\Reporting\Status Report Updates\" 
    StrSaveAs = StrFolderPath & StrSaveName 
'Deletes Sheet1, Clears all filters 

Application.DisplayAlerts = False 

    Sheets("Sheet1").Select 
    ActiveWindow.SelectedSheets.Delete 

Application.DisplayAlerts = True 

'Refreshes Spreadsheet 
On Error Resume Next 
ActiveWorkbook.ShowAllData 

    For Each objConnection In ThisWorkbook.Connections 
     'Get current background-refresh value 
     bBackground = objConnection.OLEDBConnection.BackgroundQuery 

     'Temporarily disable background-refresh 
     objConnection.OLEDBConnection.BackgroundQuery = False 

     'Refresh this connection 
     objConnection.Refresh 

     'Set background-refresh value back to original value 
     objConnection.OLEDBConnection.BackgroundQuery = bBackground 
Next 

'Saves Spreadsheet 

ActiveWorkbook.SaveAs Filename:=StrSaveAs 


End Sub 

Моя проблема заключается в том, что он, кажется, не экономить, где оно должно быть: S

+1

Почему именно? Что происходит не так, как ожидалось? – eirikdaude

+1

Вы упомянули, что он должен делать, но не то, что ему не удалось. Мне лично нравится переключать все свойства «Backgroundquery» на «False», а затем запускать метод «RefreshAll». Я хочу, чтобы мои таблицы также задавались в запросах. – user3819867

+1

'ActiveWorkbook.SaveAs Имя файла: = ActiveWorkbook.Path &" \\ Company.local \ AnyDrive \ Company \ Projects \ Project001 \ Отчетность \ Отчетные обновления "& Формат (Date, ddmmyyyy) &" .xls "' 'ActiveWorkbook. «Путь» вернет путь к файлам книг, а затем добавит еще один путь к файлу? Таким образом, похоже, что он будет отлаживать этот шаг. –

ответ

1
ActiveWorkbook.Path & "\\Company.local 

Double «\» знак это ваша проблема. Вырежьте один из них, и вы должны быть в порядке (или, по крайней мере, вы перейдете к какой-либо другой проблеме, если окажется, что есть один позже).

Кроме того, вызов вашего проекта Project-001 укусит вас, если у вас есть несколько проектов, и вы не можете вспомнить, какое число делает что. Лучше всего начинать давать правильные описательные имена прямо в начале.


Edit: Вы не определяете формат файла в вашем SaveAs - это может вызвать проблемы. Будет ли такой код помогать?

Sub TestSave() 

    Dim savepath As String 

    savepath = ThisWorkbook.Path & "\\testdir\" & "test.xlsm" 

    ThisWorkbook.SaveAs Filename:=savepath, FileFormat:=52 

End Sub 

51 является XLSX, 52 XLSM, 56 XLS

+0

Jacek. Имена в этом примере были отредактированы и заменены образцовыми, чтобы избежать возможных проблем с DPA. Вряд ли я знаю, но лучше безопасно, чем жаль! – Miller86

+0

Кроме того, я скопировал эту часть кода из той же работы, которую я сделал, которая действительно работает, поэтому причина моего озадачивания :) – Miller86

+0

Интересно. Протестировано это, и действительно, Excel игнорирует дополнительные «/», даже если их несколько. Каждый день можно узнать новые вещи :) –

1

Вы не можете включать слэш в именах файлов Windows. Вам не хватает речевых меток в функции Format. Изменить этот код:

StrSaveName = "Report" & Format(Date, ddmmyyyy) & ".xlsx" 

To:

StrSaveName = "Report" & Format(Date, "ddmmyyyy") & ".xlsx" 

, чтобы получить дату как 08072015.

+0

Сохранение вещь работает в другом месте! Я просто вытащил эту часть кода из другого места! По моему мнению, использование пути к папке в файле save означает, что VBA знает, где сохранить документ, или, по крайней мере, это было моим пониманием, и он отлично работает для другого макроса, который я написал, который откладывает другой отчет в другая папка. – Miller86

+0

Действительно? Имя файла с косой чертой * в * имя файла (** не ** путь к папке)? Итак, вы пробовали переходить через ваш код с помощью F8? Добавьте 'Debug.Print StrSaveAs' непосредственно перед тем, как попытаться сохранить файл. – ChipsLetten

+0

Я попробую это сейчас, но только для вашей справки, удалив среднюю часть моего кода и изменив тип файла на тип рабочей книги с поддержкой макроса, означает, что документ сохраняет в целевой папке. – Miller86

0

OK. Благодаря Яцеку и Чипсам мне удалось справиться с этим VBA.

Похоже, что я отформатировал данные «сохранить как» неправильно. Ниже приведен рабочий макрос, если кто-то еще сталкивается с проблемой :)

Следующий шаг для меня - показать/скрыть, поэтому единственное, что отображается при записи в книгу, - это страница обновления электронной таблицы. Я отправлю код для этого позже в качестве дополнительного комментария.

Sub Spreadsheet_Refresher() 

'Refreshes the spreadsheet and copies it with today's date 

' Gets name to save new workbook as 
    Dim StrSaveName As String 
    Dim StrFolderPath As String 
StrSaveName = "Report" & " " & Format(Date, "dd-mm-yyyy") & ".xlsm" 
    StrFolderPath = "\\Company.local\AnyDrive\Company\Projects\001\Reporting\Status Report Updates\" 
    StrSaveAs = StrFolderPath & StrSaveName 

'Deletes Update Spreadsheet worksheet 

Application.DisplayAlerts = False 

    Sheets("Update Spreadsheet").Select 
    ActiveWindow.SelectedSheets.Delete 

Application.DisplayAlerts = True 

'Refreshes Spreadsheet 

    For Each objConnection In ThisWorkbook.Connections 
    'Get current background-refresh value 
    bBackground = objConnection.OLEDBConnection.BackgroundQuery 

    'Temporarily disable background-refresh 
    objConnection.OLEDBConnection.BackgroundQuery = False 

    'Refresh this connection 
    objConnection.Refresh 

    'Set background-refresh value back to original value 
    objConnection.OLEDBConnection.BackgroundQuery = bBackground 
    Next 




'Saves Spreadsheet 

ActiveWorkbook.SaveAs Filename:=StrSaveAs 


End Sub 
+0

Код: 'Таблицы (« Январь »). Visible = True' - заменить« Январь »на любой лист, который вы хотите показать, и если вы хотите скрыть вместо show, просто замените' true' на 'false' – Miller86

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