Excel миф on time

Выполнение процедуры VBA Excel без аргументов в назначенное время или через определенный промежуток времени с помощью метода Application.OnTime.

Application.OnTime EarliestTime, Procedure, LatestTime, Schedule

Параметры метода Application.OnTime

Основные параметры:

  1. EarliestTime – время, когда необходимо выполнить указанную процедуру.
  2. Procedure – имя выполняемой процедуры.

Процедура Procedure не должна иметь аргументов и не может быть объявлена в модуле формы.

В качестве аргументов параметра EarliestTime используются следующие функции:

  • TimeValue(«hh:mm:ss») – чтобы запланировать выполнение указанной процедуры в определенное время суток.
  • Now + TimeValue(«hh:mm:ss») – чтобы запланировать выполнение указанной процедуры по истечении заданного времени с момента запуска процедуры с методом Application.OnTime.

Дополнительные параметры:

  1. LatestTime – интервал времени, в течение которого можно запустить указанную процедуру, если Microsoft Excel в назначенное время выполняет другую процедуру. По умолчанию указанная процедура будет запущена в любом случае после завершения предыдущей процедуры. Подробнее об этом читайте на сайте разработчика.
  2. Schedule – если задано значение True, будет запланировано выполнение указанной процедуры, False – очистка ранее установленной процедуры. Значение по умолчанию – True.

Параметр LatestTime я не тестировал, а вот любое применение параметра Schedule в значении False у меня в Excel 2016 вызывает ошибку. Поэтому в примерах я эти параметры не использую.

Примеры выполнения процедур по времени

Пример 1
Однократный запуск внешней процедуры через заданный промежуток времени:

Sub Primer1()

    Application.OnTime Now + TimeValue(«00:00:10»), «Procedure1»

End Sub

Sub Procedure1()

    MsgBox «Процедура запущена!»

End Sub

Процедура Procedure1 будет выполнена через 10 секунд после запуска процедуры Primer1.

Пример 2
Однократный запуск внешней процедуры в заданное время:

Sub Primer2()

    Application.OnTime TimeValue(«12:00:00»), «Procedure2»

End Sub

Sub Procedure2()

    MsgBox «Системное время — 12 часов!»

End Sub

Процедура Procedure2 будет выполнена в 12 часов по системному времени компьютера, если ранее была запущена процедура Primer2.

Пример 3
Многократный запуск внешней процедуры:

Sub Primer3()

    Application.OnTime Now + TimeValue(«00:00:01»), «Procedure3»

End Sub

Sub Procedure3()

    Cells(1, 1) = Cells(1, 1) + 1

        If Cells(1, 1) = 100 Then Exit Sub

    Call Primer3

End Sub

Процедура Primer3 запускает «условно бесконечный» секундомер в ячейке A1 активного рабочего листа, ограниченный 100 секундами с помощью условия.

Пример 4
Сохранение рабочей книги Excel каждые 10 минут:

Sub Primer4()

    Application.OnTime Now + TimeValue(«00:10:00»), «Procedure4»

End Sub

Sub Procedure4()

    ThisWorkbook.Save

    Call Primer4

End Sub

Процедуры Primer4() и Procedure4() будут работать в бесконечном цикле, сохраняя рабочую книгу Excel каждые 10 минут, до закрытия этой книги. Закрывать книгу следует не менее, чем через 10 минут после внесения последних изменений, для гарантированного их сохранения.


title keywords f1_keywords ms.prod api_name ms.assetid ms.date ms.localizationpriority

Application.OnTime method (Excel)

vbaxl10.chm133184

vbaxl10.chm133184

excel

Excel.Application.OnTime

31268da0-8ec7-7169-a1d0-8db34b3385cd

04/05/2019

medium

Application.OnTime method (Excel)

Schedules a procedure to be run at a specified time in the future (either at a specific time of day or after a specific amount of time has passed).

Syntax

expression.OnTime (EarliestTime, Procedure, LatestTime, Schedule)

expression A variable that represents an Application object.

Parameters

