Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Разные книги макросов для разных версий Excel (2003 и 2013)
 
Суть проблемы: запретить Excel 2003 открывать книгу макросов из "C:\Users\user\AppData\Roaming\Microsoft\Excel\XLSTART"

Описание: На одном компьютере есть две версии Office - 2003 и 2013, установленных в "Program Files (x86)". При этом Excel 2013 при запуске открывает только "C:\Users\user\AppData\Roaming\Microsoft\Excel\XLSTART\Personal­.xlsb", как и ожидалось.

Но Excel 2003 загружает обе: свою из
"C:\Program Files (x86)\Microsoft Office\Office11\XLSTART\Personal.XLS"
и чужую из
"C:\Users\user\AppData\Roaming\Microsoft\Excel\XLSTART\Personal­.xlsb", блокируя её при этом.

На другом компьютере в сети такое поведение не повторяется - каждая версия Excel использует только свою книгу макросов. Какие есть соображения?
Программно узнать имя текущей процедуры.
 
Такой-вот вопрос. Как может функция/процедура узнать собственное имя? Видел в инете какую-то надстройку, но не нашел, где скачать, а также инфы о том, безопасна ли она. Да и вообще, хотелось бы знать КАК. Если у кого-то навскидку есть информация, поделитесь, плиз. Нужно это для того, чтобы каждая подпрограмма или метод могла хранить свои параметры или статистику в файле ini, текстовом файле или на отдельном листе. И главное, чтобы она всегда могла найти нужный файл по своему имени. Чтобы не прописывать константами.
Ошибка Application.Transpose, Type Mismatch
 
Всем привет!

Кто знает, поделитесь справочной информацией, а то на MS ничего не нашел.
Есть простой код, который транспонирует массив типа Variant. Размерность его (1 to 300k, 1 to 1). Насколько я понял есть какое-то ограничение на использование Application.Transpose, т.к. один и тот же кусок кода нормально обрабатывает маленький массив (размерность в десятках), а на большом выдает ошибку.
Интересно знать, какая именно граница установлена, а так же, как ее обойти штатно. Если навскидку никто не подскажет, буду писать свою процедуру.

Фрагмент
Код
Dim arr(), arr2()
...
arr2() = Application.Transpose(arr())
...


Заранее огромное спасибо.
Построчное чтение текстового файла, При условии, что в теле файла есть символы EOF
 
Всем привет!
Собственно, сабж. Предпосылки: есть база данных предприятия. Дважды в день я экспортирую таблицы в текст (с разделением табуляцией), а эти текстовые файлы заранее связаны с Access, как внешние источники данных. проблема в том, что некоторые юзеры вносят в текстовые поля таблиц символы Tab, копируя артикулы из чужих программ. При этом в текстовых файлах съезжают поля и Access начинает матюгаться (я его использую для отчетов). Придумал следующее: открывать текстовые файлы для чтения на VBA, подсчитывать кол-во Chr(9) в каждой строке, а при несовпадении с установленным эталоном выводить в лог на лист Excel. Работает довольно быстро, но вот проблема: в двух таблицах есть зашифрованные бинарные поля, которые изобилуют символами EOF (Ctrl+Z, #1A) и чтение файла обрывается. Пробовал читать, как бинарник, потом разделять на строки:
Код
DataArr()=Split(BigStr,VbNewLine)
, потом в цикле перебирать массив, НО чтение файла :
Код
BigStr=Input(LOF(f),f)
для больших файлов (~60-70мб) требует нереально много времени.
Пожалуйста, предложите какой-нибудь шустрый метод. Только просьба есть: если предложенный вариант будет предполагать использование ADO или API, в двух словах опишите как это работает.

PS: код в приложенном файле не будет работать в отрыве от реальных данных. Там на определенном листе в книге personal.xlsb находится перечень файлов и эталонное значение.
Связывание листов с *.dbf (VBA), С автоматическим обновлением
 
Всем привет!
Народ, помогите решить проблему. Я не знаю точно, в какую сторону копать, потому начну сначала. Есть база данных предприятия, состоящая из нескольких сотен таблиц, часть которых хранится в DBF (версии, кажись dBase IV). Для отслеживания ошибок логики в базе, а также для объединения таблиц до последнего времени я использовал такую схему: каждый день (иногда по несколько раз) делаю экспорт в текстовые файлы, которые заранее связаны с Access 2013 как внешние данные. Связывание/импорт из DBF напрямую он не умеет.
Ввиду особенностей наших программ экспорт в текст длится довольно долго, к тому же вылазят косяки (например табуляция в полях типа String или Memo). Так что я начал смотреть в сторону MS Query применительно к Excel (или любой похожей технологии). Мне это видится так: Создать *надцать листов или именованных диапазонов в книге Excel, каждый из которых будет связан со своим файлом DBF. При открытии книги (или удаленно, макросом из Access) их содержимое должно обновляться. А уж эта книга будет связана с Access, как внешний источник.

На деле же оказалось сложнее, чем я ожидал... Когда я полез по мануалам, то окончательно запутался в этих драйверах ODBC, строках подключения, настройках и т.д. В графическом интерфейсе я встретил только кучу окошек с похожим функционалом, которые вложены друг в друга, пустые либо недостаточно заполненные выпадающие списки, предупреждения о том, что я не заполнил какие-то поля. Хотелось бы реализовать на VBA полу-автоматическое пополнение книги новыми таблицами. В общем, помогите встать на путь истинный  :)  
Несколько слов об окружении: сами таблицы в каждый момент времени находятся в работе, их используют сразу много юзеров. Связывать их нужно ReadOnly, чтобы точно ничего не накосячить. Не смог найти никакой информации о записях, помеченных как удаленные. Можно ли их как-то фильтровать?

