Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Быстрый доступ из макроса (через ADO) к массиву пар Ключ|Значение, хранящемся в текстовом файле
 
Всем привет.
Появилась задача, которую не знаю каким способом лучше реализовать.

Проблема: нужно при работе макроса кешировать пары вида Ключ|Значение
(Имеем ключ. Если в текстовом файле уже есть пара для этого ключа, надо считать значение, а если нет, то позже из того же макроса дописать туда эту пару, когда станет известно значение). Файл предназначен для использования этих данных при следующих запусках макроса (каждый запуск макроса может немного пополнять этот файл)

Ситуация осложняется следующим:

1) количество пар, которые надо кешировать, от 200 тысяч до 2 миллионов (максимум - 5 млн)
Было бы из 10-20 тысяч, — считывал бы текстовый файл, и загонял в словарь (dictionary) или коллекцию, а потом бы из словаря / коллекции в цикле формировал текстовую строку, и перезаписывал файл.
Но при больших объемах записей, на заполнение словаря / коллекции будет уходить очень много времени, да и Excel жрёт сотни мегабайтов памяти (а таких текстовых файлов может быть несколько, для разных данных)

2) есть понимание, что нужно использовать что-то типа ADO, но ранее с ним не работал.
В каком формате хранить данные - csv, sql, mdb или ещё что-то, тоже не знаю (есть разница?)

3) всё это должно работать на любой версии Excel (2003-2019) под любой версией windows (XP-10) любой разрядности (32/64), причем работать это будет на тысячах разных компов, т.е. нужно что-то такое, что будет одинаково стабильно работать на любом компе.

4) при запуске макрос должен подключаться к файлу (но желательно не считывать всё его содержимое в память, ибо Excel не любит, когда он занимает в памяти 1 гиг), и иметь возможность через ранее установленное соединение БЫСТРО находить значение по ключу (или по массиву из 100 ключей получить 100 значений), а также сравнительно быстро дописывать новые пары Ключ|Значение (с перезаписью старых ключей, если вдруг такой ключ уже существует).

Вопросы:

1) что посоветуете использовать?
ADO? другие варианты?

2) Если ADO - это на всех компах будет работать?
Там у ConnectionString всего 2 варианта написания, для Excel версии ниже 11 и выше 11, и всё?
(одной из этих 2 строк подключения достаточно, чтобы обеспечить работу на любой версии Office?)

3) в каком формате хранить этот файл с данными?

4) реально ли, чтобы после команды добавления записи, не требовалось принудительное сохранение файла?
(чтобы если макрос внезапно завершил работу, не закрыв соединение, добавленные данные не потерялись)

5) как думаете, это совсем извращением будет, если хранить все эти данные в реестре Windows?
(записывая / считывая данные через штатные функции GetSetting / SaveSetting)
В принципе, ветку реестра можно экспортировать в файл, и импортировать на другом компе.
Просто загаживать реестр винды не хочется, хотя это было бы самым простым решением.


PS: прочитал кучу тем на форуме про использование ADO, но больше путаницы, чем понимания.
Почти во всех примерах - чтение данных с листа Excel, а с поиском записи в текстовом файле - особо примеров не нашёл.

В идеале хочу получить что-то примерно такого вида:
Код
Public Connections As Collection
' коллекция Connections содержит какие-то объекты, каждый объект - подключение к одному из файлов
' но только чтобы эта коллекция подключений не занимала кучу памяти в Excel


Function GetValue(ByVal key$, ByVal filename$) As String
    ' подключается к файлу filename$ (если подключение требуется, и ранее не установлено)
    ' ищет в нём ключ key$, и возвращает значение, соответствующее ключу
End Function

Sub SetValue(ByVal key$, ByVal value$, ByVal filename$)
    ' подключается к файлу filename$ (если подключение требуется, и ранее не установлено)
    ' и добавляет к нему запись key$|value$
End Sub
Изменено: Игорь - 28.05.2020 21:18:19
Получить адрес диапазона защищённых ячеек на листе
 
Приветствую, коллеги.

Столкнулся с ситуацией, когда макросом надо получить список диапазонов всех защищённых ячеек на листе, без перебора ячеек в цикле.
Лист может быть большой, защита может стоять на нескольких отдельных диапазонах (отдельные ячейки, диапазоны, столбцы), ячейки могут быть пустые или заполненные.
Задача: в переменную считать адрес всех этих диапазонов, как это позволяет делать, например, SpecialCells
res = cells.SpecialCells(xlCellTypeConstants).Address

Для чего нужно: на листе защищены часть ячеек, но надо временно поставить защиту на весь лист, а потом снять защиту, но чтобы ранее защищённые ячейки остались защищены.

В объектной модели Excel ничего такого не нашёл. Есть идеи?

