Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Быстрая вставка, удаление и перемещение эл. массивов - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, китин  
Быстрая вставка, удаление и перемещение эл. массивов
Dark_wave Дата: Среда, 10.09.2014, 09:10 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 9 ±
Замечаний: 0% ±

Excel 2007
Сначала, несколько хороших слов. Сайт чудесный, информация удобно структурирована, дизайн потрясающий. Давеча тут один проектик по работе был. Надо было срочно сделать автоматизацию на основе Excel. Сайт очень помог, в срок таки уложился. Решил и я поделиться своими наработками.

Америки, думаю, не открою, насчет повышенной, по сравнению с «обычными» алгоритмами, производительности API функции MoveMemory (aka CopyMemory) при работе с массивами. Вот, представляю на суд общественности класс «dwArrays», сделанный на ее основе. Вставка \ удаление \ перемещение элементов массива. Пока что, сие творение работает только с одномерными массивами.
Правда, в VBA какого-то универсального решения по передаче разнотипных массивов в функции я не нашел, а тип данных тут очень существенен. Поэтому, ничтоже сумняшеся, запилил методы для основных типов данных: Byte, Integer, Long, Double, Boolean, String и Variant.

Функционал класса следующий:

Свойства:

NoResizeArray – Не изменять размер массива (если = True, то при добавлении\удалении элементов Redim не делается. Тогда, при добавлении, все просто "смещается" на один элемент, а значение самого "верхнего" пропадает, при удалении - "верхний" становится "пустым")

Методы (тут _Int_ для примера, для остальных типов данных там _Lng_, _Dbl_ и т.д.):

Arr1D_Int_Insert – Вставить элемент в массив
Arr1D_Int_Shift – Переместить элемент(ы) массива
Arr1D_Int_Remove – Удалить элемент массива

Методам Insert и Remove – передается массив с определенным типом данных и индекс элемента.
Методу Shift – массив, индекс элемента, с которого следует начинать перемещение «блока» элементов, индекс элемента, начиная с которого следует вставить этот «блок», кол-во перемещаемых элементов.

По быстродействию:
Для тестирования был взят массив из 50 тыс. элементов и запущен цикл по вставке элемента в массив 50 тыс. раз.
«Стандартный» алгоритм работы с массивами – 68 секунд
Использование MoveMemory – 4 сек.

В приложении файл Excel. Сам класс и модуль с примерами и тестами.

Теоретически, должно работать и на Office x64, но, честно говоря, пока не проверял, т.к. у меня x32.
К сообщению приложен файл: Arrays_MoveMemo.xlsm (70.7 Kb)


На самом деле самого дела-то и нет. А наоборот, получим оборот на, и таким образом перевернем образ

Сообщение отредактировал Dark_wave - Среда, 10.09.2014, 10:15
 
Ответить
СообщениеСначала, несколько хороших слов. Сайт чудесный, информация удобно структурирована, дизайн потрясающий. Давеча тут один проектик по работе был. Надо было срочно сделать автоматизацию на основе Excel. Сайт очень помог, в срок таки уложился. Решил и я поделиться своими наработками.

Америки, думаю, не открою, насчет повышенной, по сравнению с «обычными» алгоритмами, производительности API функции MoveMemory (aka CopyMemory) при работе с массивами. Вот, представляю на суд общественности класс «dwArrays», сделанный на ее основе. Вставка \ удаление \ перемещение элементов массива. Пока что, сие творение работает только с одномерными массивами.
Правда, в VBA какого-то универсального решения по передаче разнотипных массивов в функции я не нашел, а тип данных тут очень существенен. Поэтому, ничтоже сумняшеся, запилил методы для основных типов данных: Byte, Integer, Long, Double, Boolean, String и Variant.

Функционал класса следующий:

Свойства:

NoResizeArray – Не изменять размер массива (если = True, то при добавлении\удалении элементов Redim не делается. Тогда, при добавлении, все просто "смещается" на один элемент, а значение самого "верхнего" пропадает, при удалении - "верхний" становится "пустым")

Методы (тут _Int_ для примера, для остальных типов данных там _Lng_, _Dbl_ и т.д.):