В общем, вопросов сразу масса. Некоторые из них изначально основаны на ложных представлениях. Помогите разобраться по порядку. Для начала: какой драйвер использовать для dBase IV? Он стандартный? Чем принципиально отличается ODBC от ADO. Что предпочтительнее (если это разные вещи)?
Заранее спасибо всем, кто поможет.
Обработчики событий книги в коде персонального модуля.
 
Всем привет!
Возник такой вопрос - как сделать так, что события открытых книг обрабатывались в коде модуля, который находится в personal.xlsb? То есть так, чтобы не было необходимости в каждую книгу, с которой я работаю помещать код, а потом сохранять в формате с поддержкой макросов.
Ну например, у меня есть макрос, который прокручивает окно так, чтобы активная ячейка оказалась по центру (исключая крайние позиции). Но запускаю я его вручную. А вот если привязать его к событию листа SelectionChange, то было бы удобнее. Но книг много, некоторые из интернета, некоторые нужно будет кому-то дать. Не буду же я в каждый лист вставлять обработку события... Да мало ли еще применений найдется такому подходу?
ПЫСЫ А может я что-то не так понимаю?
Форма прячется при смене активной книги
 
Всем привет! Помогите разобраться:
Код
Private Sub ComboBox1_Change()
Dim sh As Worksheet

ComboBox2.Clear
For Each sh In Workbooks(ComboBox1.Value).Sheets
    ComboBox2.AddItem (sh.Name)
Next
ComboBox2.Value = ComboBox2.List(0)
End Sub

Private Sub ComboBox2_Change()
If ComboBox2.Value = "" Then Exit Sub
Workbooks(ComboBox1.Value).Sheets(ComboBox2.Value).Activate
If ActiveSheet.UsedRange.Rows.Count > 2 Then
    Intersect(ActiveSheet.UsedRange.Offset(2, 0), ActiveSheet.UsedRange).Select
Else
    MsgBox "Возможно, этот лист не имеет данных"
End If
End Sub

Private Sub CommandButton4_Click()
Me.Hide
Unload Me
End Sub

Private Sub UserForm_Initialize()
Dim w As Workbook

For Each w In Workbooks
    If Windows(w.Name).Visible = True Then
        ComboBox1.AddItem (w.Name)
    End If
Next
ComboBox1.Value = ComboBox1.List(0)
End Sub


После строки Workbooks(ComboBox1.Value).Sheets(ComboBox2.Value).Activate при условии, что произошла смена книги форма прячется вместе с той книгой, из которой была вызвана. Первоначально вызывается из макроса в основном модуле персональной книги. Сама форма лежит там же. Нужно, что бы в зависимости от выбора в combobox'ах макрос активировал нужный лист (при этом сама форма не терялась), попытался определить границы данных, а в случае, если пользователь решит указать другой диапазон, перешел в немодальный режим (оставаясь при этом видимым).
Собственно интересует именно возможность менять selection на листе вручную и пеключать книги, удерживая форму видимой, а остальное додумаю сам. Огромное спасибо.