<добавлено>
Нагуглил вариант поиска (Cells.Find) по формату ячейки, там можно найти защищённые ячейки, - но когда защищён столбец целиком,
всё это дело виснет, - т.к. видно, что Excel в этом случае перебирает отдельные ячейки
(пишет, что найдено 1048593 ячейки, - и висит 5 минут, т.к. не может сразу отобразить результаты поиска)
Да и не очень понятно, как поиском найти и пустые и заполненные ячейки одновеременно
Изменено: Игорь - 14.11.2018 21:53:00
Ошибки отрисовки форм VBA после очередного обновления Office 365
 
Приветствую, коллеги
Есть среди вас счастливые обладатели Office 365, где Office автоматически обновляется?

У меня беда, - в моих программах частично перестали отображаться такие элементы управления, как Multipage и Frame
(точнее, они частично стали прозрачными / невидимыми)
Водишь мышом над таким Multipage и Frame, щелкаешь по нему, - кнопки и прочие комбобоксы начинают отрисовываться, но глючат (выпадающие списки не работают)

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

Кто-нибудь с подобным сталкивался?
Это как-нибудь можно исправить, продолжая пользоваться Office 365?
Требуются настройщики надстройки для Excel «Парсер сайтов», Ищем человека для долгосрочного сотрудничества
 
Текст вакансии: http://excelvba.ru/work

Работа удалённая. Для работы нужен интернет, Скайп (голосовая связь), Excel, браузер Chrome, и желание зарабатывать.

Знание программирования не требуется (но умение работать с VBA или понимание формул, - приветствуется)
Обязательны ответственность, и  желание работать.
Нужны базовые знания Excel, также надо понимать, как устроен сайт (HTML - теги, классы, ID элементов)
Нужен спец по VBA для работы над заказами, ищу ответственного человека, хорошо знающего макросы
 
Приветствую, коллеги

В последнее время, у меня стали скапливаться заказы на макросы, где надо вникать в суть задачи, и обсуждать потом нюансы с заказчиком по скайпу.
Средний объём работы по заказу, — от 2 до 7 дней, стоимость (которую вы получите на руки, после вычета моей комиссии) — от 3 до 20 т.р.
Количество заказов в месяц, — около 2-3 (с простыми заказами мои коллеги успешно справляются, а на сложных, «мутных», заказах, у меня всего 1 человек, — порой все заняты, и некому отдать заказ в работу)

Нужен человек (известный мне по форуму), который:

1) имеет возможность и желание работать с платными заказами
(для этого нужен скайп, ЧАСТО появляться в инете, и желательно иметь возможность принимать платежи от заказчиков)

2) отлично знает макросы, и может наколдовать с их использованием почти что угодно
отличное знание формул — не обязательно, но понимание простейших формул и умение их применять, - обязательно
знание сводных таблиц, и прочих встроенных возможностей Excel, — приветствуется

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

По всем вопросам сотрудничества, - готов проконсультировать по скайпу.

Вкратце о схеме взаимодействия: я перенаправляю вам письмо заказчика (заказ с указанием всех контактных данных), вы сами связываетесь с заказчиком, обсуждаете нюансы и стоимость (по цене - сами решаете, не забыв заложить в неё мой интерес), получаете предоплату (минимум 50%), делаете, получаете остаток оплаты, высылаете мне мою комиссию. (т.е. я не вникаю в заказ, - моя задача передать вам заказ в работу, - вы мне отписываетесь в скайп, берётесь или нет, - и, если вы за него беретесь, то потом, когда все сделаете, отправляете мне мою часть суммы. Для оплаты заказчиком, доступны все мои способы оплаты, - т.е. могут платить вам, а вы мне потом мой процент возвращаете, либо заказчик оплачивает на мои счета, а я вам потом вашу часть перевожу)

PS: сейчас есть парочка таких заказов.
Активация вкладки НАДСТРОЙКИ на ленте Excel, просьба протестировать код
 
Приветствую, коллеги
Просьба протестировать найденный мной в инете макрос активации вкладки НАДСТРОЙКИ (Add-Ins) на ленте Excel

У меня в Excel 2010 все работает, а вот в Excel 2016 как бы тоже вкладка активируется,
но перерисовка экрана в Excel вырубается (как будто Application.ScreenUpdating=False выполнили, только обратно перерисовку не включить)

Хочу понять, это только у меня такой глюк в Excel 2016, или многие пользователи моих надстроек с подобным столкнутся

Просьба:
1) запустить прикреплённый файл, нажать зеленую кнопку
(при нажатии кнопки создастся панель инструментов, и активируется вкладка НАДСТРОЙКИ)
2) написать сюда содержимое серой ячейки
(там будет что-то типа Результат: ОК,  Windows (32-bit) NT 6.01, Excel version = 14.0)
Если будут ошибки компиляции макроса - тоже напишите


Вопрос спецам:
случайно не знаете, как другим способом (МАКРОСОМ) активировать нужную вкладку на ленте (без SendKeys, без XML)?
может, есть какой-то хитрый способ? (как, например, можно скрыть отобразить ленту, используя ExecuteExcel4Macro)
Исчезновение формы VBA при сворачивании окна приложения Excel, такое происходит только при создании нескольких экземпляров формы
 
