Всем привет Из VBA обращаюсь к функциям из DLL SeleniumBasic, и всё отлично работает, кроме одного метода. Точнее, всё отлично работает при использовании раннего связывания, но при позднем связывании VBA отказывается видеть содержимое массива Прилагаю скриншот, где видно тип объектов (один - где все работает - с ранним связыванием, второй - с поздним)
При позднем связывании вылетают 2 весьма специфические ошибки: Run-time error 458: Variable uses an Automation Type not supported in Visual Basic Run-time error 10: This array is fixed or temporarily locked
Библиотеку (DLL) сделал китаец, с которым связи нет, и ждать новых версий не приходится Единственная надежда - обойти как-то эту ошибку (это ошибка его библиотеки, а не моего кода), но как именно - не знаю В интернетах пишут, что есть шанс с использованием функции CopyMemory, но я не понимаю, как её применить Может кто подскажет?
PS: мне совсем не вариант использовать раннее связывание
Всем привет. Появилась задача, которую не знаю каким способом лучше реализовать.
Проблема: нужно при работе макроса кешировать пары вида Ключ|Значение (Имеем ключ. Если в текстовом файле уже есть пара для этого ключа, надо считать значение, а если нет, то позже из того же макроса дописать туда эту пару, когда станет известно значение). Файл предназначен для использования этих данных при следующих запусках макроса (каждый запуск макроса может немного пополнять этот файл)
Ситуация осложняется следующим:
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
Столкнулся с ситуацией, когда макросом надо получить список диапазонов всех защищённых ячеек на листе, без перебора ячеек в цикле. Лист может быть большой, защита может стоять на нескольких отдельных диапазонах (отдельные ячейки, диапазоны, столбцы), ячейки могут быть пустые или заполненные. Задача: в переменную считать адрес всех этих диапазонов, как это позволяет делать, например, SpecialCells res = cells.SpecialCells(xlCellTypeConstants).Address
Для чего нужно: на листе защищены часть ячеек, но надо временно поставить защиту на весь лист, а потом снять защиту, но чтобы ранее защищённые ячейки остались защищены.
В объектной модели Excel ничего такого не нашёл. Есть идеи?
<добавлено> Нагуглил вариант поиска (Cells.Find) по формату ячейки, там можно найти защищённые ячейки, - но когда защищён столбец целиком, всё это дело виснет, - т.к. видно, что Excel в этом случае перебирает отдельные ячейки (пишет, что найдено 1048593 ячейки, - и висит 5 минут, т.к. не может сразу отобразить результаты поиска) Да и не очень понятно, как поиском найти и пустые и заполненные ячейки одновеременно
Приветствую, коллеги Есть среди вас счастливые обладатели Office 365, где Office автоматически обновляется?
У меня беда, - в моих программах частично перестали отображаться такие элементы управления, как Multipage и Frame (точнее, они частично стали прозрачными / невидимыми) Водишь мышом над таким Multipage и Frame, щелкаешь по нему, - кнопки и прочие комбобоксы начинают отрисовываться, но глючат (выпадающие списки не работают)
Как говорят пользователи, - проблема пришла недавно, с очередным обновлением. И ведь не откатиться вроде никак, на прежнюю версию... Лечится только установкой нормального Office (другого)
Кто-нибудь с подобным сталкивался? Это как-нибудь можно исправить, продолжая пользоваться Office 365?
Работа удалённая. Для работы нужен интернет, Скайп (голосовая связь), Excel, браузер Chrome, и желание зарабатывать.
Знание программирования не требуется (но умение работать с VBA или понимание формул, - приветствуется) Обязательны ответственность, и желание работать. Нужны базовые знания Excel, также надо понимать, как устроен сайт (HTML - теги, классы, ID элементов)
В последнее время, у меня стали скапливаться заказы на макросы, где надо вникать в суть задачи, и обсуждать потом нюансы с заказчиком по скайпу. Средний объём работы по заказу, — от 2 до 7 дней, стоимость (которую вы получите на руки, после вычета моей комиссии) — от 3 до 20 т.р. Количество заказов в месяц, — около 2-3 (с простыми заказами мои коллеги успешно справляются, а на сложных, «мутных», заказах, у меня всего 1 человек, — порой все заняты, и некому отдать заказ в работу)
Нужен человек (известный мне по форуму), который:
1) имеет возможность и желание работать с платными заказами (для этого нужен скайп, ЧАСТО появляться в инете, и желательно иметь возможность принимать платежи от заказчиков)
2) отлично знает макросы, и может наколдовать с их использованием почти что угодно отличное знание формул — не обязательно, но понимание простейших формул и умение их применять, - обязательно знание сводных таблиц, и прочих встроенных возможностей Excel, — приветствуется
3) ответственный, быстро реагирует на мои сообщения в скайпе, не затягивает проекты, не пропадает со связи Мне попадались отличные спецы, но безответственные, — заказчики начинают мне жаловаться, что человек пропал, не спешит выходить на связь, и т.д. Меня такое не устраивает, - если работать, то работать (если уже взял задачу в работу, - надо делать, а не отмораживаться) Заказчики готовы платить деньги, - и ждут, что их заказом будут заниматься. Сроки обычно не поджимают, бюджет можно согласовать какой требуется, - главное, ответственность исполнителя.
По всем вопросам сотрудничества, - готов проконсультировать по скайпу.
Вкратце о схеме взаимодействия: я перенаправляю вам письмо заказчика (заказ с указанием всех контактных данных), вы сами связываетесь с заказчиком, обсуждаете нюансы и стоимость (по цене - сами решаете, не забыв заложить в неё мой интерес), получаете предоплату (минимум 50%), делаете, получаете остаток оплаты, высылаете мне мою комиссию. (т.е. я не вникаю в заказ, - моя задача передать вам заказ в работу, - вы мне отписываетесь в скайп, берётесь или нет, - и, если вы за него беретесь, то потом, когда все сделаете, отправляете мне мою часть суммы. Для оплаты заказчиком, доступны все мои способы оплаты, - т.е. могут платить вам, а вы мне потом мой процент возвращаете, либо заказчик оплачивает на мои счета, а я вам потом вашу часть перевожу)
Приветствую, коллеги Просьба протестировать найденный мной в инете макрос активации вкладки НАДСТРОЙКИ (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, и 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 у вас установлена.
Ситуация такова, что сейчас мне некому передавать заказы, где надо все реализовать при помощи хитрых сложных формул (для меня, сложные формулы, - это всё кроме =И(), =ЕСЛИ(), = ВПР(), =СУММ() и подобного)
Нужен человек (известный мне по форуму), который: 1) имеет возможность и желание работать с платными заказами (для этого нужен скайп, частенько появляться в инете, и иметь возможность принимать платежи от заказчиков) 2) отлично знает формулы, и может наколдовать с их использованием почти что угодно (знаю, на этом форуме точно несколько таковых есть) знание макросов - не обязательно знание веб-запросов, сводных таблиц, и прочих встроенных возможностей Excel - приветствуется
По всем вопросам сотрудничества, - готов проконсультировать по скайпу. Заказов таких немного у меня (в 95% случаев устраивают макросы), - но вот иногда надо все замутить без макросов, и тогда я буду обращаться к вам уже лично
Вопрос по использованию «старых» панелей инструментов (которые отображаются на вкладке НАДСТРОЙКИ) в Excel 2013
Задача: сделать так, чтобы панель инструментов, созданная макросом при запуске надстройки, НЕ ИСЧЕЗАЛА при закрытии того файла Excel, который был активен в момент программного создания этой панели.
Кроме того, ещё проблема: панель инструментов СОХРАНЯЕТСЯ вместе с файлом Excel (потом, при открытии файла Excel, панель отрисовывается, хотя надстройка не запущена)
В Excel 2007 - 2010 таких проблем не было, это в Office 2013 майкрософт чего-то нового намудрил
Вопрос: есть ли способы избавиться от такого поведения Excel? (чтобы работало как в прежних версиях - панель инструментов не привязана к открытому в Excel файлу)
PPS: Вариант с XML не предлагать, - я про него знаю, но пока не могу использовать (очень много кода переписывать, т.к. использую динамические меню) Да и надо сохранить совместимость с Excel 2003 В будущем, конечно, буду делать меню через XML, - но пока хочу узнать, есть ли хотя бы теоретическая возможность обойти это нововведение в Excel
демонстрируется в качестве примера финансовый документ с готовыми данными, в котором требуется получить ещё одно поле, складывая два последних — Base pay и Of pay. Обычный действия заключаются в том, что необходимо разместить курсор в нужной ячейке, ввести в неё формулу и «протащить» её до нужного диапазона. Вместо этого в поле для формулы вводится команда "add the base pay and of pay" и в итоге Excel заполняет поле, складывая указанные в «формуле» значения ячеек в указанных столбцах. Примерно также находится и сумма — командой "add up".
Мне поступил заказ от студента, но сам я не могу за него взяться (времени свободного нет)
Есть задание (описание + примеры файлов Excel) - могу выслать. Задание немного мутное, конкретики не так много, - но сделать реально, если у кого есть свободное время и желание.
Сроки: 1-2 недели Бюджет: 15-20 т.р.
Просьба обращаться только тех форумчан, кто давно на Планете (кого я знаю по никам) Новичков просьба не беспокоить — отдам заказ только тому, в ком буду уверен, что человек справится.
Пишите на почту - я вышлю вам задание, вы посмотрите, и, если возьмётесь, — то уже свяжетесь напрямую с заказчиком, и всё будете уже с ним обсуждать (цену, сроки, нюансы, и т.д.)
' 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, обе функции написаны верно. Регулярно пишу подобные по методам работы функции - никогда проблем не было.
PS: Тестировал на разных файлах - без проблем прикрепляются и 15-мегабайтные файлы (время загрузки\выгрузки такого файла - около 35 секунд) Маленькие файлы прикрепляются и извлекаются практически моментально.
Для хранения данных файлов используется скрытый лист.
Хотелось бы выслушать критику - всё ли правильно сделано, какие возможны проблемы при использовании.
Не могу придумать способ реализации для вроде бы элементарного действия.
Итак, есть кнопка на панели инструментов, при нажатии которой должно выскочить диалоговое окно выбора файла, после чего выбранный файл (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++) Поскольку код будет использоваться на множестве компов, этот вариант не подходит.
У кого какие идеи? Вроде бы, этот вопрос уже обсуждался, - но поиском не смог найти ответ.
Для чего это нужно: делаю программу обработки прайс-листов.
Среди них попадаются файлы в формате 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>
Приветствую, коллеги. Кто-нибудь сталкивался с таким ограничением? (не более 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 2003 функция рисует нормальную кнопку (как на скриншоте в статье), то в Excel 2007 на выходе получается безобразие (толстая рамка вокруг кнопки, цвет текста белый, и т.п.)
Почему так происходит - понимаю, - Microsoft в 2007-й версии Excel что-то там наизменяла в плане стиля автофигур (что именно - до сих пор толком не разобрался)
Пытался сам модернизировать код - добавляя всякие TintAndShade - но результата не добился (чтобы в 2007-м кнопки выглядели также, как в 2003-м)
Может, кто подскажет, как изменить код? (макрорекордер в 2007-м ничего не пишет. Может, обладателям 2010-го, к коим я пока не отношусь, повезло больше?)
Первый запуск формы всегда проходит удачно, а при втором - вылетает ошибка (причем у меня - 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 должны ссылаться на активную книгу (на активный лист), но никак не на книгу, в модуле которой находится код.
Модернизация, актуализация, реинжениринг проекта VB. Разработка ТЗ, реализация ТЗ. Написание инструкции для пользователей. Сопровождение пользователей системы на экспертном уровне.
Требования:
20-40 лет, В/О техническое (дополнительное в области финансов приветствуется). Опыт участия в реализации проектов по разработке VBA приложений в финансовой области не менее 1 года. Языки программирования: VB, Программирование базы данных Access, знание Excel, Разработка ТЗ, реализация ТЗ, написание инструкции для пользователей. Английский - уровень чтения технической документации
Условия:
Договор ГПХ (6 месяцев). Пятидневка, 09.00-18.00, м. Павелецкая. Возможны командироки (около 10% рабочего времени). Заработная плата по итогам собеседования. (до 40000)
Ждем ваши резюме по адресу:
NatalyaGB@ulh.ru
Пожалуйста, укажите в заголовке письма название вакансии.
Уже второй раз сталкиваюсь с этим. Но в этот раз макрос нужен именно под 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)?
Дело в том, что я делаю прайс, который должен работать во всех версиях и локализациях Excel и с разными десятичными разделителями в настройках Excel...
Макросом я сделал бы это за секунду, но тут нужна именно формула.
Вдруг кому пригодится: По поводу авторизации на сайте planetaexcel.ru. Yаверняка, у многих возникали проблемы с необходимостью ежедневного ввода логина и пароля, в то время, как на других сайтах такого нет - один раз ввёл логин и пароль, поставил галочку ЗАПОМНИТЬ, и каждый раз при входе на форум сисмета АВТОМАТИЧЕСКИ Вас авторизует. На этом же форуме (planetaexcel.ru), судя по всему, не полностью (или некорректно) реализована работа с COOKIES (виноват устаревший движок форума), поэтому вводить пароль при входе на форум приходится после каждого перезапуска браузера (по крайней мере, так до недавнего времени обстояло дело у меня - WinXP, Opera 9.63) Честно говоря, это надоедало. Поэтому я стал авторизовываться на сайте всё реже, а потом, когда при падении базы форума моя учётка удалилась, и вовсе перестал. Теперь я нашёл решение проблемы, установив браузер Opera 10. Там появилась замечательная кнопка, нажатие на которую автоматически авторизует пользователя. (может, такая функция была и раньше, но я не замечал) Вот скриншот: http://i077.radikal.ru/0909/63/05ae4584d6f1.jpg Эта кнопка - синего цвета с нарисованным на ней ключом. Теперь, открыв форум, я нажимаю на эту кнопку, и сразу авторизуюсь - вбивать логин и пароль не требуется. (ввести данные вручную в эти поля придётся только один раз - перед использованием кнопки) Ради такого дела я даже снова завёл аккаунт на сайте :)