Name Required/Optional Data type Description
EarliestTime Required Variant The time when you want this procedure to be run.
Procedure Required String The name of the procedure to be run.
LatestTime Optional Variant The latest time at which the procedure can be run. For example, if LatestTime is set to EarliestTime + 30 and Microsoft Excel is not in Ready, Copy, Cut, or Find mode at EarliestTime because another procedure is running, Excel will wait 30 seconds for the first procedure to complete. If Excel is not in Ready mode within 30 seconds, the procedure won’t be run. If this argument is omitted, Excel will wait until the procedure can be run.
Schedule Optional Variant True to schedule a new OnTime procedure. False to clear a previously set procedure. The default value is True.

Remarks

Use Now + TimeValue(time) to schedule something to be run when a specific amount of time (counting from now) has elapsed. Use TimeValue(time) to schedule something to be run a specific time.

The value of EarliestTime is rounded to the closest second.

Set Schedule to False to clear a procedure previously set with the same Procedure and EarliestTime values.

Procedure must take no arguments and cannot be declared in a custom class or form.

Example

This example runs my_Procedure 15 seconds from now.

Application.OnTime Now + TimeValue("00:00:15"), "my_Procedure"

This example runs my_Procedure at 5 P.M.

Application.OnTime TimeValue("17:00:00"), "my_Procedure"

This example cancels the OnTime setting from the previous example.

Application.OnTime EarliestTime:=TimeValue("17:00:00"), _ 
 Procedure:="my_Procedure", Schedule:=False

[!includeSupport and feedback]

If you need Excel to run some VBA at a specific time, or repeatedly at set intervals, you can use the Application.OnTime method.

A basic call to Ontime requires that you supply a time when you want the code to run, and the name of the macro you want to run.

basic ontime call

The argument EarliestTime is called this because Excel will actually execute the Procedure no earlier than EarliestTime, but possibly later.

There’s no guarantee that your scheduled macro will run exactly when you want because Excel may be busy doing something else.

It may be executing some other VBA, or you may be entering data into a sheet (Enter mode). If Excel is not in Ready, Copy, Cut or Find mode, execution of your scheduled macro may be delayed.

There are two optional arguments, LatestTime and Schedule.

ontime call with all arguments

As we’ve just seen, Excel may not run your macro exactly at the time you want. By specifying LatestTime, we’re giving Excel a window, between EarliestTime and LatestTime, during which you want it to run your VBA.

If your scheduled code is delayed, and Excel is only ready to execute the macro after LatestTime, then it won’t run it at all.

The value of Schedule indicates whether your are setting a task (True), or cancelling one (False).

The default value is True so there’s no need to specify Schedule unless you are cancelling a previously set task.

Cancelling OnTime

If you want to cancel an OnTime task once you’ve scheduled it, you can do so like this

cancelling ontime

Cancelling OnTime requires that you specify the name of the macro, and exact time it is set to run. This means you need to store both of these somewhere.

Excel doesn’t provide any way for you to check what macros are scheduled to run, so you must keep track of these things yourself.

The easiest way would be to store the values in public variables/constants, or on a worksheet. Although you could store them in the registry if you want.

Download Example Workbook

Enter your email address below to download the sample workbook.

By submitting your email address you agree that we can email you our Excel newsletter.

Running Code at Set Intervals

If you want to repeatedly run the same macro at set periods you make the macro call itself.

First, write the macro that sets the OnTime schedule, I’m calling it SetOnTime. This macro will set a schedule for a macro called MyCode.

Then write the MyCode macro, which has the code you want to execute, and a call to SetOnTime.

When you run SetOnTime it sets the OnTime call, which when it runs, calls MyCode.

MyCode then calls SetOnTime again, and so on ……..

Running OnTime at set intervals

Specifying the Time

Time in Excel is a funny old thing and often causes a lot of confusion.

If you understand the way time is stored as serial number you can set an OnTime task like this

5 Seconds from Now

ontime 5 seconds from now

1 Hour from Now

ontime 1 hour from now

1 Day from Now

ontime 1 day from now

Or you can use TimeValue and TimeSerial to set a task for a particular time from now.

TimeValue : 1 hour 15 mins From Now

timevalue 1 hour 15mins from now

TimeSerial : 45 seconds From Now

timeserial 45 seconds from now

If you want to set a macro to run at a specific time, use Timevalue.

TimeValue : Run at 8.30pm.

timevalue run at specific time

Storing Time in a Public Constant

Of course if you are setting something to run at intervals you can use a public constant and store the interval in that.

I’ve declared a public constant called Interval and set it to 5.

By using TimeSerial I can set the interval that the macro runs at to every 5 seconds.