Приветствую, коллеги.
Кто сможет объяснить сиё явление?

Есть одна обычная форма VBA, и 2 простых макроса:
Код
Sub test1()
    With UserForm1
        .Show
    End With
End Sub

Sub test2()
    With New UserForm1
        .Show
    End With
End Sub
Первый макрос запускает форму, второй - запускает копию формы.
(второй макрос, если несколько раз его запускать, наплодит несколько форм)

Проблема: если СВЕРНУТЬ окно Excel, а потом снова развернуть, — все формы, созданные вторым макросом, исчезают (закрываются)
Нюанс: если форма совсем пустая (без контролов) - она не закроется
Если же есть хоть один элемент управления на ней, - форма исчезнет.

Формы, созданные первым макросом, не исчезают

Во вложении, - пример файла

1Нажмите зеленую кнопку
2Нажмите 1-2 раза синюю кнопку
Видим 2-3 запущенных формы
3Сверните окно Excel, потом обратно разверните
Осталась видима только одна форма…

Вопросы:
  • кто может объяснить, почему во втором случае формы закрываются (исчезают)?
  • как этого избежать, именно в варианте со вторым макросом?
PS: формы всегда немодальные
несколько копий формы используется для редактирования нескольких однотипных объектов одновременно
Просьба протестировать работу макроса
 
Приветствую, коллеги

У меня к вам просьба, - запустить макрос, и скопировать в свой ответ результат работы макроса из окна Immediate
Хочу узнать, на всех ли компах будет работать, и как медленно выполняется код.
(код планируется использовать на тысячах самых разных компов)

Важно! При первом запуске макроса, он выполняется гораздо медленнее, чем при последующих,
потому мне хотелось бы увидеть результат вывода после ПЕРВОГО запуска макроса.

Собственно, код:
Код
Sub test_WMI()
    On Error Resume Next: Err.Clear
    Dim obj As Object, DriveID$, PartName$, t As Double: t = Timer
    With GetObject("winmgmts:{impersonationLevel=Impersonate}!//.")
        For Each obj In .ExecQuery("ASSOCIATORS OF {Win32_LogicalDisk.DeviceID='" & Environ("SystemDrive") & "'} WHERE AssocClass = Win32_LogicalDiskToPartition"): PartName$ = obj.DeviceID: Next
        For Each obj In .ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" & PartName$ & "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition"): DriveID$ = obj.DeviceID: Next
        For Each obj In .ExecQuery("SELECT * FROM Win32_DiskDrive WHERE DeviceID='" & Replace(DriveID$, "\", "\\") & "'"): Debug.Print obj.Caption, obj.Signature: Next
        For Each obj In .ExecQuery("SELECT * FROM Win32_BaseBoard"): Debug.Print "Материнская плата: " & obj.SerialNumber: Next
        Debug.Print "Partition = " & PartName$, "DriveID = " & DriveID$: Debug.Print "time = " & Format(Timer - t, "0.00 сек.")
        If Err Then Debug.Print "error " & Err.Number, Err.Description
    End With
End Sub 

Вставьте код в любой модуль, нажмите Ctrl + G (чтобы отобразить окно Immediate),
потом поставьте курсор в макрос, и нажмите F5 для запуска макроса.

В окне Immediate появится результат типа такого, - вот он меня и интересует:
Цитата
WDC WD10EZRX-00A8LB0 ATA Device           -458719218
Материнская плата: MS1C64B15802714
Partition = Disk #1, Partition #0         DriveID = \\.\PHYSICALDRIVE1
time = 1,28 сек.
PS: Если не затруднит, - напишите время (последняя строка вывода) повторного запуска макроса (например, time = 0,22 сек.), и какая версия Windows у вас установлена.

Заранее спасибо)
Нужен формулист, объем работы: 2-3 заказа в месяц
 
Приветствую, коллеги

Ситуация такова, что сейчас мне некому передавать заказы, где надо все реализовать при помощи хитрых сложных формул
(для меня, сложные формулы, - это всё кроме =И(), =ЕСЛИ(), = ВПР(), =СУММ() и подобного)

Нужен человек (известный мне по форуму), который:
1) имеет возможность и желание работать с платными заказами
(для этого нужен скайп, частенько появляться в инете, и иметь возможность принимать платежи от заказчиков)
2) отлично знает формулы, и может наколдовать с их использованием почти что угодно
(знаю, на этом форуме точно несколько таковых есть)
знание макросов - не обязательно
знание веб-запросов, сводных таблиц, и прочих встроенных возможностей Excel - приветствуется


По всем вопросам сотрудничества, - готов проконсультировать по скайпу.
Заказов таких немного у меня (в 95% случаев устраивают макросы), - но вот иногда надо все замутить без макросов,
и тогда я буду обращаться к вам уже лично

