2016-04-08 15 views
1

Ich habe ein Modul, das 4 andere Arbeitsmappen öffnet, formatiert einige der Daten und fügt sie in die aktuelle Arbeitsmappe und schließt dann die anderen Arbeitsmappen.Excel VBA - "Application.DisplayAlerts = False" Absturz Excel

Wenn ich die anderen Arbeitsmappen schließe, bekomme ich ein DisplayAlert, das mich fragt, ob ich die Arbeitsmappe speichern möchte. Ich möchte den DisplayAlert stoppen.

Die Empfehlung von Microsoft zu verwenden:

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

Jedoch, wenn ich dies tun, das Makro stürzt Excel jedes Mal.

Wenn ich die DisplayAlerts Zeilen auskommentieren, läuft das Makro gut, außer ich muss mit dem "Möchten Sie speichern?" DisplayAlerts.

Irgendwelche Ideen?

Code:

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

Meiner Erfahrung nach machen Aufrufmethoden wie 'Workbooks.Open' innerhalb einer' Funktion' VBA instabil. Erwägen Sie stattdessen, diese Methoden innerhalb eines "Sub" aufzurufen. – xidgel

+0

@xidgel Sind Sie sicher? Wenn Sie nicht versuchen, die Funktion von einem Arbeitsblatt aus als UDF aufzurufen, sollen Sie alles tun, was ein Sub tut, und mehr. Fehle ich hier etwas? – vacip

+0

@vacip Du hast Recht --- Danke, dass du meinen Fehler gefunden hast. – xidgel

Antwort

1

würde ich nicht versuchen, die aktive Arbeitsmappe zu schließen, aber die Arbeitsmappe und schließen:

Sub closeWorkbook() 
Dim workbookToClose As Workbook 

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

End Sub 
1

Könnten Sie die Displayalerts in, aber für die Arbeitsmappe verlassen Sie möchten die gespeicherte Flagge schließen ...

So zum Beispiel, kurz bevor Sie Someworkbook schließen:

Someworkbook.Saved = true 

dass das Meldungsfeld sollte aufhören zu fragen Sie speichern ...

Hoffnung, dass ..

4

hilft, wenn Sie nicht wollen, um die Daten zu speichern versuchen ActiveWorkbook.Close False verwenden. Dies schließt die Arbeitsmappe ohne zu speichern (keine Eingabeaufforderungen) und ohne die DisplayAlerts-Zeilen zu verwenden. Sie können die aktive Arbeitsmappe auch auf den Namen Ihrer Arbeitsmappe einstellen.

+0

Ich fühlte mich positiv über diese Lösung, aber dann fragt es mich "Sie haben eine große Menge an Daten in die Zwischenablage kopiert" .... ah gut – megatron77

+0

Dies ist, weil Sie 'PasteSpecial' in Ihrem Code verwenden, der die Zwischenablage verwendet. Hier finden Sie einen Link mit Tipps zur Vermeidung der Verwendung der Zwischenablage: [http://stackoverflow.com/questions/3901045/vba-copy-paste-without-clipboard]. Hoffe das hilft. –

0

Dies geschah mit mir und ich erkannte, dass es passierte, weil ich den VBA-Editor geöffnet hatte. Wenn ich den VBA-Editor schloss und den Makro ausführte, stürzte Excel nicht ab.