Arr1D_Int_Insert – Вставить элемент в массив
Arr1D_Int_Shift – Переместить элемент(ы) массива
Arr1D_Int_Remove – Удалить элемент массива

Методам Insert и Remove – передается массив с определенным типом данных и индекс элемента.
Методу Shift – массив, индекс элемента, с которого следует начинать перемещение «блока» элементов, индекс элемента, начиная с которого следует вставить этот «блок», кол-во перемещаемых элементов.

По быстродействию:
Для тестирования был взят массив из 50 тыс. элементов и запущен цикл по вставке элемента в массив 50 тыс. раз.
«Стандартный» алгоритм работы с массивами – 68 секунд
Использование MoveMemory – 4 сек.

В приложении файл Excel. Сам класс и модуль с примерами и тестами.

Теоретически, должно работать и на Office x64, но, честно говоря, пока не проверял, т.к. у меня x32.

Автор - Dark_wave
Дата добавления - 10.09.2014 в 09:10
nilem Дата: Среда, 10.09.2014, 14:00 | Сообщение № 2
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
Круто! Спасибо.
Можно вариантик? :)


Яндекс.Деньги 4100159601573
 
Ответить
СообщениеКруто! Спасибо.
Можно вариантик? :)

Автор - nilem
Дата добавления - 10.09.2014 в 14:00
Dark_wave Дата: Среда, 10.09.2014, 15:36 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 9 ±
Замечаний: 0% ±

Excel 2007
nilem, вариант отличнейшей!) Самое главное - не знал, что так запросто dotNet-сборки грузить можно. Как говорится, век живи, век учись, да все дур.. а, ладно, не суть... но, это во многом меняет дело)

Правда, с этим вариантом, насколько я уже попробовал, можно использовать только тип данных Variant, Net FrameWork, кажется, не является обязательным требованием при установке Office 2007 (хотя, видимо,таким же способом можно и VBS использовать), и он на целую секунду дольше, на 50 тысячах )))
Но, nilem, на самом деле, конечно же, все эти "ускорения", по большому счету - сферический конь в вакууме, так как, насколько я понимаю, обработка таких объемов данных с требованием к какой-то "запредельной" скорости, явление не частое. У меня, просто, работа связанна с обработкой больших объемов данных за максимально короткий промежуток времени.

А так - удобство, в большинстве случаев, в приоритете. Посему, остается только попробовать допилить этот класс, чтоб весь потенциально потребный функционал работы с массивами был в одном флаконе. И уже с учетом того, что обычным функционалом, коли уж NetFM можно использовать, не удивишь))


На самом деле самого дела-то и нет. А наоборот, получим оборот на, и таким образом перевернем образ

Сообщение отредактировал Dark_wave - Среда, 10.09.2014, 15:52
 
Ответить
Сообщениеnilem, вариант отличнейшей!) Самое главное - не знал, что так запросто dotNet-сборки грузить можно. Как говорится, век живи, век учись, да все дур.. а, ладно, не суть... но, это во многом меняет дело)

Правда, с этим вариантом, насколько я уже попробовал, можно использовать только тип данных Variant, Net FrameWork, кажется, не является обязательным требованием при установке Office 2007 (хотя, видимо,таким же способом можно и VBS использовать), и он на целую секунду дольше, на 50 тысячах )))
Но, nilem, на самом деле, конечно же, все эти "ускорения", по большому счету - сферический конь в вакууме, так как, насколько я понимаю, обработка таких объемов данных с требованием к какой-то "запредельной" скорости, явление не частое. У меня, просто, работа связанна с обработкой больших объемов данных за максимально короткий промежуток времени.

А так - удобство, в большинстве случаев, в приоритете. Посему, остается только попробовать допилить этот класс, чтоб весь потенциально потребный функционал работы с массивами был в одном флаконе. И уже с учетом того, что обычным функционалом, коли уж NetFM можно использовать, не удивишь))

Автор - Dark_wave
Дата добавления - 10.09.2014 в 15:36
nilem Дата: Среда, 10.09.2014, 17:07 | Сообщение № 4
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
Да, ArrayList и SortedList в VBA могут работать только в "усеченном" виде и уступают по скорости использованию CopyMemory.
Но ведь есть VB-шные массивы с кучей свойств и методов! Раз уж Вы работаете с большими объемами данных, можно попробовать (давно хотел заняться, но не знал, куда бы все это прикрутить :))
Будет файл-настройка (а можно и надстройку сделать). Попробуем?
Как бы альтернативное ответвление Вашей темы :)


