Добрый день, интересует премущества Office 365, может кто то уже на нем работает, в чем у него плюсы и минусы. Как работает на нем VBA? Или все таки уже MS перешел на JS. Если кто то уже работал с етим зверем, буду рад услышать его мнение и видение других форумчан на ету тему..
Office 365 это, по-сути, уже не просто приложения, а сервис как с приложениями, так и без них, который можно арендовать на определенный период, проплачивая вперед за месяц или за более длительный период. В Office 365 профессиональный плюс и в некоторые другие разновидности включены стандартные приложения для Windows: Word, Excel, PowerPoint, Outlook, Access и прочие. Эти приложения работают аналогично, например, Office 2016. VBA поддерживается.
Особенность приложений Office 365 в том, что их функциональность постоянно расширяется. И если раньше преимущества были не очень показательными, то несколько дней назад, например, в Excel (Insiders Fast - программа предварительной оценки) уже реализовали так называемые динамические массивы и spilling (наполнение данными ячеек) и несколько новых функций на их основе, которые в значительной степени теперь поменяют/упростят формульный мир. Bill Jelen уже успел опубликовать беглое описание этих новшеств в PDF файле, доступном для скачивания - ExcelDynamicArraysStraightToThePoint.pdf Там несколько опечаток, но они очевидны и по смыслу понятно, как должно быть на самом деле. А по первой ссылке внизу веб-страницы есть ссылки на описания новых функций от MS.
Если в ячейках A2:C10 есть данные и ввести, например, в ячейку E3 формулу =A2:C10 , то ячейки от E3 ниже и правее заполнятся/зальются ячейками-копиями со значениями и форматами ячеек диапазона A2:C10. Но эти ячейки-копии особенные, они - с той же формулой, но редактируется только формула E3. Если ссылка сделана на диапазон т.н. умной таблицы в виде структурированных ссылок, то и диапазон копий будет автоматически меняться вместе с этой таблицей. Аналогично, при обычном диапазоне если между крайними ячейками A2 и C10 будет вставлены или удалены строки, то и в залитой копии это будет учтено. Появился новый оператор #, который в конце ссылки одной ячейки будет означать ссылку на текущую область данных, в которую входит эта ячейка. Например, формула =SUM(A2#) означает сумму всех ячеек текущей области ячейки A2, определяемой, например, по F5-выделить-текущая область.
Новая функция сортировки SORT теперь получила свойство, аналогичное функции сортировки из гугл-таблиц - вводится в одну ячейку, а результат расширяется (заливается) в динамический диапазон отсортированных ячеек. Синтаксис английской версии: =SORT(Array, [Sort Index], [Sort Order], [By Column]). Разновидность: =SORTBY(array, by_array1, sort_order1,) позволяет сортировать по нескольким любым столбцам данных, но выводить какой-то один диапазон, который также динамический.
Функция фильтрации =FILTER(array,where,[if_empty]) например: =FILTER(A4:C16,B4:B16=F1,"None Found") выводит отфильтрованный диапазон, если он окажется пустым, то можно задать 3-им параметром, что при этом вывести в одну или несколько ячеек.
Функция =UNIQUE(Array,[By_Column],[Occurs_Once]) , например =UNIQUE(C4:C29) создаст динамический диапазон строк уникальных значений. Можно даже получить диапазон уникальных по нескольким столбцам, как бы автоматически объединенных в пределах каждой строки =UNIQUE(B4:C29)
Функции можно комбинировать, например, такая формула =SORT(UNIQUE(C4:C29,FALSE,FALSE)) создаст динамический диапазон отсортированных уникальных значений - просто несравнимо с громоздкостью реализации подобного с помощью обычных функций. Комбинировать, кстати, можно и с обычными функциями - см. документ, ссылку на который привел выше. По приведенным ссылкам есть описание и примеры работы еще нескольких функций (SINGLE, SEQUENCE, RANDARRAY), работающих с динамическим диапазонами. Хотелось бы приложить XLSX примеры по 7-ми новым функциям с подробными разъяснениями (англ) их применения от Smitty Smith (Microsoft), но каждый пример имеет размер от 120кБ до 190кБ, в сумме это превысит допустимый предел форума, поэтому приложил лишь пример применения функции FILTER (7 листов).
В Office 2019 (декабрь 2018), в версии, которая не станет частью Office 365, этих новых функций не будет, поэтому вариант Office 365 и лучше.
Владимир, большое спасибо за подробное объяснение. Насколько понимаю это
Цитата
ZVI написал: в ячейку E3 формулу =A2:C10 , то ячейки от E3
эквивалент Google Spreadsheet =ArrayFormula(A2:C10), правда, в Google не переносятся форматы, что, на мой взгляд удобнее. По остальным формулам - тоже есть Google-аналоги. Потихоньку сближаются
ZVI написал: Да, польза от конкуренции с Гугл-таблицами очевидна.
Несомненно. Владимир, можно я вас ещё подонимаю вопросами. Вы как-то года два назад давали ссылки на проекты для Excel online. Я их так и не освоил, а сами ссылки уже умерли. Разобраться с Excel add-ins в плане разработки именно для online не получилось. Нет ли у вас ссылок на то, как и где создавать проект для Excel online? Что-то тяжело найти точки входа. Для Visual Studio есть пакет для разработки и отладки такого javascript кода, но хорошо взаимодействует с Excel 2016. Получившийся результат мне так и не удалось прицепить в Online. И нет ли среды для разработки не столь монструозной как Visual Studio Community? В идеале, вообще хотелось делать такой addin непосредственно в браузере, где собственно и находится Excel Online, как это реализовано в Google Spreadsheet.
Пропало сообщение из-за сбоя, и сегодня утром не смог отправить.
Вопрос уже не стоит похоже, зачем переходить, скоро встанет вопрос, как не переходить. Кроме тех вкусняшек, которые появляются или появятся в 365, подписка на ПО становится все более и более распространенной. Это конечно выгодно вендору, а то распустились, купили (если купили) и десятки лет пользуются ( я о 2003 например). А сейчас плати за дозу доступную цену и попробуй соскочи.
Аналогично, хочется, но там все меняется очень быстро и, по сути, пользователями выполняется бета-тестирование. И вроде новые функции еще не во всех странах подключены, несмотря на Insider, т.к. нет еще окончательно корректных локализованных названий. Если кто-то обнаружит их доступными для пользователей России, то прошу здесь сообщить/порадовать.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
ZVI, Владимир, как всегда подробно и информативно. Примите благодарность. К сожалению, даже не тестировал сей продукт, нет у нас на предприятии, и дома не стоит. Интересен функционал JS, насколько отличается от VBA? Какие особенности использования, отличия и похожесть. И все таки это скриптовый язык, не java, каждый со своими особенностями.
Привет, Виталий. Js уже давным давно динамически компилируется и работает вполне себе достойно. Для примера код VBA
Код
Public Sub test()
Const arrLen As Long = 2000000
Dim arr() As Double, i As Long
Dim t As Single
t = Timer
ReDim arr(1 To arrLen)
For i = 1 To arrLen
arr(i) = i
Next
For i = 2 To arrLen
arr(i) = arr(i) + arr(i - 1)
Next
MsgBox CStr((Timer - t) * 1000) & " = " & CStr(arr(arrLen))
End Sub
у меня на нетбуке отработал за 265 миллисекунд. Почти тоже самое (не захотел индексы сбивать ) на JS (можно выполнить в отладке браузера), для Chrome вызов по F12.
Код
const arrLen = 2000000;
var arr = new Array(arrLen);
var i, dateStart = Date.now();
for (i = 0; i < arrLen; i++) {
arr[i] = i;
};
for (i = 1; i < arrLen; i++) {
arr[i] = arr[i] + arr[i - 1];
};
console.log( (Date.now() - dateStart).toString() + ' = ' + arr[arrLen - 1].toString());
выполнилось за 63 миллисекунды. Так что выигрыш JS у VBA налицо. Хотя по сравнению с С++, конечно результат не очень блестящий. Updated. И то вопрос - насколько не? Тоже самое C#
Скрытый текст
Код
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace SpeedTest
{
class Program
{
static void Main(string[] args)
{
const int arrLen = 2000000;
DateTime dateStart = DateTime.Now;
long[] arr = new long[arrLen];
for (int i = 0; i < arrLen; i++) {
arr[i] = i;
}
for (int i = 1; i < arrLen; i++) {
arr[i] = arr[i] + arr[i - 1];
}
Console.WriteLine((DateTime.Now - dateStart).ToString() + " = " + arr[arrLen - 1].ToString());
Console.ReadKey();
}
}
}
В релизе, без проверки переполнения выполнилось за 46 миллисекунд.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Виталий и Андрей, добрый день. Пока проблемой JS является более медленная (в раза 2) работа с объектной моделью Excel (ячейками, листами и т.п.) по сравнению с VBA. А также асинхронность работы JS, в отличие от легко поддающейся контролю последовательной работе кода VBA. То есть, если один код JS меняет значения ячеек, то другому (асинхронному) коду, использующему эти изменения, нужно как-то искусственно дождаться завершения этих изменений. Логика кодирования из-за этого может значительно отличаться от привычной VBA-логики. Хотя синхронные методы работы JS с объектной моделью Excel уже прорабатываются, насколько я слышал. И с типами данных в JS печально, по сути, все переменные аналогичны variant в VBA. Для программистов JS перспективен, но большинство освоивших VBA все же не программисты.
Андрей VG написал: var arr = new Array(arrLen); ... dateStart = Date.now();
Андрей, для корректного сравнения все же в JS нужно dateStart заряжать перед созданием массива, как в VBA, или в VBA ReDim arr(1 To arrLen) выполнить до t = Timer В C# , по-любому, будет в разы быстрее, но и там бы тип массива задать как double, а не long, больше же памяти требует, хотя результат по времени мало измениться должен.
ZVI написал: заряжать перед созданием массива, как в VBA, или в VBA ReDim arr(1 To arrLen) выполнить до t = Timer
Владимир, погонял в VBA t = Timer до создания массива и после на рабочей машине. Фактически выявить какое-то ухудшение не удалось, время выполнения скачет от 93 до 125 миллисекунд. Да и потом, возможно в Js это скажется (может там вне зависимости от new Array(array size) идёт ленивое выделение памяти), но в VBA это достаточно простая процедура выделения памяти под структуру описания массива и собственно данных массива. Там нет большой временной задержки. Ну, максимум 10 миллисекунд и то вряд ли. Возьмём чуть другую задачу, скачал портативный Firefox протестировал создание словаря из 8000000 уникальных значений, время выполнения 29 секунд. То есть время на выделение памяти для ключа и его значения 0,004 миллисекунды. Не верю, что в VBA создание массива чем-то сложнее, чем эта операция. Вся разница в том, что в VBA неявно всем типам элементов массива присваивается 0. То есть за нас вставляется такой код
Код
For i = 1 to UBound(arr)
arr(i) = 0
Next
Хотя может быть и что-то более простое, навроде API функции CopyMemory, которая единим потоком запишет 0 во все байты области данных массива. Честно говоря, ничего про алгоритмы реализации начальной инициализации массивов в VBA не знаю.
ivanok_v2 написал: и скорее всего VBA уйдет в историю Пора садится на JS
что я и сделал N лет назад
Давайте я покапитаню как обычно: Мир движется в сторону облачных решений (сервисов), которые работают на любом устройстве (компьютер, планшет, телефон, IoT). Если приложение браузерное и сложнее чем "hello world", скорее всего, оно использует JavaScript.
Цитата
ZVI написал: А также асинхронность работы JS, в отличие от легко поддающейся контролю последовательной работе кода VBA. То есть, если один код JS меняет значения ячеек, то другому (асинхронному) коду, использующему эти изменения, нужно как-то искусственно дождаться завершения этих изменений.
событийно-ориентированное программирование называется (event-driven programming)
Цитата
ZVI написал: Логика кодирования из-за этого может значительно отличаться от привычной VBA-логики
и да и нет. Сотря о чем идет речь. Если ставить обработчи какого-либо события, то это практически идентично
Цитата
ZVI написал: для корректного сравнения все же в JS нужно
понимать, как работают JIT-компиляторы и пишутся бенчмарки. Нюансов там более чем достаточно.
p.s.: зашел на форму ответить на сообщение в личку, а тут это : )
Андрей, Владимир немного добавил вычислений (учел ReDim), но для Шарпа и Си нужно больше для оценки. Итак массив в 200 млн. чисел. 1.VBA = 5.94 сек
Код
Public Sub test()
Const arrLen As Long = 200000000
Dim arr() As LongLong, i As Long
Dim t As Single, tEnd
ReDim arr(1 To arrLen)
t = Timer
For i = 1 To arrLen
arr(i) = i
Next
For i = 2 To arrLen
arr(i) = arr(i) + arr(i - 1)
Next
tEnd = Timer - t & " = " & arr(arrLen)
MsgBox tEnd
Debug.Print tEnd
End Sub
2.С#.NET с указателями (отключил проверку границ массива и ограничил аппетиты сборщика мусора) - 0,76 сек.
Код
using System;
using System.Diagnostics;
namespace SpeedTest
{
class Program
{
static void Main(string[] args)
{
const int arrLen = 200000000;
long[] arr = new long[arrLen];
Stopwatch sw = Stopwatch.StartNew();
unsafe
{
fixed (long* arr2 = arr)
{
for (int i = 0; i < arrLen; i++)
{
arr2[i] = i;
}
for (int i = 1; i < arrLen; i++)
{
arr2[i] = arr2[i] + arr2[i - 1];
}
sw.Stop();
Console.WriteLine("Time {0}", sw.Elapsed + " = " + arr2[arrLen - 1].ToString());
Console.ReadKey();
}
}
}
}
}
3.С/С++ сборщика здесь никогда не было (окромя интеллектуальных ссылок), а указатели были и будут поэтому те же - 0,76 сек. На самом деле негде развернутся, очень небольшой кусок вычислений. Здесь делал сравнения, более подробно. Здесь итоги. Конечно, это не сравнение, какой язык лучше. Просто сравнение производительности на конкретном примере (числодробилка).
Код
#include "stdafx.h"
#include <stdio.h>
#include <ctime>
#include <windows.h>
int main()
{
long arrLen = 200000000;
LONGLONG *arr = new LONGLONG[arrLen];
unsigned int start_time = clock(); // начальное время
for (long i = 0; i < arrLen; i++)
{
arr[i] = i;
}
for (int i = 1; i < arrLen; i++)
{
arr[i] = arr[i] + arr[i - 1];
}
unsigned int end_time = clock(); // конечное время
unsigned int search_time = end_time - start_time; // искомое время
wprintf(L"Time, sec: %f - %llu \n", search_time / 1000.0, arr[arrLen - 1]);
system("pause");
return 0;
}
Андрей, алгоритмы не менял, но в VBA у меня другой результат последнего элемента, чем в Шарпе, у тебя так же?
Андрей, я говорю про значение элемента, то которое выводится в сообщении. Оно какое должно быть в VBA и Шарпе? По идее одинаковое. А оно разное, или я что-то не так понял?
bedvit написал: По идее одинаковое. А оно разное, или я что-то не так понял?
Виталий, так как заливка исходного массива данными для последующего во втором цикле расчёта нарастающего итога различаются, то и нарастающий итог будет различаться. По паре исходных чисел в: VBA {1, 2}, C# {0, 1}. Соответственно, нарастающий итог будет: VBA {1, 3}, C# {0, 1}, то есть разница будет в две единицы, я собственно об этом и писал
Цитата
Андрей VG написал: Почти тоже самое (не захотел индексы сбивать )
nerv написал: Мир движется в сторону облачных решений (сервисов), которые работают на любом устройстве (компьютер, планшет, телефон, IoT). Если приложение браузерное и сложнее чем "hello world", скорее всего, оно использует JavaScript.
облака не станут панацеей - пока даже юзерам нужно личное пространство (это касается особенно сферы науки, их разработок и авторских прав) - не могу представить себе докторскую диссертацию в любой отрасли (ещё незащищённую, но в разработке) - чтобы она спокойно лежала на облаке ... поэтому полагаю старый добрый жёсткий диск с офисом и vba - не потеряет свою нишу... не одним ведь браузером мир полнится имхо p.s. а за "разбор полётов" - спасибо всем
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)