using public constant for interval

Multiple OnTime Tasks

You can set multiple tasks to run using OnTime. But remember that you need to keep a record of them if you want to be able to programatically unschedule them.

Running a Macro from a Closed Workbook

If you schedule a macro and then close the workbook containing the macro, Excel will try to open that workbook before running the macro.

In this scenario, if the workbook is not in a trusted location, you may find that macros in the workbook are disabled, and the scheduled macro will not run.

When Scheduled Tasks Won’t Run

A scheduled macro won’t run if the Excel application is closed.

A scheduled task will not execute in break mode. If you are debugging your VBA, like stepping through code, or a VBA routine has caused an error and you have started to debug it, scheduled tasks won’t execute and you’ll get an error telling you so.

break mode

If another VBA routine has caused an unhandled error and halted, scheduled tasks won’t execute until that error is acknowledged and Ended.

end the code not debug

vba application ontime

One of the many useful features of Excel and other MS Office applications, of which little users know of is the VBA OnTime function. It allows you to execute any Excel VBA procedure after the specified amount of time (delay). Using it recursively allows you to create a recurring / repeating event which lets you schedule periodic VBA Macros to run when working on Excel Workbooks.

Application OnTime Syntax

The syntax of the VBA OnTime function:

Application.OnTime( EarliestTime, Procedure, LatestTime, Schedule)

EarliestTime
The time (Date variable) when the Procedure is to be executed

Procedure
A string with the name of the Procedure which is to be executed

LatestTime
Optional. This is the latest time when the Procedure should be executed. This allows Excel for some flexibility when prioritizing Procedure execution together with other Excel (or other MS Office applications) Events such as Cut, Copy or Find. It makes sense to use this variable when your user is working on the file, so as not to interrupt any activities

Schedule
Optional. Defaults to True. If True schedules a new OnTime procedure. If False clears a previously set procedure. Useful when you want to cancel a previously scheduled Procedure

The code below will schedule the HelloWorld Sub to run in 1 seconds.

Sub SetAlarm()
    Dim timeout As Date
    timeout = TimeValue("20:40:50")
    Application.OnTime timeout, "WhatHour"
End Sub
 
Sub WhatHour()
    Call MsgBox("The time is " & Format(Now(), "HH:MM"))
End Sub

From above the following are equivalent:

Application.OnTime timeout, "WhatHour"
Application.OnTime EarliestTime:=timeOut, Procedure:="WhatHour", Schedule:=True

Wait 1 second and expect a Message Box to open with the message “Hello World!”.

Cancelling Application OnTime

You can also use the Application OnTime function to Cancel Scheduled Procedures.

Sub ScheduleAndCancelHelloWorld()
    Dim timeout As Date
    timeout = Now + TimeValue("00:00:10")
    Application.OnTime timeout, "HelloWorld"
    '...
    Application.OnTime timeout, "HelloWorld", False
End Sub

Sub HelloWorld()
    Call MsgBox("Hello World")
End Sub

Example 1: Automatic worksheet recalculate using OnTime

The Timer can come in handy when we need to refresh our worksheet(s) periodically and do not want to do this manually. See the example below:

Let us add this procedure in any VBA module within the workbook:

Sub Refresh()
    Application.CalculateFull
    Dim timeout As Date
    timeout = Now + TimeValue("00:00:10")
    Application.OnTime timeout, "Refresh"
End Sub

Next add this to the Workbook in the “Microsoft Excel Objects” section of the VBA project:

Private Sub Workbook_Open()
    Refresh
End Sub

That is it! Once you open the workbook the whole workbook will be recalculated every 10 seconds. In order to stop it simply close the workbook or debug the Refresh procedure.

Example 2: Automatic workbook versioning using OnTime

Working on a large Excel solution and afraid that you workbook will crash? Want to have a separate backup copy of your file every now and then. Why not use automatic file versioning then?

Add this code to any VBA module:

Sub SaveNewVersion()
    Dim fileName As String, index As Long
    If InStr(ActiveWorkbook.Name, "_v") = 0 Then
        fileName = ActiveWorkbook.Path & "" & Left(ActiveWorkbook.Name, InStr(ActiveWorkbook.Name, ".") - 1) & "_v1.xlsm"
        ActiveWorkbook.SaveAs (fileName)
    Else
        index = CInt(Split(Right(ActiveWorkbook.Name, Len(ActiveWorkbook.Name) - InStr(ActiveWorkbook.Name, "_v") - 1), ".")(0))
        index = index + 1
        fileName = ActiveWorkbook.Path & "" & Left(ActiveWorkbook.Name, InStr(ActiveWorkbook.Name, "_v") - 1) & "_v" & index & ".xlsm"
    End If
    ActiveWorkbook.SaveAs (fileName)