Яндекс.Деньги 4100159601573
 
Ответить
СообщениеДа, ArrayList и SortedList в VBA могут работать только в "усеченном" виде и уступают по скорости использованию CopyMemory.
Но ведь есть VB-шные массивы с кучей свойств и методов! Раз уж Вы работаете с большими объемами данных, можно попробовать (давно хотел заняться, но не знал, куда бы все это прикрутить :))
Будет файл-настройка (а можно и надстройку сделать). Попробуем?
Как бы альтернативное ответвление Вашей темы :)

Автор - nilem
Дата добавления - 10.09.2014 в 17:07
AndreTM Дата: Среда, 10.09.2014, 17:15 | Сообщение № 5
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 501 ±
Замечаний: 0% ±

2003 & 2010
С _большими_ объёмами данных (с одновременной выборкой, сортировкой и т.д.) желательно просто пользовать ADO. Будет ничуть не медленнее. При этом работа с рекордсетом не требует именно "физически вставлять" и "сразу удалять". Единственный плюс MoveMemory (приложительно к VB) - это _чистая_ числовая обработка массива ординарных типов. По сути - управление битовым массивом.

А всё потому, что Copy(Move)MemoryEx ориентирован на статическое выделение из кучи (для неофитов - массив _должен_ быть выделен последовательными байтами/словами в RAM). А не дай б-же, объём массива превысит размер фрейма данных для приложения....


Skype: andre.tm.007
Donate: Qiwi: 9517375010


Сообщение отредактировал AndreTM - Среда, 10.09.2014, 17:25
 
Ответить
СообщениеС _большими_ объёмами данных (с одновременной выборкой, сортировкой и т.д.) желательно просто пользовать ADO. Будет ничуть не медленнее. При этом работа с рекордсетом не требует именно "физически вставлять" и "сразу удалять". Единственный плюс MoveMemory (приложительно к VB) - это _чистая_ числовая обработка массива ординарных типов. По сути - управление битовым массивом.

А всё потому, что Copy(Move)MemoryEx ориентирован на статическое выделение из кучи (для неофитов - массив _должен_ быть выделен последовательными байтами/словами в RAM). А не дай б-же, объём массива превысит размер фрейма данных для приложения....

Автор - AndreTM
Дата добавления - 10.09.2014 в 17:15
Dark_wave Дата: Среда, 10.09.2014, 19:49 | Сообщение № 6
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 9 ±
Замечаний: 0% ±

Excel 2007
AndreTM, благодарствую) Насчет ADO - минус, насколько я понимаю, хотя может быть не все знаю, в том, что нужен допустимый источник данных. В том смысле, что назначить источником данных - произвольный массив, не получится. Поправьте меня, если ошибаюсь) Можно было бы, наверное, реализовать некие "переходники", типа массив-рабочий лист-рекордсет ADO, но как-то это не спортивно)) Да и, опять же, производительность, с учетом "накладных расходов" на промежуточные операций...

Неплохо было бы тут, наверное, LINQ заюзать, для прямых запросов к массиву. Но dotNet, к тому же не ниже 3.5... "для работы данного класса, необходимо установить FrameWork 3.5" - как-то не того.. не этого))

Другое дело, "утягивать" данные в массив с листа таким способом, было бы, наверное, недурственно. Правда с задачами рекордсет->массив не сталкивался, обычно с данными БД работал "не отходя от кассы". Если одно в другое переводиться только циклом, то сие все же не есть гуд)
Но, в любом случае, спасибо, есть над чем подумать)


На самом деле самого дела-то и нет. А наоборот, получим оборот на, и таким образом перевернем образ
 
Ответить
СообщениеAndreTM, благодарствую) Насчет ADO - минус, насколько я понимаю, хотя может быть не все знаю, в том, что нужен допустимый источник данных. В том смысле, что назначить источником данных - произвольный массив, не получится. Поправьте меня, если ошибаюсь) Можно было бы, наверное, реализовать некие "переходники", типа массив-рабочий лист-рекордсет ADO, но как-то это не спортивно)) Да и, опять же, производительность, с учетом "накладных расходов" на промежуточные операций...