Один заказ есть прямо сейчас
Excel 2013: убрать привязку CommandBar к активному файлу Excel, панель инструментов надстройки исчезает при закрытии активной книги
 
Приветствую, коллеги

Вопрос по использованию «старых» панелей инструментов (которые отображаются на вкладке НАДСТРОЙКИ) в Excel 2013

Задача: сделать так, чтобы панель инструментов, созданная макросом при запуске надстройки,
НЕ ИСЧЕЗАЛА при закрытии того файла Excel, который был активен в момент программного создания этой панели.

Кроме того, ещё проблема: панель инструментов СОХРАНЯЕТСЯ вместе с файлом Excel
(потом, при открытии файла Excel, панель отрисовывается, хотя надстройка не запущена)

В Excel 2007 - 2010 таких проблем не было,
это в Office 2013 майкрософт чего-то нового намудрил

Вопрос: есть ли способы избавиться от такого поведения Excel?
(чтобы работало как в прежних версиях - панель инструментов не привязана к открытому в Excel файлу)

PS: Панель инструментов создается кодом типа такого: http://excelvba.ru/tools/CommandBar

PPS: Вариант с XML не предлагать, - я про него знаю, но пока не могу использовать (очень много кода переписывать, т.к. использую динамические меню)
Да и надо сохранить совместимость с Excel 2003
В будущем, конечно, буду делать меню через XML, - но пока хочу узнать, есть ли хотя бы теоретическая возможность обойти это нововведение в Excel
Проблема с условным форматированием в Excel 2007, В Excel 2010 всё то же самое нормально работает...
 
Приветствую, коллеги.
Подскажите, в чем может быть проблема.

Я думал, что Excel 2007 и 2010 в этом плане отличий не имеют...
Сделал УФ (работал в Excel 2010), в качестве условия используется формула:
Код
=СМЕЩ(RC;0;2-ОСТАТ(СТОЛБЕЦ();3);1;1)=списки!R8C4

В Excel 2007 эти правила УФ даже не отображаются...
Почему так? Что не так с формулой?

Прикрепляю пример файла
Чтобы увидеть УФ, надо в любом из столбцов «статус счёта» выбрать значение из выпадающего списка
Новые возможности Excel, «формулы» можно задавать на «обычном» языке
 
Если кто ещё не читал:
http://habrahabr.ru/post/174023/

Цитата
демонстрируется в качестве примера финансовый документ с готовыми данными, в котором требуется получить ещё одно поле, складывая два последних — Base pay и Of pay.
Обычный действия заключаются в том, что необходимо разместить курсор в нужной ячейке, ввести в неё формулу и «протащить» её до нужного диапазона.
Вместо этого в поле для формулы вводится команда "add the base pay and of pay" и в итоге Excel заполняет поле, складывая указанные в «формуле» значения ячеек в указанных столбцах. Примерно также находится и сумма — командой "add up".
Студенту нужна помощь - работа на VBA в Excel
 
Приветствую, коллеги.

Мне поступил заказ от студента, но сам я не могу за него взяться
(времени свободного нет)

Есть задание (описание + примеры файлов Excel) - могу выслать.
Задание немного мутное, конкретики не так много, - но сделать реально, если у кого есть свободное время и желание.

Сроки: 1-2 недели
Бюджет: 15-20 т.р.

Просьба обращаться только тех форумчан, кто давно на Планете (кого я знаю по никам)
Новичков просьба не беспокоить — отдам заказ только тому, в ком буду уверен, что человек справится.

Пишите на почту - я вышлю вам задание, вы посмотрите, и, если возьмётесь, — то уже свяжетесь напрямую с заказчиком, и всё будете уже с ним обсуждать (цену, сроки, нюансы, и т.д.)
Глюк Excel - не могу понять причину, 2 простейших, по сути одинаковых, цикла - на одном из них Excel молча закрывается
 
Есть файл со следующим кодом:

Код
' sh - кодовое имя листа

Sub test1()
    a = FIOarray1 ' Excel 2007 и 2010 молча закрываются, Excel 2003 зависает
End Sub

Sub test2()
    a = FIOarray2 ' все нормально работает
End Sub

Function FIOarray1() As Variant ' Excel глючит
    ' возвращает двумерный массив с фамилиями и примечаниями к ним
    Dim cell As Range, n&
    FIOarray1 = FIOrange.Resize(, 2).Value
    For Each cell In FIOrange.Cells
        n = n + 1: FIOarray1(n, 2) = cell.NoteText
    Next cell
End Function

Function FIOarray2() As Variant ' а вот так - работает
    ' возвращает двумерный массив с фамилиями и примечаниями к ним
    Dim cell As Range, n&: arr = FIOrange.Resize(, 2).Value
    For Each cell In FIOrange.Cells
        n = n + 1: arr(n, 2) = cell.NoteText
    Next cell
    FIOarray2 = arr
End Function


Function FIOrange() As Range
    Set FIOrange = sh.Range(sh.[b5], sh.Range("b" & sh.Rows.Count).End(xlUp))
