2016-04-08 5 views
1

У меня есть модуль, который открывает 4 другие книги, переформатирует некоторые данные и вставляет их в текущую книгу, а затем закрывает другие книги.Excel VBA - «Application.DisplayAlerts = False» Сбой Excel

Когда я закрываю другие книги, я получаю DisplayAlert, спрашивающий меня, хочу ли я сохранить книгу. Я хочу остановить отображение DisplayAlert.

Рекомендация Майкрософт заключается в использовании:

Application.DisplayAlerts = False 
ActiveWorkbook.Close 
Application.DisplayAlerts = True 

Однако, когда я делаю это макрос врезается Excel каждый раз.

Если я прокомментирую строки DisplayAlerts, макрос работает отлично, за исключением того, что мне нужно иметь дело с «Вы хотите сохранить?». DisplayAlerts.

Любые идеи?

Код:

Function rngFoundLog(searchDate As Date) 

Set rngSearchLog = Workbooks("Ecom KPI.xlsm").Worksheets("Daily Update Log").Range("A:A") 
Set rngFoundLog = rngSearchLog.Find(What:=Sheet1.searchDate, LookIn:=xlValues, LookAt:=xlPart) 

End Function 

Function formatHourlies(fileName As String) As Object 

Dim fullFileName As String 
fullFileName = ActiveWorkbook.Path & "\Hourlies\" + fileName 
Workbooks.Open fileName:=fullFileName 

Workbooks(fileName).Worksheets("Top Line Metrics").Range("B9:H32").Copy 
Workbooks(fileName).Worksheets("Top Line Metrics").Range("A34").PasteSpecial Transpose:=True 

Workbooks(fileName).Worksheets("Top Line Metrics_0").Range("B9:H32").Copy 
Workbooks(fileName).Worksheets("Top Line Metrics").Range("Y34").PasteSpecial Transpose:=True 

Workbooks(fileName).Worksheets("Top Line Metrics_1").Range("N9:H32").Copy 
Workbooks(fileName).Worksheets("Top Line Metrics").Range("AW34").PasteSpecial Transpose:=True 

Workbooks(fileName).Worksheets("Top Line Metrics").Range("A34:BT40").Select 
Selection.Replace What:="-", Replacement:="0", LookAt:=xlPart, _ 
    SearchOrder:=xlByRows, MatchCase:=False 
Selection.Copy 

End Function 

Sub HourlyData() 

Application.Calculation = xlManual 
Application.ScreenUpdating = False 
'Application.DisplayAlerts = False 

Dim proxyServer As String 
Dim clientID As String 
Dim report_period As String 
Dim report_date As String 
Dim searchDate As Date 

Sheet1.proxyServer = Worksheets("Update Data").Range("H2").Value 
Sheet1.proxyStatus = Worksheets("Update Data").Range("H1").Value 
Sheet1.report_date = Worksheets("Update Data").Range("B2").Value 
Sheet1.searchDate = Worksheets("Update Data").Range("B3").Value 

Dim answer As Integer 
answer = MsgBox("Do you want to import the data?", vbYesNo + vbQuestion, "Import Data?") 
If answer = vbYes Then 

Dim StartTime As Double 
Dim MinutesElapsed As String 
Dim dateRange As Range 
StartTime = Timer 

reportDate = Worksheets("Update Data").Range("B3").Value 
searchDatev2 = reportDate - 7 

Set rngSearch = Worksheets("Business Objects").Range("A:A") 
Set rngFound = rngSearch.Find(What:=searchDatev2, LookIn:=xlValues, LookAt:=xlPart) 

Dim fileName As String 
fileName = "couk Hourlies.xlsx" 
formatHourlies (fileName) 
Workbooks("Ecom KPI.xlsm").Worksheets("Hourlies").Range("B" & rngFound.Row).PasteSpecial xlPasteValues 
Workbooks(fileName).Close 

fileName = "mcouk Hourlies.xlsx" 
formatHourlies (fileName) 
Workbooks("Ecom KPI.xlsm").Worksheets("Hourlies").Range("EQ" & rngFound.Row).PasteSpecial xlPasteValues 
Workbooks(fileName).Close 

fileName = "ie Hourlies.xlsx" 
formatHourlies (fileName) 
Workbooks("Ecom KPI.xlsm").Worksheets("Hourlies").Range("KF" & rngFound.Row).PasteSpecial xlPasteValues 
Workbooks(fileName).Close 

fileName = "mie Hourlies.xlsx" 
formatHourlies (fileName) 
Workbooks("Ecom KPI.xlsm").Worksheets("Hourlies").Range("PU" & rngFound.Row).PasteSpecial xlPasteValues 
Workbooks(fileName).Close 

Workbooks("Ecom KPI.xlsm").Worksheets("Daily Update Log").Range("T" & rngFoundLog(Sheet1.searchDate).Row).Value = Application.UserName 

MinutesElapsed = format((Timer - StartTime)/86400, "hh:mm:ss") 

MsgBox "Data Import Completed in " & MinutesElapsed 

Else 
'do nothing 

End If 

Application.ScreenUpdating = True 
Application.Calculation = xlAutomatic 
'Application.DisplayAlerts = True 

End Sub 
+1

В моем опыте вызов методов, таких как 'Workbooks.Open' внутри' Function', делает VBA неустойчивым. Вместо этого рассмотрите эти методы в 'Sub'. – xidgel

+0

@xidgel Вы уверены? Если вы не попытаетесь вызвать функцию из листа в качестве UDF, он должен делать все, что делает Sub, и многое другое. Я что-то упустил? – vacip

+0

@vacip Вы правы --- спасибо, что поймали мою ошибку. – xidgel

ответ

1

Я не хотел бы попробовать, чтобы закрыть активную рабочую книгу, но установить книгу и закрыть его:

Sub closeWorkbook() 
Dim workbookToClose As Workbook 

Application.DisplayAlerts = False 
Set workbookToClose = Workbooks("WorkbookToClose.xls") 
workbookClose.Close 
Application.DisplayAlerts = True 

End Sub 
1

Не могли бы вы оставить DisplayAlerts в, но для книг вы хотите закрыть установленный флаг ...

Так, например, незадолго до закрытия Someworkbook:

Someworkbook.Saved = true 

Это должно остановить окно сообщения с просьбой сохранить ...

Надежда, что помогает ..

4

Если вы не хотите, чтобы сохранить данные попробовать использовать ActiveWorkbook.Close False. Это закроет книгу без сохранения (без подсказок) и без использования линий DisplayAlerts. Вы также можете установить активную книгу на любое имя рабочей книги, которое вам нужно.

+0

Я чувствовал себя уверенно в этом решении, но потом он спрашивает меня: «У вас есть большой объем данных, скопированных в буфер обмена» .... ah well – megatron77

+0

Это потому, что вы используете 'PasteSpecial' в своем коде, который использует буфер обмена. вот ссылка с советами о том, как избежать использования буфера обмена: [http://stackoverflow.com/questions/3901045/vba-copy-paste-without-clipboard]. Надеюсь это поможет. –

0

Это происходило со мной, и я понял, что это происходит, потому что у меня открыт редактор VBA. Когда я закрыл редактор VBA, а затем запустил макрос, Excel не сработал.

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