Неплохо было бы тут, наверное, LINQ заюзать, для прямых запросов к массиву. Но dotNet, к тому же не ниже 3.5... "для работы данного класса, необходимо установить FrameWork 3.5" - как-то не того.. не этого))

Другое дело, "утягивать" данные в массив с листа таким способом, было бы, наверное, недурственно. Правда с задачами рекордсет->массив не сталкивался, обычно с данными БД работал "не отходя от кассы". Если одно в другое переводиться только циклом, то сие все же не есть гуд)
Но, в любом случае, спасибо, есть над чем подумать)

Автор - Dark_wave
Дата добавления - 10.09.2014 в 19:49
Dark_wave Дата: Среда, 10.09.2014, 20:08 | Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 9 ±
Замечаний: 0% ±

Excel 2007
nilem, собственно, это и было началом нечто подобного) Когда мне задача по автоматизации прилетела, не сказать бы, что сильно потерялся, на VB 6.0 когда-то писал довольно долго. Но, давно уже перешел на Net и тоже был несколько разочарован отсутствием в VBA всяческих удобств, к которым привыкаешь быстро) Хотя, опять же, за удобства Net-а тоже приходится "платить" той же производительностью. И как результат, опять же, использование там в "тяжелых случаях" чего-нибудь, типа Buffer.BlockCopy или того же Windows API.

Эх... Не могу сказать, что свободного времени так уж много, но попробовал бы, вместе с вами, с удовольствием))


На самом деле самого дела-то и нет. А наоборот, получим оборот на, и таким образом перевернем образ
 
Ответить
Сообщениеnilem, собственно, это и было началом нечто подобного) Когда мне задача по автоматизации прилетела, не сказать бы, что сильно потерялся, на VB 6.0 когда-то писал довольно долго. Но, давно уже перешел на Net и тоже был несколько разочарован отсутствием в VBA всяческих удобств, к которым привыкаешь быстро) Хотя, опять же, за удобства Net-а тоже приходится "платить" той же производительностью. И как результат, опять же, использование там в "тяжелых случаях" чего-нибудь, типа Buffer.BlockCopy или того же Windows API.

Эх... Не могу сказать, что свободного времени так уж много, но попробовал бы, вместе с вами, с удовольствием))

Автор - Dark_wave
Дата добавления - 10.09.2014 в 20:08
Skif-F Дата: Четверг, 11.09.2014, 16:49 | Сообщение № 8
Группа: Проверенные
Ранг: Участник
Сообщений: 73
Репутация: 14 ±
Замечаний: 0% ±

Excel 2007, 2010, 2013, 2016
Правда, в VBA какого-то универсального решения по передаче разнотипных массивов в функции я не нашел, а тип данных тут очень существенен.

а так?:
[vba]
Код
Sub Arr1D_Insert(prm_intArr As Variant, prm_lngIndexEl As Long)
...
Select Case TypeName(prm_intArr)
     Case "String()"
         lngSizeOfType=...
     Case "Variant()"
         lngSizeOfType=...
...
[/vba]
 
Ответить
Сообщение
Правда, в VBA какого-то универсального решения по передаче разнотипных массивов в функции я не нашел, а тип данных тут очень существенен.

а так?:
[vba]
Код
Sub Arr1D_Insert(prm_intArr As Variant, prm_lngIndexEl As Long)
...
Select Case TypeName(prm_intArr)
     Case "String()"
         lngSizeOfType=...
     Case "Variant()"
         lngSizeOfType=...
...
[/vba]

Автор - Skif-F
Дата добавления - 11.09.2014 в 16:49
Dark_wave Дата: Четверг, 11.09.2014, 21:27 | Сообщение № 9
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 9 ±
Замечаний: 0% ±

Excel 2007
Skif-F, Да... А ларчик просто открывался... Я, в результате, полез через SafeArrayGetVartype. Кто на что учился, так сказать))
Но, правда, в конце-концов выяснилось, что и это лишнее.