End F unction


2 функции, которые делают одно и то же - возвращают двумерный массив (в первом столбце - значения ячеек, во втором - примечания к тем же ячейкам)

При запуске первой функции (которую я написал изначально) - Excel 2007 и 2010 закрываются без каких-либо уведомлений, а Excel 2003 зависает.

Что самое интересное: если в Excel 2003 во время выполнения первого кода нажать Ctrl + pause (остановить макрос), и продолжить выполнение в пошаговом режиме (нажимая F8), мы увидим, как Excel сходит с ума:
выполнение не всегда идет не как ожидается, а происходит перескакивание с одной строки кода на другую, в хаотичном порядке.

С точки зрения синтаксиса VBA, обе функции написаны верно.
Регулярно пишу подобные по методам работы функции - никогда проблем не было.

В чем причина столь странного поведения Excel?
Как прикрепить произвольные файлы к книге Excel, а потом их извлечь или запустить
 
Хочу поделиться своим сегодняшним макросом, суть которого описана в названии темы.  
 
Более подробное описание, и пример использования - у меня на сайте:  
http://excelvba.ru/tools/Attachments  
 
Вдруг кому пригодится...  
 
PS: Тестировал на разных файлах - без проблем прикрепляются и 15-мегабайтные файлы  
(время загрузки\выгрузки такого файла - около 35 секунд)  
Маленькие файлы прикрепляются и извлекаются практически моментально.  
 
Для хранения данных файлов используется скрытый лист.  
 
 
Хотелось бы выслушать критику - всё ли правильно сделано, какие возможны проблемы при использовании.
Как макросом открыть CSV файл в запущенном Excel?
 
Всем привет.  
 
Не могу придумать способ реализации для вроде бы элементарного действия.  
 
Итак, есть кнопка на панели инструментов, при нажатии которой должно выскочить диалоговое окно выбора файла, после чего выбранный файл (CSV или XLS) должен открыться в Excel (в той копии приложения, из которой запущен макрос)  
 
Разумеется, я знаю, как вывести диалоговое окно выбора файла.  
Итак, у меня есть путь к файлу (CSV или XLS), и мне надо программно открыть этот файл.  
 
С файлами Excel проблем нет - тут поможет Workbooks.Open ИмяФайла  
 