End Sub

Next replace the Refresh function with this:

Sub Refresh()
    SaveNewVersion
    Dim timeout As Date
    timeout = Now + TimeValue("00:10:00")
    Application.OnTime timeout, "Refresh"
End Sub

Voila! Your workbook will be saved as a new version every 10 minutes. Great isn’t? There are probably a ton of ways you can further tweak this to work better e.g. add a pop-up asking to confirm the creation of the next version etc.

Hope that this will prove useful to you! Let me know!

Содержание

  1. Schedule a Macro with VBA Application.OnTime
  2. The VBA Tutorials Blog
  3. The Application.OnTime Method
  4. Scheduling the Macro
  5. Specific Times
  6. Relative Times
  7. Specifying the Macro
  8. Scheduling Macros in Other Workbooks
  9. Scheduling Macros in Closed Workbooks
  10. Automation and Recursion
  11. Continuity and Canceling
  12. Stability
  13. Conclusion
  14. VBA Excel. Метод Application.OnTime
  15. Синтаксис метода Application.OnTime
  16. Параметры метода Application.OnTime
  17. Примеры выполнения процедур по времени

Schedule a Macro with VBA Application.OnTime

The VBA Tutorials Blog

Programmers love to make things more efficient. Pushing buttons just to make a code run is particularly annoying, especially when the code is supposed to run at the same time every time. Fortunately, Excel makes scheduled macro automation simple with the Application.OnTime method.

The Application.OnTime Method

The Application.OnTime method is part of the Application object, which means it lives inside Excel’s main application. If you’re using Intellisense, when you type Application.OnTime , you should see this:

Notice there are four arguments, two of which are optional:

  • EarliestTime is the time you want your specified macro to start running
  • Procedure is the name of the macro you want to call, which can be in the same workbook or another workbook
  • LatestTime is optional, and it specifies the last time the macro can be run. It puts a limit or deadline on the latest time Excel will attempt to start the macro, and if the deadline is missed, the macro is not executed
  • Schedule is used for canceling previously scheduled OnTime macros

Scheduling the Macro

There are many ways to schedule your macros to run using the OnTime method. The most common ways are via specific times (1am, 11:45, 19:30) or a time relative to the existing time. You can also make other scheduling decisions, like scheduling a macro to run relative to a future date based on some user input.

Again, the argument EarliestTime is your start time, and the scheduling mechanism will try to execute the specified macro at this time. As long as nothing prevents the called macro from running, this is synonymous with the start time. Conversely, if there is something preventing the called macro from running, LatestTime is essentially the time at which Excel stops trying to run the macro.

Specific Times

If a task must be run every day at the same time, it makes sense to apply the specific time technique. Let’s say you have to run a macro every day at 7am before you come into the office. You would execute a code snippet like this to make sure your macro runs before you even arrive:

In this example, early_morning_task is the name of the macro you have to run at 7am.

You could also use the TimeSerial function or the CDate function if you were grabbing your times from user-input variables:

Make powerful macros with our free VBA Developer Kit

It’s easy to copy and paste a macro like this, but it’s harder make one on your own. To help you make macros like this, we built a free VBA Developer Kit and wrote the Big Book of Excel VBA Macros full of hundreds of pre-built macros to help you master file I/O, arrays, strings and more — grab your free copy below.

Notice the use of CInt to ensure the value going into TimeSerial is an integer. Also, note that this setup uses 24-hour format, and you will need to account for that by explicitly forcing users to use 24-hour formats, making an educated guess (programmatically!), or by offering the option of entering AM/PM and calculating the 24-hour format of the input.

Relative Times

You can also schedule macros to run at relative times. The most common way is to schedule it relative to the current time. You would do this by using the Now function to grab the current time then adding some amount of time to it.

The DateAdd function is a good option if you want to add two times together, and it plays well with the Now function. The following snippet fires off the macro nseconds from now, where nseconds is determined by the user.