http://www.excelworld.ru/forum/3-1880-1 Вот тут оказалось очень удачное и, главное, рабочее решение по получению адреса и дальше - считыванию структуры SAFEARRAY из переменной Variant. А то сам я, как выяснилось, битами промахнулся и с этой темой главою бил о сруб светлицы где-то сутки.

Ну а дальше, вроде бы, напрашивается такой вариант. Как все сделать одной процедурой, прямо в памяти, без необходимости чего-то возвращать обратно и каких-то промежуточных переменных.
Сейчас он, вроде как, кажется простым и оптимальным, но ведь снова же выяснится, что все гораздо проще))



- проверяем, массив ли нам дали, если нет - выход
- получаем вот эту структуру, нагло используя предложенное "Формуляром"

[vba]
Код

Private Type SAFEARRAY
       cDims As Integer     'Число размерностей
       fFeatures As Integer 'Флаг, юзается функциями SafeArray
       cbElements As Long  'Размер одного элемента в байтах
       cLocks As Long         'Сколько раз массив был locked, но пока не unlocked.
       pvData As Long        'Указатель на данные.
       rgsabound As SAFEARRAYBOUND 'Повторяется для каждой размерности.
End Type
[/vba]

- Берем отсюда L и U - bound для вычислений, lngSizeOfType у нас будет = cbElements
- А pvData - указатель на первый элемент массива в памяти => отсюда просто считаем указатель на нужные нам элементы (т.е. умножая на lngSizeOfType) и дальше делаем все тоже самое, только без лишних строк кода. И вроде бы - профит)


На самом деле самого дела-то и нет. А наоборот, получим оборот на, и таким образом перевернем образ

Сообщение отредактировал Dark_wave - Четверг, 11.09.2014, 21:35
 
Ответить
СообщениеSkif-F, Да... А ларчик просто открывался... Я, в результате, полез через SafeArrayGetVartype. Кто на что учился, так сказать))
Но, правда, в конце-концов выяснилось, что и это лишнее.

http://www.excelworld.ru/forum/3-1880-1 Вот тут оказалось очень удачное и, главное, рабочее решение по получению адреса и дальше - считыванию структуры SAFEARRAY из переменной Variant. А то сам я, как выяснилось, битами промахнулся и с этой темой главою бил о сруб светлицы где-то сутки.

Ну а дальше, вроде бы, напрашивается такой вариант. Как все сделать одной процедурой, прямо в памяти, без необходимости чего-то возвращать обратно и каких-то промежуточных переменных.
Сейчас он, вроде как, кажется простым и оптимальным, но ведь снова же выяснится, что все гораздо проще))



- проверяем, массив ли нам дали, если нет - выход
- получаем вот эту структуру, нагло используя предложенное "Формуляром"

[vba]
Код

Private Type SAFEARRAY
       cDims As Integer     'Число размерностей
       fFeatures As Integer 'Флаг, юзается функциями SafeArray
       cbElements As Long  'Размер одного элемента в байтах
       cLocks As Long         'Сколько раз массив был locked, но пока не unlocked.
       pvData As Long        'Указатель на данные.
       rgsabound As SAFEARRAYBOUND 'Повторяется для каждой размерности.
End Type
[/vba]

- Берем отсюда L и U - bound для вычислений, lngSizeOfType у нас будет = cbElements
- А pvData - указатель на первый элемент массива в памяти => отсюда просто считаем указатель на нужные нам элементы (т.е. умножая на lngSizeOfType) и дальше делаем все тоже самое, только без лишних строк кода. И вроде бы - профит)

Автор - Dark_wave
Дата добавления - 11.09.2014 в 21:27
Vostok Дата: Суббота, 11.10.2014, 05:33 | Сообщение № 10
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 211
Репутация: 1 ±
Замечаний: 40% ±

Excel 2010
К сообщению приложен файл: Arrays_MoveMemo.xlsm(71Kb)

Нужно удалить два элемента массива перед выгрузкой его на лист. Хотел посмотреть как реализован механизм удаления. Однако, никак не мог открыть приложенный файл. Говорил, что файл повреждён.

С большим трудом, но всё-таки открыл файл. В начале Модуля обнаружил такую запись :
[vba]
Код
  