ПЫСЫ Поиск избороздил. Применять api для меня немного туманно, тем более, что ставить окно формы поверх абсолютно всех окон мне не нужно.
Изменено: КиберЗверь - 05.06.2013 17:42:09
Как узнать индекс элемента в цикле for each...
 
Собственно, вопрос в названии темы. Есть цикл, в котором перебираются элементы массива. При этом, как у любого цикла for тут есть управляющая переменная. Возможно ли на любой итерации узнать, какой именно элемент двумерного массива сейчас обрабатывается? (без необходимости самому считать итерации в i=i+1) Либо же управляющая переменная получает только значение и никакой информации о ее местоположении в массиве нет?
В качестве пояснения: дорабатываю под себя макрос для преобразования сводной таблицы в плоскую. Если значения ячеек можно загнать в массив одним оператором присваивания, то с NumberFormat так не выйдет. Я ввел еще один массив, а для его заполнения хочу применить цикл. Мог бы использовать простой for, но задался вот таким вопросом. Если у кого-то есть готовый ответ, хотелось бы узнать. Заранее спасибо.
Удаление со смещением, применяя буфер обмена
 
Всем привет! В общем, в этой теме затрагивается несколько вопросов. Очень прошу помощи)

Изначально есть необходимость удалить на листе все пустые ячейки со смещением влево (пример прилагаю, результат перекрестного запроса в access). Данных очень много, поэтому перебор в цикле занимает массу времени даже на очень производительном сервере. В файл включено несколько макросов, в которых я разными способами пытался достичь результата.

Макрос CellsToLeft делает тот же перебор в цикле, только selection.delete выполняется единожды для каждого непрерывного диапазона пустых ячеек, а до этого идет его накопление. Но и этот вариант оказался очень медленным.
Следующий вариант CellsToLeft2 применяет сортировку диапазона по столбцу, начиная с последнего, потом выбирает множество незаполненных ячеек и удаляет. Но и тут возникли трудности: во первых, если на листе есть ячейки со значением "", то они сортируются отлично от тех, что помечены как empty; во-вторых, на больших диапазонах сортировка происходит очень медленно, а excel со временем выбирает почти всю оперативу (порядка 8Гб).
Третий и четвертый вариант макроса работают с буфером.
CellsToLeft3 перебирает диапазон построчно, копирует каждую строку, считывает из буфера, рекурсивно удаляет двойные знаки табуляции, затем загоняет снова в буфер и вставляет вместо прежнего значения. Работает довольно быстро.
CellsToLeft4. В качестве эксперимента попробовал скопировать весь диапазон сразу, прочистить и вставить. Вставилась только малая часть исходных данных. После пошагового прохода обнаружил, что команда Format(obj) процедуры PutOnClipboard возвращает всего лишь 255 символов из всего, что было ей передано в obj. А после прогона CellsToLeft3, оказалось, что и там такая же байда (то-есть на самом деле он работал некорректно, но я этого не заметил сразу).

1) Исходя из этого: подскажите, можно ли обойти Format(obj)? Для чего он служит? Просто это бралось из интернета. Optional предложите свой вариант для удаления всех пустых ячеек на больших диапазонах со смещением влево.
2) Вопрос о буфере все-равно не снимается. Каков его максимальный объем? Могу ли я быть уверенным, что копируя по range.copy туда помещается вся информация, а не ссылка на нее и не часть данных без уведомления. Просто я использую буфер для загрузки данных в массивы еще во многих других решениях.

PS прошу прощения за такое обилие вопросов в одном посте и за сумбурность изложения. Заранее всем спасибо.
PPS для работы макросов нужно подключить библиотеку MSForms2.0
Изменено: КиберЗверь - 29.05.2013 15:29:56 (уточнение)
Взаимодействие с сайтом
 
Всем привет!  
У меня не совсем обычная проблема... то есть даже необычная.  
Требуется из екселя средствами vba произвести ПОИСК содержимого ячеек из некоего диапазона на шести разных сайтах, а результаты поиска по каждой ячейке поместить в таблицу или еще как-то.
Страницы: 1
Наверх