А вот с CSV - проблема.  
Когда мы открываем CSV файл через встроенную в Excel кнопку открытия файла (или Ctrl + O, что то же самое,    
Excel АВТОМАТИЧЕСКИ распознаёт, какой разделитель столбцов используется.  
Когда же мы открываем файл программно, Excel использует настроенные в системе (или в самом Excel) разделители.  
 
А в моём случае, разделители в CSV могут быть любые, и хотелось бы, чтобы Excel сам определял разделитель.  
 
 
Стал я пробовать различные варианты:  
(предположим, что путь в файлу CSV мы уже знаем)  
 
Const CSVfilename = "C:\test.csv"  
 
Sub test1()  
   Workbooks.Open CSVfilename  
End Sub  
 
Sub test2()  
   Workbooks.OpenText CSVfilename  
End Sub  
 
Sub test3()  
   ThisWorkbook.FollowHyperlink CSVfilename  
End Sub  
 
Sub test4()  
  Application.Dialogs(xlDialogOpen).Show  
End Sub  
 
Sub test5()  
   Shell """" & Application.Path & "\excel.exe" & """ /dde " & CSVfilename  
End Sub  
 
Sub test6()  
   CreateObject("wscript.shell").Run CSVfilename  
End Sub  
 
 
Варианты 1-4 открывают файл, неверно распознав разделитель столбцов  
 
Вариант 5 открывает корректно, но - в новой копии Excel, что неприемлимо  
(как использовать ключи командной строки, чтобы отправить файл в запущенный Excel, я не знаю)  
 
Вариант 6 открывает файл в программе, назначенной для CSV по-умолчанию (у меня это Notepad++)  
Поскольку код будет использоваться на множестве компов, этот вариант не подходит.  
 
 
У кого какие идеи?  
Вроде бы, этот вопрос уже обсуждался, - но поиском не смог найти ответ.
Проблема с макросами при работе с книгами древнего формата Excel4
 
Коллеги, подскажите, как программно снять эти галочки?  
<EM>http://ExcelVBA.ru/pictures/20120322-774-134kb.jpg</EM>  
Или как обойти ограничение, ими вносимое?  
 
Для чего это нужно:  
делаю программу обработки прайс-листов.  
 
Среди них попадаются файлы в формате Excel 4 (какой-то древний формат)  
Excel мало того, что блокирует их редактирование (мне это пофиг, я работаю с этими прайсами в ReadOnly),  
так ещё и макросы начинают вести себя очень странно  
(жмём кнопку на панели инструментов - если активен файл Excel4, макрос не запускается, если любая другая книга - всё ОК)  
 
Самое интересное, что макрос обращается к единственному свойству активной книги - activeworkbook.fullname  
И этого обращения к свойству древнего файла  достаточно, чтобы Excel 2010 остановил все макросы.  
 
Кстати, файлы Excel4 не отображаются в редакторе VBA  
 
PS: Тестирую программу на Excel 2010  
Макрорекордер не пишет изменение этих настроек  
 
Прикрепить файл Excel4 не могу, так как он по размеру около мегабайта,  
а удалить лишние строки для уменьшения объёма файла Excel не позволяет.  
Поэтому выложил книгу в древнем формате на сайте:  
<EM>http://ExcelVBA.ru/XL_Files/excel4.rar</EM>
Excel 2010 - ограничение в 65530 гиперссылок на листе
 
Приветствую, коллеги. Кто-нибудь сталкивался с таким ограничением? (не более 65530 гиперссылок на листе) Сделал макрос, формирующий большую таблицу, и случайно напоролся на это ограничение (в каждой строке у меня - по 2 гиперссылки, после 32765-й строки гиперссылки перестали добавляться) На сайте майкрософта не нашел ничего про это ограничение:  
http://office.microsoft.com/ru-ru/excel-help/HP010073849.aspx  
(или плохо искал?) Убедиться в проблеме можно, запустив в новом документе такой макрос: Sub InsertHyperlinks() For i = 1 To 100000 Range("a" & i).Hyperlinks.Add Range("a" & i), "http://test.ru/page" & i, , , "Ссылка " & i If i Mod 100 = 0 Then DoEvents: Application.StatusBar = "формируется ссылка " & i Next End Sub На строке 65531 вылетит ошибка (msgbox "400") Есть возможность обойти это ограничение? (искал описание проблемы в инете - не нашел) PS: Просьба модераторам не править пост (чтобы ссылка превратилась в гиперссылку - после таких действий пост становится нечитаемым. А кто захочет пройти по ссылке - перейдёт по ней через нажатие ПКМ)
запуск нужного макроса с панели инструментов
 
Сегодня впервые столкнулся с тем, что не могу запустить нужный макрос с кнопки на панели инструментов... Итак, ситуация: 1) есть 3 абсолютно идентичных файла (созданы копированием одного и того же файла), отличающиеся только именем файла - test1.xls, test2.xls, test3.xls 2) каждый файл при запуске формирует панель инструментов с именем, совпадающим с именем файла (это неважно, суть в том, что при запуске 3 файлов создаются 3 идентичные панели инструментов) 3) на каждой панели инструментов - одна кнопка, запускающая простейший макрос (название макроса во всех 3 файлах совпадают, т.к. файлы являются копией друг друга) Задача: добиться того, чтобы каждая кнопка запускала свой макрос (из той книги, к которой принадлежит панель инструментов) Что я делаю: Каждой кнопке в свойство OnAction прописываю "MyMacro" - результат неутешительный (кнопка запускает макрос из первой попавшейся книги Понимаю, что надо указать имя файла, и назначаю кнопкам OnAction в виде 'testX.xls'!MyMacro (соответственно, у каждой кнопки OnAction становится разный) Запускаю - и офигеваю. Кнопки с OnAction = 'test2.xls'!MyMacro и 'test3.xls'!MyMacro запускают макрос из файла test1 Вопросы: 1) почему??? 2) как этого избежать? Пробовал писать PRIVATE sub MyMacro - не помогает (чтобы запускаемый макрос был виден только из своей книги) Во вложении - 3 этих идентичных файла. Проблема - на скриншоте: http://www.ExcelVBA.ru/pictures/20120210-on7-35kb.jpg
Надстройка для создания и печати этикеток, наклеек, ценников и квитанций из Excel
 
Недавно мне опять заказали подобную программку.  
 
Решил сделать нормальную (универсальную) надстройку, коей и спешу поделиться с форумчанами  
(а то иногда проскакивают на форуме темы, где требуется нечто подобное)  
 
Сама надстройка, файл для её тестирования, и инструкция в картинках, - у меня на сайте:  
http://excelvba.ru/programmes/Labels
Макрос оформления автофигуры криво работает в Excel 2007
 
Всем привет.  
 
Очень давно пользуюсь надстройкой для создания кнопок запуска макроса на листе Excel:  
http://excelvba.ru/code/Buttons  
 
И сколько я ей пользуюсь - столько и мучаюсь, ибо если в Excel 2003 функция рисует нормальную кнопку (как на скриншоте в статье), то в Excel 2007 на выходе получается безобразие (толстая рамка вокруг кнопки, цвет текста белый, и т.п.)  
 
Почему так происходит - понимаю, - Microsoft в 2007-й версии Excel что-то там наизменяла в плане стиля автофигур (что именно - до сих пор толком не разобрался)  
 
Пытался сам модернизировать код - добавляя всякие TintAndShade - но результата не добился (чтобы в 2007-м кнопки выглядели также, как в 2003-м)  
 