'Начинаем с мантры (повторять вслух):
'Dark_wave косячник и ламер, писать программы не умеет, косяки через строчку. Но т.к. программы
'отдаются в добрые руки по принципу AS IS и на вопрос "с какого фига оно IS как AS,а не как должно быть?"
'вряд ли сможет ответить, то МЫ ПРОВЕРЯЕМ ВЕСЬ ФУНКЦИОНАЛ САМОСТОЯТЕЛЬНО, ПРЕЖДЕ, ЧЕМ ИСПОЛЬЗОВАТЬ В РАБОТЕ
'от греха подальше... чтоб не остаться без Excel-я, без компа или без работы...
[/vba]

Dark_wave , может объяснишь что это всё значит?


"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"

Сообщение отредактировал Vostok - Суббота, 11.10.2014, 05:41
 
Ответить
Сообщение
К сообщению приложен файл: Arrays_MoveMemo.xlsm(71Kb)

Нужно удалить два элемента массива перед выгрузкой его на лист. Хотел посмотреть как реализован механизм удаления. Однако, никак не мог открыть приложенный файл. Говорил, что файл повреждён.

С большим трудом, но всё-таки открыл файл. В начале Модуля обнаружил такую запись :
[vba]
Код
  
'Начинаем с мантры (повторять вслух):
'Dark_wave косячник и ламер, писать программы не умеет, косяки через строчку. Но т.к. программы
'отдаются в добрые руки по принципу AS IS и на вопрос "с какого фига оно IS как AS,а не как должно быть?"
'вряд ли сможет ответить, то МЫ ПРОВЕРЯЕМ ВЕСЬ ФУНКЦИОНАЛ САМОСТОЯТЕЛЬНО, ПРЕЖДЕ, ЧЕМ ИСПОЛЬЗОВАТЬ В РАБОТЕ
'от греха подальше... чтоб не остаться без Excel-я, без компа или без работы...
[/vba]

Dark_wave , может объяснишь что это всё значит?

Автор - Vostok
Дата добавления - 11.10.2014 в 05:33
Dark_wave Дата: Суббота, 11.10.2014, 13:58 | Сообщение № 11
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 9 ±
Замечаний: 0% ±

Excel 2007
Vostok, запросто)

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


На самом деле самого дела-то и нет. А наоборот, получим оборот на, и таким образом перевернем образ
 
Ответить
СообщениеVostok, запросто)

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

Автор - Dark_wave
Дата добавления - 11.10.2014 в 13:58
Vostok Дата: Воскресенье, 12.10.2014, 13:13 | Сообщение № 12
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 211
Репутация: 1 ±
Замечаний: 40% ±

Excel 2010
Я тоже человек и тоже могу ошибаться) И, если без проверки, просто вставить в проект, надеясь, что все будет работать везде как надо, то может быть неприятный сюрприз)

Ну не так же бичевать то себя. Это ж перебор. :)


"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"
 
Ответить
Сообщение
Я тоже человек и тоже могу ошибаться) И, если без проверки, просто вставить в проект, надеясь, что все будет работать везде как надо, то может быть неприятный сюрприз)

Ну не так же бичевать то себя. Это ж перебор. :)

Автор - Vostok
Дата добавления - 12.10.2014 в 13:13
Dark_wave Дата: Понедельник, 13.10.2014, 04:48 | Сообщение № 13
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 9 ±
Замечаний: 0% ±

Excel 2007
Vostok, у меня сомнительное чувство юмора)

А лучше, используй вот этот http://www.excelworld.ru/forum/3-13324-1 )) там оно все более отлажено. Хотя, сразу говорю, на "полезняшках" можно ждать проблем... Я уже пару косяков нашел... скоро выложу исправленную версию) Но, обычные методы работы с элементами, вроде бы работают как надо)


На самом деле самого дела-то и нет. А наоборот, получим оборот на, и таким образом перевернем образ
 
Ответить
СообщениеVostok, у меня сомнительное чувство юмора)

А лучше, используй вот этот http://www.excelworld.ru/forum/3-13324-1 )) там оно все более отлажено. Хотя, сразу говорю, на "полезняшках" можно ждать проблем... Я уже пару косяков нашел... скоро выложу исправленную версию) Но, обычные методы работы с элементами, вроде бы работают как надо)

Автор - Dark_wave
Дата добавления - 13.10.2014 в 04:48
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!