If you’re scheduling over longer time periods, you can change the “s” to an “m” for minutes or “h” for hours and adjust the prompt.

Remember that a macro is executed line-by-line, so if the InputBox opens at 19:33:09 and the user waits 10 seconds then enters 15, the macro will fire at 19:33:34, not at 19:33:24.

Specifying the Macro

When you only have a single workbook, you can reference the macro directly by using its name. To write more robust code, you can specify the module to ensure no future changes to the workbook, like adding another module with an identically-named macro, will cause issues.

In this snippet, we are running the macro_to_schedule from Module2. If the Application.OnTime line runs in Module1 and there is a macro entitled macro_to_schedule there, we must specify we want the identically-named macro from Module2 . It’s certainly allowed, but I don’t recommend naming your macros exactly the same in different modules because it can become confusing for a human.

Scheduling Macros in Other Workbooks

Believe it or not, you can extend the Application.OnTime method to other workbooks, even if they have identically-named macros. I have plenty of workbooks that have subroutines named main , for example.

Keep in mind that Application.OnTime lives at the application level and schedules there, so you can run the OnTime method from one workbook and it will execute macros in another workbook as long as you properly specify the name of the other workbook. A call to a workbook named Other Workbook.xlsm with a macro named main in it will look like this:

Don’t forget that Excel uses ! to separate the workbook name from the Modules and Sheets but uses . to separate the Module/Sheet from the macro.

Scheduling Macros in Closed Workbooks

This extends even further to closed workbooks. Since the scheduling happens at the application level, as long as the application is open, the scheduled macro should execute. A user can close all of the workbooks but leave the application running and it will be fine. In other words, all the workbooks can be closed but Excel must remain open for the OnTime method to operate.

To call a macro in a closed workbook, you need to supply the full filepath to the workbook. Other than this, it’s exactly the same as scheduling a macro in another workbook:

Important: the workbook will open and try to execute the macro. If security settings are such that the opened workbook is not trusted, the macro cannot run until someone clicks “Enable Macros”. Make sure you set the workbook to be trusted before using this method or you won’t get much automation benefit.

Automation and Recursion

If you run the scheduler once, you will get a single scheduled event. However, if you need to run the macro with the scheduler to schedule it every day, you just shifted the burden from running the macro directly to running the scheduler.

There are times this is useful, like when you cannot determine programmatically when you will need the macro, but you will know before the end of the day and it must be run overnight. In that case, you could run the scheduling macro before you go home only on days you need it.

But if you know your macro will run every day no matter what, you can actually automate the scheduling itself. The best way to do this is write a recursive subroutine, which is a subroutine that calls itself.

There are two common ways to do this: call the scheduler macro from the task macro or roll everything into one and make the scheduler macro the same as the task macro.

First Method
This is a code block using two separate subroutines, which makes breaking them apart easier:

This will run task_sub every day at 5am. Notice how the task_sub macro calls the scheduler macro at the end, which queues up the next execution of the macro for the following morning.

Second Method
This method calls the scheduling method Application.OnTime at the end of the macro, although you can make it the beginning or anywhere in between, if you’d like. The main drawback is you must run the full task every time. It also violates the etiquette of breaking code into more readable chunks with specific purposes. But nevertheless, it works just as well.

Continuity and Canceling

For Application.OnTime to work, the Excel instance in which it was run must remain open. It is possible to open more than one instance of Excel, and that may be useful if you use Excel often and habitually close the main window. If the instance is closed, all scheduled information will be lost — even if Excel is reopened. This is very important to remember.

If you need to run a macro at a certain time each day even if Excel is closed, you’ll have to call the macro from a file, like a .vbs file, and schedule your macro using the Task Scheduler.

There is also the possibility that a scheduled task must be canceled. This can be done by quitting the instance of Excel in which it was created, but doing this will nullify all scheduled tasks. What if you only wanted to cancel one schedule macro? To keep the Excel instance open and schedule a particular task, the exact time and name of the scheduled subroutine must be used. Then the Schedule parameter of the OnTime method should be set to the Boolean False .

This code block has a scheduler macro and a cancellation macro:

To cancel a scheduled task_sub macro, the user can simply run the cancel_macro routine. Notice the positional passing of parameters. If you don’t want to use blank positional arguments like here, use named arguments like this:

