разрабатываю программку для работы со схемами вышивок. нужно сохранить получившуюся на листе схему( в виде сообщества разноокрашенных ячеек) в виде рисунка. наиболее подходяще - FileDialog(msoFileDialogSaveAs), но не дает изменить фильтр хотябы на "*.*" как бы обойти?
Надстройка для выдергивания данных из большого набора файлов: не работает одна из функций, не работает отрисовка даты снимка, если приложение скрыто(по умолчанию для этой надстройки)
есть надстройка для выдергивания из большого набора файлов в случайном порядке.. в ней есть функция выдергивания из свойств файла даты снимка и отрисовка этой даты на самом снимке.. по умолчанию при запуске надстройки, если иксель не был запущен ранее, то окно приложения скрывается и видно только окно формы.. в офисе2010 на 64битном ноуте с win7home эта функция перестает работать - файлы вобще не создаются. на другом компе, тоже 64бит 7ка( но pro) оф2010, все работает нормально. если сначала открыть иксель( с пустой книгой, например), а потом запустить файл надстройки, то тоже все работает нормально. надстройку прилагаю(она, кстати, вроде была и в копилке) чтобы включить функцию даты, нужно поставить галочку "проставить дату"
Set con = Application.CommandBars("Worksheet Menu Bar").Controls.Add(msoControlPopup, 1, , , True)
на этой строке получаем:
анамнез: Excel 2003 меню создается автоматически при загрузке надстройки. нормально создавалось в течение нескольких лет и продолжает создаваться на других компах перестало создаваться на одном из компов при невыясненных обстоятельствах(я был в отпуске - ничего не знаю) сброс панели(вручную) позволяет один раз выполнить эту подпрограмму, но при следующем запуске опять вылетает после сброса панели создает новое меню в панели, но опять вылетает при попытке создать в этом меню выпадающее подменю переустановка офиса не помогла(с сохранением настроек) просто добавление кнопок на панель проходит нормально, ошибка только при создании с параметром msoControlPopup
пока только придумал имя создавать( не листа, а на листе в .names) те на vba создаются листы, потом програмно же и уничтожаются.. но.. между может быть творчество пользователя.. поэтому положение листов или видимое имя не годятся
когда все делал в одном процессе, - текущем, то работало, а с запуском копии почему-то нет. те копия запускается, но цикл нет - видно на дистпечере задач. где грабли?
предыстория: попросили загрузить процессор, чтобы параллельная задача(не знаю какая, не иксель) немного притормозилась. простого запуска цикла оказалось недостаточно, как запустить несколько процессов иксель параллельно руками объяснить не удалось..
по кнопке пуск запускается столько экземпляров иксель, сколько установлено на "умножителе"
Простите я опять с массивами.. Есть двумерный массив из нулей и единиц. Требуется найти минимальное количество строк, которые бы образовали строку только из единиц. Результатом должны быть номера строк и их количество.
Я сначала ищу строку где больше всего единиц и начинаю ее сравнивать со всеми строками на максимальное отличие, как только нахожу такую, меняю в строке нули на единицы и сравниваю дальше. Очень долгий и много раз повторяющийся цикл For Next в Do Loop.... Может кто-нибудь предложит прогрессивнее метод?
В приложении сама матрица чисел 150 строк на 50 столбцов. (в оригинале существенно больше, обрезал для примера)
сначала можно было бы посчитать суммы всех строк и занести их в массив(словарь)
потом начиная с наибольшей суммы искать сразу в дополняющих суммах, а не во всех. например:
есть сумма 39 смотрим в словаре, есть ли строки с суммой 11(дополнение до 50)и проверяем только среди них, есть ли соответствие по месту единиц и нулей..
выкладывал в старом форуме, но вот доработал возможностью простановки на фото даты снимка.. эта функция правда отработана только для иксель 2010! я использую эту программку для набора попури из большого домашнего фотоальбома для маленькой такой фоторамки( у меня внутр память 512Мб). и вечером, когда семья обычно собирается перед зомбоящиком, рамка фключается и показывает избранные фотки..
доработал некоторые неточности, а главное добавил возможность вытаскивать из файла дату снимка и наносить на фото( т.е использовал иксель как некоторое подобие фоторедактора) если программа не находит даты снимка в файле, то берет дату последнего изменения и проставляет тег MD на фото перед датой.. потестируйте, а?
Календарь, основанный на стандартных элементах – т.е. не требует подключения дополнительных библиотек, а так же открыт для улучшения/ухудшения/доработки напильником.
Благодаря qw присутствуют четыре вида дизайна (мне лично нравится третий – считая слева, если нажать кнопку «показать календари») .
Благодаря ZVI календарь позиционируется рядом с активной (или заданной) ячейкой.
Благодаря обсуждению на данном форуме календарь принял нижеследующий вид (см вложение).
В файле есть примеры вызова календаря по кнопке (и позиционирования его на экране), по двойному клику в ячейке (позиционируется рядом с ячейкой), из контекстного меню (тоже рядом с активной ячейкой), по двойному клику на встроенном activex-объекте(текстбокс, комбобокс), клик по встроенной фигуре, двойной клик на элементе формы.
Календарь может изменять свой размер при нажатии на спин-кнопку в левом верхнем углу и запоминает этот размер для последующих вызовов (записывая его в имени).
Также уделено некоторое внимание возможности вызывать календарь в другую ячейку, не закрывая его при вызове двойным кликом (если вдруг промахнешься) - просто кликаете в другую ячейку... Но, признаюсь, это несколько усложняет код и, соответственно, понимание его. Каюсь, но не смог удержаться.
Еще раз повторяю, что предназначен он для разработчиков, которые могут свободно включать этот код в свои проекты, а так же изменять его.
Для конечных пользователей может быть сподоблюсь сделать надстройку в дальнейшем.
тз при загрузке открывает супер, берет данные для списков проверки данных и закрывает его.
путь к супер прописан через лента-надстройки-отчет-база.
по кнопке отчет открывается супер и идет манипуляция данными с помощью макроса прописанного в супер же, в модуле Maction_report. в частности нужно скопировать данные, обозначенные в супер именем a_t.. вот тут и начинаются загадки. имя куда-то пропадает. т.е. если просто открыть супер из виндоус, то имя есть, а если по кнопке отчет из тз, то нету..
помогите кто чем может.. может мысль какую, может намек..
Календарь, основанный на стандартных элементах – т.е. не требует подключения дополнительных библиотек, а так же открыт для улучшения/ухудшения/доработки напильником.
Благодаря qw присутствуют четыре вида дизайна (мне лично нравится третий – считая слева, если нажать кнопку «показать календари») .
Благодаря ZVI календарь позиционируется рядом с активной (или заданной) ячейкой.
Благодаря обсуждению на данном форуме календарь принял нижеследующий вид (см вложение).
В файле есть примеры вызова календаря по кнопке (и позиционирования его на экране), по двойному клику в ячейке (позиционируется рядом с ячейкой), из контекстного меню (тоже рядом с активной ячейкой).
Календарь может изменять свой размер при нажатии на спин-кнопку в левом верхнем углу и запоминает этот размер для последующих вызовов (записывая его в имени).
Также уделено некоторое внимание возможности вызывать календарь в другую ячейку, не закрывая его при вызове двойным кликом (если вдруг промахнешься) - просто кликаете в другую ячейку... Но, признаюсь, это несколько усложняет код и, соответственно, понимание его. Каюсь, но не смог удержаться.
Еще раз повторяю, что предназначен он для разработчиков, которые могут свободно включать этот код в свои проекты, а так же изменять его.
Для конечных пользователей может быть сподоблюсь сделать надстройку в дальнейшем.
Советы по улучшению и просто критика – приветствуются.
и подвинутый очередным отказом работы надстройки, связанным с отсутствием библиотек после чистки машины каким-то там клинером(не у меня, у сотрудника)..
вот, сподобился. мож кому пригодится.
прогрессбар на простых элементах, с возможностью прерывания процесса пример вызывающего кода присутствует..
понадобился календарь. встроенный в 2003й иксель устраивал, но у заказчика 2007й - нужно прописывать.. не годится. нашел xla версию, но закрыта паролем( нашел и вскрытую, но чужое - некул)
плюнул, написал свое. судите(но не строго)
ps предназначается в основном для тех, кто хочет интегрировать календарь в свой код.
задача: вернуть числовой код, уникальный для любого 3х-буквенного сочетания(точнее от 1 до 3х букв)
мое первоначальное решение:
Function getncomb(sr$) As Long getncomb = CLng(Asc(Mid(LCase(sr), 1, 1)) - 223) * 10000 If Len(sr) > 1 Then getncomb = getncomb + (Asc(Mid(LCase(sr), 2, 1)) - 223) * 100 If Len(sr) > 2 Then getncomb = getncomb + Asc(Mid(LCase(sr), 3, 1)) - 223 End If End Function
вот текущее решение - работает в 4 раза быстрее: Private Declare Sub GetMem8 Lib "msvbvm60.dll" (ByVal SrcPointer As Long, ByVal DstPointer As Long) Function getncomb(sr$) As Long Dim r(0 To 99) As Integer Call GetMem8(StrPtr(sr), VarPtr(r(0))) getncomb = r(0) - 1071 If Len(sr) > 1 Then getncomb = getncomb + (r(1) - 1071) * 33 If Len(sr) > 2 Then getncomb = getncomb + (r(2) - 1071) * 1089 End If End Function
собственно вопрос - будет ли быстрее, если не переписывать память(в данном случае нужно всего лишь 6 байт, но приходится брать 8), а подменить указатели, чтобы массив r ссылался на данные строки sr ?
далее вижу такой пордход 1 берем одномерный столбец( тот, по которому нужно сортировать)(вот тут лучше воспользоваться средствами не совсем VBA - функция copymemory из библиотеки kernel32 с этим справится быстрее)
2 создаем доп массив, равный получившемуся одномерному- он будет считаться заполненным порядковыми номерами элементов первого массива(1,2,3..) - т.е. изначально он упорядочен.
3 сортируем первый массив, одновременно выполняя те же преобразования над вторым
4 переписываем остальные поля двумерного массива в соответствии с порядком, получившимся в нашем дополнит массиве - например получилось 4,2,8,1.. - заполняем двумерный массив arr(1 to n,1 to c) из первоначального массива arr_n с помощью нашего доп массива arr_r(1 to n) for i=1 to n .. arr(i,c)=arr_n(arr_r(i)) next
можно, конечно и с флешки просматривать, но внутренняя память на 512Мб вполне устраивает - больше - слишком долго смотреть, устаешь.
так вот.. решил сделать случайную выборку из домашнего альбома(а он ужо около 25Гб).
вот что получилось: см вложение
прошу потестить и отозваться..(выбирать можно ведь не только графические файлы)
суть в чем - указываем папку альбома, маску(можно ткнуть в файл), и объем выборки.. прога в случайном порядке выбирает из всех вложенных папок файлы до достижения требуемого объема и сохраняет их в отдельной папке, которую уже можно скинуть на флешку..