Может, кто подскажет, как изменить код?  
(макрорекордер в 2007-м ничего не пишет. Может, обладателям 2010-го, к коим я пока не отношусь, повезло больше?)
Ошибка при повторном запуске формы
 
Господа специалисты, подскажите, в чем может быть проблема:  
 
Есть прикреплённый файл в этой статье:  
http://excelvba.ru/code/frmAbout  
 
Первый запуск формы всегда проходит удачно, а при втором - вылетает ошибка  
(причем у меня - License for this component not found, а у других пользователей - ошибка 429)  
 
Форма - стандартная, никаких лишних или нестандартных компонентов на ней нет.  
 
PS: Если перед повторным запуском из окна Immediate выполнить команду END - повторный запуск происходит успешно.  
Значит, при закрытии формы крестиком что-то остаётся висеть в памяти.  
Вопрос - что именно?  
 
Пробовал на событие нажатия крестика вешать команду END - не помогает:  
 
Private Sub UserForm_Deactivate(): End: End Sub  
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer): End: End Sub  
 
У кого какие идеи?
Код не работает для других книг
 
Вам, наверное, покажется странным, что я задаю такой простой вопрос - но всё же...  
Может, кто объяснит в двух словах, в чем проблема?  
 
Поместил такой макрос в модуль ЭтаКнига:  
 
Sub test()  
   Dim ra As Range  
   Set ra = Intersect(Selection, ActiveSheet.UsedRange)  
End Sub  
 
Все работает без ошибок.  
 
 
Потом открыл другую книгу, и попытался запустить из неё макрос, оставшийся в модуле ЭтаКнига другого файла.  
 
Результат - ошибка (msgbox 400)  
 
В чем проблема?  
Я догадываюсь, что ошибка возникает при попытке взять пересечение из диапазонов, принадлежащим РАЗНЫМ книгам.  
Но почему так происходит?  
 
По идее, и Selection, и ActiveSheet.UsedRange должны ссылаться на активную книгу (на активный лист), но никак не на книгу, в модуле которой находится код.
требуется Программист VBA - Москва
 
Вдруг кого заинтересует - нашл объявление на соседнем форуме:  
http://www.programmersforum.ru/showthread.php?t=90020  
 
 
Цитата:  
 
Обязанности:  
 
Модернизация, актуализация, реинжениринг проекта VB.  
Разработка ТЗ, реализация ТЗ.  
Написание инструкции для пользователей.    
Сопровождение пользователей системы на экспертном уровне.  
 
 
Требования:  
 
20-40 лет, В/О техническое (дополнительное в области финансов приветствуется).  
Опыт участия в реализации проектов по разработке VBA приложений в финансовой области не менее 1 года.  
Языки программирования: VB, Программирование базы данных Access, знание Excel, Разработка ТЗ, реализация ТЗ, написание инструкции для пользователей.  
Английский - уровень чтения технической документации  
 
 
Условия:  
 
Договор ГПХ (6 месяцев).  
Пятидневка, 09.00-18.00, м. Павелецкая.  
Возможны командироки (около 10% рабочего времени).  
Заработная плата по итогам собеседования. (до 40000)  
 
Ждем ваши резюме по адресу:  
 
NatalyaGB@ulh.ru  
 
Пожалуйста, укажите в заголовке письма название вакансии.
Глюк Excel 2007 - картинки смещаются относительно ячеек
 
Уже второй раз сталкиваюсь с этим.  
Но в этот раз макрос нужен именно под Excel 2007 - поэтому вынужден искать решение проблемы.  
 
Суть проблемы:    
вставляю макросом картинки из файлов на лист таким кодом:  
Код
Function ВставитьКартинку(ByRef cell As Range, ByVal Pic As String) As Boolean   
    ' если картинка вставлена успешно, возвращает TRUE   
    On Error Resume Next: Err.Clear   
    Dim ph As Picture: Set ph = cell.Parent.Pictures.Insert(Pic)   
    ВставитьКартинку = Err.Number = 0   
    ph.Top = cell.Top: ph.Left = cell.Left: k = ph.Width / ph.Height   
    ph.Width = cell.Width: ph.Height = ph.Width / k   
    cell.EntireRow.RowHeight = ph.Height   
End Function   

В Excel 2003 всё работает замечательно - все картинки полностью совпадают по размерам с ячейками.  
 
В Excel 2007 каждая из вставляемых картинов размещается чуть ниже, чем надо.  
И чем ниже картинка на листе, тем больше смещение от ячейки.  
Т.е. в первой строке картинки вставляются точно, в 10-й - с небольшим сдвигом вниз (около миллиметра), в 50-й - сдвиг достигает сантиметра.  
 
Впечатление такое, что в Excel 2003 и 2007 по-разному вычисляется свойство .Top для картинов и\или ячеек.  

Ведь я помещаю картинку точно в левый верхний угол ячейки:  
Код
ph.Top = cell.Top: ph.Left = cell.Left  
   