Because exact times are important, and sometimes different users might enter different times, you will need to store these scheduled times somewhere. One obvious place is in a cell that won’t be overwritten. Another, but more involved option, is to write the time and macro name variables to a simple text file. A third, even more involved option, is to write custom properties for the workbook in which the scheduler resides. However you do it, it is a good idea to store the times somewhere or risk having to close Excel to cancel a macro you “lost.”

Stability

Automation is great, but only if the code is stable and what you expected to happen actually happens. If your application is meant to run a macro at a certain time every day and you plan to automate it with recursion, it is very important that Excel remains stable. That could mean manual garbage collection, learning about Windows and how the operating system interacts with Excel, and error trapping.

In fact, error trapping is extremely important for rapid automation in VBA. If an application is designed to run every 5 minutes and there is no error trapping, you’re almost guaranteed to come back to a run-time error or useless output. This becomes particularly important when no humans are monitoring the program. Computers won’t fix themselves, so you’ll need a way to alert humans. One way to do this is to send yourself an email once an error is encountered.

Don’t neglect stability and error trapping, especially in unattended automation scenarios. Alert humans to the errors.

Conclusion

Application.OnTime makes scheduling macros easy, as long as Excel remains open. Since scheduling inherently involves some future time, the OnTime method can be called and your macro will run later. This makes recursion easy because the code is not executed immediately like most other VBA macros. That means automation becomes easy, and that’s the point of writing macros, right? It’s certainly one of the most prominent uses of Application.OnTime .

The most important caveats are that 1. Excel, the application, cannot be closed 2. cancelation requests require the exact naming and time used to schedule the task to properly cancel the task. 3. code and macros must be stable for long-term, reliable automation 4. error trapping is not to be dismissed

If you address these caveats satisfactorily, scheduling and automation in Excel using Application.OnTime can open many, many opportunities.

I hope you’ll take a minute to subscribe for more VBA tips. Simply fill out the form below and we’ll share our best time-saving VBA tips.

Ready to do more with VBA?
We put together a giant PDF with over 300 pre-built macros and we want you to have it for free. Enter your email address below and we’ll send you a copy along with our VBA Developer Kit, loaded with VBA tips, tricks and shortcuts.

Before we go, I want to let you know we designed a suite of VBA Cheat Sheets to make it easier for you to write better macros. We included over 200 tips and 140 macro examples so they have everything you need to know to become a better VBA programmer.

This article was written by Cory Sarver, a contributing writer for The VBA Tutorials Blog. Visit him on LinkedIn and his personal page.

Источник

VBA Excel. Метод Application.OnTime

Выполнение процедуры VBA Excel без аргументов в назначенное время или через определенный промежуток времени с помощью метода Application.OnTime.

Синтаксис метода Application.OnTime

Параметры метода Application.OnTime

Основные параметры:

  1. EarliestTime – время, когда необходимо выполнить указанную процедуру.
  2. Procedure – имя выполняемой процедуры.

Процедура Procedure не должна иметь аргументов и не может быть объявлена в модуле формы.

В качестве аргументов параметра EarliestTime используются следующие функции:

  • TimeValue(«hh:mm:ss») – чтобы запланировать выполнение указанной процедуры в определенное время суток.
  • Now + TimeValue(«hh:mm:ss») – чтобы запланировать выполнение указанной процедуры по истечении заданного времени с момента запуска процедуры с методом Application.OnTime .

Дополнительные параметры:

  1. LatestTime – интервал времени, в течение которого можно запустить указанную процедуру, если Microsoft Excel в назначенное время выполняет другую процедуру. По умолчанию указанная процедура будет запущена в любом случае после завершения предыдущей процедуры. Подробнее об этом читайте на сайте разработчика.
  2. Schedule – если задано значение True, будет запланировано выполнение указанной процедуры, False – очистка ранее установленной процедуры. Значение по умолчанию – True.

Параметр LatestTime я не тестировал, а вот любое применение параметра Schedule в значении False у меня в Excel 2016 вызывает ошибку. Поэтому в примерах я эти параметры не использую.

Примеры выполнения процедур по времени

Пример 1
Однократный запуск внешней процедуры через заданный промежуток времени:

Источник

Понравилась статья? Поделить с друзьями:
  • Excel место сохранения по умолчанию
  • Excel место по результатам
  • Excel место для размещения спарклайнов
  • Excel место в массиве
  • Excel места по числам