2013-03-22 2 views
1

У меня есть вызов, по крайней мере для меня, я не могу иметь дело с очевидным. Может ли кто-нибудь помочь мне или сообщить, как сделать макрос, когда Excel закрыт?VBA Запуск, когда Excel закрыт

Как я могу сделать макрос, когда Excel закрыт через VBA?

Sub Upload0() 
    ' Upload Webpage content 
    Application.OnTime Now + TimeValue("00:00:15"), "Upload0" 

    With ActiveSheet.QueryTables.Add(Connection:= _ 
     "URL;http://cetatenie.just.ro/ordine/articol-11", Destination:=Range("A1")) 
     .Name = "CetatenieOrdine" 
     .FieldNames = True 
     .RowNumbers = False 
     .FillAdjacentFormulas = False 
     .PreserveFormatting = True 
     .RefreshOnFileOpen = True 
     .BackgroundQuery = True 
     .RefreshStyle = xlOverwriteCells 
     .SavePassword = True 
     .SaveData = True 
     .AdjustColumnWidth = True 
     .RefreshPeriod = 1 
     .WebSelectionType = xlEntirePage 
     .WebFormatting = xlWebFormattingNone 
     .WebPreFormattedTextToColumns = True 
     .WebConsecutiveDelimitersAsOne = True 
     .WebSingleBlockTextImport = False 
     .WebDisableDateRecognition = False 
     .WebDisableRedirections = False 
     .Refresh BackgroundQuery:=False 
    End With 

' Deletes empty cells 
Columns("A:A").Select 
Selection.SpecialCells(xlCellTypeBlanks).Select 
Selection.Delete Shift:=xlUp 

' Adjust column width and delet useless rows 
Rows("1:31").Select 
Selection.Delete Shift:=xlUp 
Range("B28").Select 
Selection.End(xlDown).Select 
Rows("17:309").Select 
Selection.Delete Shift:=xlUp 

End Sub 

Большое спасибо всем!

+0

Куда вы планируете выполнить этот макрос, если книга закрыта. VBScript? VB.Net? Что-то другое? –

+0

1. Вы говорите о workSHEET или workBOOK? Связан ли макрос с листом, о котором идет речь? 2. Я думаю, вы должны попробовать форматировать код вручную, так как скобки {} кода не делают его более читабельным. – pn7a

+0

Appologizes, вы правы: для WORKBOOK, когда он закрыт: имя книги - Book1.xls – maximladus

ответ

1

1: Определить булевский флаг в модуле Public blnClosedVBA as Boolean и установить его в соответствии с вашей процедурой VBA перед закрытием книги. Затем в Workbook_BeforeClose обработчик событий (под ThisWorkbook), сделайте следующее:

If blnClosedVBA = True Then 
Cancel = True 'Stops the workbook from closing 
'Rest of your code here 
blnClosedVBA = False ' Set so next time you try to close the workbook, it actually closes 
'Workbook.Close or ThisWorkbook.Close - depends on your answer to my question below 

Это будет запускать процедуру только если вы вызвали событие закрытия самостоятельно. В конце процедуры установка флага на False и запуск другого Workbook.Close закроет книгу

2: На какую рабочую книгу она должна работать? Должна ли быть «ThisWorkbook» (та, из которой вы используете код), «ActiveWorkbook» (один активирован) или другой?

+0

Привет, Мэтт, и спасибо вам до сих пор! Мне нужно только для Book1.xls, потому что я написал свой макрос в модуле, он не работает, когда я перемещаю его в ThisWorkbook. – maximladus

+0

Да, вы должны оставить свой текущий код в модуле, а затем в этой книге, вам нужно будет изменить событие BeforeClose. Там вы можете позвонить в свою Upload0, заменив строку 'Остаток кода здесь 'в моем ответе с' Upload0'. – MattCrum

+0

Чтобы подтвердить, что вы хотите запустить свой код, когда книга закрыта VIA VBA (т. Е. С помощью ThisWorkbook.Close). Вы не хотите, чтобы код работал, когда рабочая книга уже закрыта ...? – MattCrum

1

1. Как сделать макрос, когда рабочая книга закрыта через VBA?

Короткий ответ: вы не можете этого сделать. Ваш код является частью рабочей книги, и он не может работать, если книга не загружена в Excel. Возможно, вы сможете переместить код в отдельную рабочую книгу надстройки, которую вы выбираете по умолчанию (используя «Параметры Excel» надстройки) при запуске Excel. Но Excel все равно должен работать где-то на вашем компьютере.

Вы можете написать совершенно отдельную программу, которая делает то, что вы хотите, записывая результаты веб-запроса в книгу Excel. Я предполагаю, что вы хотите, чтобы книга всегда содержала обновленные данные, когда она ссылается сама (когда Excel работает) или какой-либо другой ресурс. Если вы можете приобрести копию Visual Basic 6 (возможно, этого не будет возможно), то это в основном синтаксически совпадает с VBA. Следующим ближайшим будет VB.Net. Это будет технически несколько сложным.

2.Also, у меня есть проблема, делая этот макрос работает только для одной книги, но не активных из них:

Это один мы может дела с: строками:

With ActiveSheet.QueryTables.Add(Connection:= _ 

означает, что следующий код всегда будет работать против листа, который имеет фокус (т.е. является «активным» - листом, который будет получать ввод с клавиатуры, если вы набрали что-то). Вот что делает ActiveSheet. Попробуйте заменить `ActiveSheet with something like ThisWorkbook.Sheet1 , where Sheet1` - это имя для листа, которое вы видите в окне «Свойства» в редакторе VBA, где указано «(Имя)».

+0

Привет, Майк, проблема все еще существует, например, если у меня есть еще один excel, или я работаю с другим файлом, тогда Macro запускается для этого файла, в котором я работаю, и если я не делаю У меня есть имя листа, которое правильно упоминается, чем оно задыхается ... – maximladus

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