Ещё раз замечу - в Excel 2003 подобные макросы работают идеально.  
 
Кто что посоветует?
Как разбить надстройку с классами на несколько файлов
 
Привет всем!  
Возник вопрос, ответ на который я до сих пор не могу найти.  
 
Ситуация:  
имеется надстройка (10000+ строк кода), состоящая из 50 модулей, и содержащая 20 модулей класса.    
Все модули активно работают с классами; классы объявлены с типом 1-Private (поскольку требуется создавать экземпляры классов)  
 
Всё работает, но... ориентироваться в модулях становится сложно, кроме того, потребовалось увеличение функциональности ( = добавление нескольких модулей)  
 
В связи с этим проблема: надо КАК-ТО РАЗДЕЛИТЬ НАДСТРОЙКУ на НЕСКОЛЬКО отдельных надстроек (модульная архитектура)  
 
Пытался сделать так: создаю новую настройку, перемещаю в неё пару стандартных модулей с кодом, ставлю в новой надстройке Reference на основную надстройку (которая содержит API-функции, классы и т.п., т.е. всё то, без чего код перенесённых модулей просто не будет работать)  
 
И всё бы хорошо, но из новой надстройки НЕ ВИДНЫ классы основной надстройки.  
Если же объявить классы как PublicNotCreatable, они становятся видны из новой надстройки, но, соответственно, перестают работать. (поскольку создать экземпляр класса становится невозможно)  
 
Вопрос: что можно сделать, чтобы основные функции (WinAPI, глобальные функции, классы) были в одном файле-надстройке, а модули, использующие это всё, располагались в других файлах?  
(чтобы я мог подгружать только необходимые файлы-модули; да и чтобы не таскать с проектом 4 мегабайта кода, а чтобы была возможность программно скачивать из Интернета только необходимые модули, которые я смогу обновлять при необходимости, не переделывая всю надстройку целиком)  
 
Реализовать в виде кода я смогу что угодно. Нужны лишь идеи, как это всё должно выглядеть...
преобразовать текст в число (при помощи формулы)
 
Привет всем!  
 
Элементарный вопрос, но я уже второй день не могу его решить :)  
 
Задача: в ячейке A1 находится текст 4.9 GHz  
(возможен, но маловероятен, вариант с запятой: 4,9 GHz)  
в соседней ячейке при помощи формулы надо получить число 4,9  
 
Какую формулу написать?  
Уже десяток вариантов перепробовал - ничего не выходит...  
 
Пробовал и такую формулу: =ЗНАЧЕН(ЛЕВСИМВ(ПОДСТАВИТЬ(A1;",";".");ПОИСК(" ";A1)))  
но она работает некорректно (Проверял в Excel 2003 и 2007):  
на предпоследнем шаге вычислений мы получаем =ЗНАЧЕНИЕ("5.2 ")  
а потом при вставке этого значения в ячейку оно автоматически преобразовывается в дату (её числовое значение)  
 
Есть ли возможность использовать какую-то совсем простую формулу типа =Ч(A1)?  
 
 
Вот пример файла:  http://excelvba.ru/XL_Files/Sample__08-10-2009__15-49-21.zip  
 
Дело в том, что я делаю прайс, который должен работать во всех версиях и локализациях Excel и с разными десятичными разделителями в настройках Excel...  
 
Макросом я сделал бы это за секунду, но тут нужна именно формула.
OFFTOP
 
Вдруг кому пригодится: По поводу авторизации на сайте planetaexcel.ru. Yаверняка, у многих возникали проблемы с необходимостью ежедневного ввода логина и пароля, в то время, как на других сайтах такого нет - один раз ввёл логин и пароль, поставил галочку ЗАПОМНИТЬ, и каждый раз при входе на форум сисмета АВТОМАТИЧЕСКИ Вас авторизует. На этом же форуме (planetaexcel.ru), судя по всему, не полностью (или некорректно) реализована работа с COOKIES (виноват устаревший движок форума), поэтому вводить пароль при входе на форум приходится после каждого перезапуска браузера (по крайней мере, так до недавнего времени обстояло дело у меня - WinXP, Opera 9.63) Честно говоря, это надоедало. Поэтому я стал авторизовываться на сайте всё реже, а потом, когда при падении базы форума моя учётка удалилась, и вовсе перестал. Теперь я нашёл решение проблемы, установив браузер Opera 10. Там появилась замечательная кнопка, нажатие на которую автоматически авторизует пользователя. (может, такая функция была и раньше, но я не замечал) Вот скриншот:  http://i077.radikal.ru/0909/63/05ae4584d6f1.jpg Эта кнопка - синего цвета с нарисованным на ней ключом. Теперь, открыв форум, я нажимаю на эту кнопку, и сразу авторизуюсь - вбивать логин и пароль не требуется. (ввести данные вручную в эти поля придётся только один раз - перед использованием кнопки) Ради такого дела я даже снова завёл аккаунт на сайте :)
Страницы: 1
Наверх