Привет, народ! Давненько я на Планете не появлялся. Всё не до программирования было, да и на Андроид подсел. А тут понадобилось обеспечить передачу небольших текстовых массивов (несколько десятков элементов) для заполнения ListBox между разными приложениями. Использовать создание/удаление текстового файла, а уж тем более использование именованного диапазона памяти на компе для такой простой задачи мне показалось избыточным. Вот я на переменные окружения и посмотрел. Стандартная функция Environ для этой цели не подходит, т.к. только читает переменные окружения, да и то далеко не все. А вот в CreateObject("WScript.Shell").Environment("USER") можно как добавлять собственные, так и удалять не нужные переменные. (Переменные типов "SYSTEM", "VOLATILE","PROCESS" доступны только для чтения). По ходу дела для сравнения переменных, доступных через Environ и Environment написал две процедурки, создающие в текущей книге листы со списками переменных окружения и их значениями
ENVIRION_Excel_Sheet
Код
Sub ENVIRION_Excel_Sheet() ' создать в текущей книге лист со списоком переменных окружения
On Error Resume Next
Dim sh As Worksheet, i%, sEnvName$, sHeader()
Dim sLastName$: sLastName = "windows_tracing_logfile"
sHeader = Array("index", "Environment Value", "Value @ " & Environ("COMPUTERNAME") & " [" & Format(Now, "yyyy-mm-dd hh:mm:ss") & "]")
Application.ScreenUpdating = False: Set sh = ThisWorkbook.Worksheets.Add
With Cells(1, 1).Resize(1, UBound(sHeader) + 1)
.Value = sHeader
For i = 1 To 63
sEnvName$ = Split(Environ(i), "=")(0) ' Environ(i) возвращает текст типа OS=Windows_NT
.Offset(i).Value = Array(i, sEnvName$, Environ(sEnvName$))
If sEnvName = sLastName Then Exit For
Next
End With
Rows("2:2").Select: ActiveWindow.FreezePanes = True: Rows("1:1").Font.Bold = True
With Cells: .EntireColumn.AutoFit: .HorizontalAlignment = xlLeft: .VerticalAlignment = xlBottom: End With
Application.ScreenUpdating = True
End Sub
ENVIROMENTS_Excel_Sheet
Код
Sub ENVIROMENTS_Excel_Sheet() ' создать в текущей книге лист со списоком переменных окружения, их типами и значениями
' On Error Resume Next
Dim oSheet As Worksheet, sEnvName$, sEnvVal$, xArr, xItem, iNdex%
Dim sHeader(): sHeader = Array("Environment Name", "Type", "Value @ " & Environ("COMPUTERNAME") & " [" & Format(Now, "yyyy-mm-dd hh:mm:ss") & "]")
Dim Arr(): Arr = Array("SYSTEM", "VOLATILE", "PROCESS", "USER") ' все возможные типы переменных окружения
Dim oDict: Set oDict = CreateObject("Scripting.Dictionary"): oDict.CompareMode = vbTextCompare ' словарь для сбора данных
Dim oShell: Set oShell = CreateObject("WScript.Shell") ' ссылка на объект WScript.Shell
iNdex = iNdex + 1 ' т.к. sEnvName не уникальны и могут повторяться в разных типах, то как ключ приходится использовать iNdex
oDict.Add Key:=iNdex, Item:=Array(sHeader(0), sHeader(1), sHeader(2)) ' заголовки таблицы занесены в словарь под ключом iNdex=0
'Debug.Print iNdex & vbTab & oDict.Item(iNdex)(0) & vbTab & oDict.Item(iNdex)(1) & vbTab & oDict.Item(iNdex)(2)
For Each xArr In Arr ' цикл по всем типам переменных
For Each xItem In oShell.Environment(xArr) ' цикл по всем переменным данного типа
sEnvName = Left(xItem, 1) & Split(Mid(xItem, 2), "=")(0) ' выделить Имя из записи типа Имя=Значение с учётом наличия имён, начинающихся с =
sEnvName = IIf(Left(sEnvName, 1) = "=", "'", "") & sEnvName ' патч для предотвращения вычисления формул на листе Excel
sEnvVal = Split(Mid(xItem, 2), "=", 2)(1) ' выделить Значение из записи типа Имя=Значение с учётом наличия имён, начинающихся с =
sEnvVal = IIf(Left(sEnvVal, 1) = "=", "'", "") & sEnvVal ' патч для предотвращения вычисления формул на листе Excel
iNdex = iNdex + 1 ' очередной ключ для записи в словарь
oDict.Add Key:=iNdex, Item:=Array(sEnvName, xArr, sEnvVal)
'Debug.Print iNdex & vbTab & oDict.Item(iNdex)(0) & vbTab & oDict.Item(iNdex)(1) & vbTab & oDict.Item(iNdex)(2)
Next xItem
Next xArr
With Application.WorksheetFunction ' функция листа ТРАНСП при транспонировании преобразует массив массивов в 2D-массив
Arr = .Transpose(.Transpose(oDict.Items)) ' двойное транспонирование вернёт 2D-массив, пригодный к прямой передаче в диапазон на листе
End With
Application.ScreenUpdating = False: Application.EnableEvents = False
Set oSheet = ThisWorkbook.Worksheets.Add
Cells(1, 1).Resize(UBound(Arr, 1), UBound(Arr, 2)).Value = Arr ' запись 2D-массива на лист
Rows("2:2").Select: ActiveWindow.FreezePanes = True: Rows("1:1").Font.Bold = True ' красота на листе
With Cells: .EntireColumn.AutoFit: .HorizontalAlignment = xlLeft: .VerticalAlignment = xlBottom: End With
Application.ScreenUpdating = True: Application.EnableEvents = True
End Sub
Если возникнет ошибка при обращении к функции листа ТРАНСП (у некоторых это бывает), то можно использовать и чуть более сложный вариант с обработкой массива циклом:
ENVIROMENTS2_Excel_Sheet
Код
Sub ENVIROMENTS2_Excel_Sheet() ' создать в текущей книге лист со списоком переменных окружения, их типами и значениями
' On Error Resume Next
Dim oSheet As Worksheet, sEnvName$, sEnvVal$, xArr, xItem, iNdex%
Dim sHeader(): sHeader = Array("Environment Name", "Type", "Value @ " & Environ("COMPUTERNAME") & " [" & Format(Now, "yyyy-mm-dd hh:mm:ss") & "]")
Dim Arr(): Arr = Array("SYSTEM", "VOLATILE", "PROCESS", "USER") ' все возможные типы переменных окружения
Dim oDict: Set oDict = CreateObject("Scripting.Dictionary"): oDict.CompareMode = vbTextCompare ' словарь для сбора данных
Dim oShell: Set oShell = CreateObject("WScript.Shell") ' ссылка на объект WScript.Shell
iNdex = iNdex + 1 ' т.к. sEnvName не уникальны и могут повторяться в разных типах, то как ключ приходится использовать iNdex
oDict.Add Key:=iNdex, Item:=Array(sHeader(0), sHeader(1), sHeader(2)) ' заголовки таблицы занесены в словарь под ключом iNdex=0
'Debug.Print iNdex & vbTab & oDict.Item(iNdex)(0) & vbTab & oDict.Item(iNdex)(1) & vbTab & oDict.Item(iNdex)(2)
For Each xArr In Arr ' цикл по всем типам переменных
For Each xItem In oShell.Environment(xArr) ' цикл по всем переменным данного типа
sEnvName = Left(xItem, 1) & Split(Mid(xItem, 2), "=")(0) ' выделить Имя из записи типа Имя=Значение с учётом наличия имён, начинающихся с =
sEnvName = IIf(Left(sEnvName, 1) = "=", "'", "") & sEnvName ' патч для предотвращения вычисления формул на листе Excel
sEnvVal = Split(Mid(xItem, 2), "=", 2)(1) ' выделить Значение из записи типа Имя=Значение с учётом наличия имён, начинающихся с =
sEnvVal = IIf(Left(sEnvVal, 1) = "=", "'", "") & sEnvVal ' патч для предотвращения вычисления формул на листе Excel
iNdex = iNdex + 1 ' очередной ключ для записи в словарь
oDict.Add Key:=iNdex, Item:=Array(sEnvName, xArr, sEnvVal)
'Debug.Print iNdex & vbTab & oDict.Item(iNdex)(0) & vbTab & oDict.Item(iNdex)(1) & vbTab & oDict.Item(iNdex)(2)
Next xItem
Next xArr
xItem = oDict.Items ' массив значений копируем в массив (напрямую читать из oDict.Items нельзя)
ReDim Arr(0 To oDict.Count - 1, 0 To 2) ' для вывода на лист массив массивов необходимо преобразовать в 2D-массив
For iNdex = 0 To oDict.Count - 1
Arr(iNdex, 0) = xItem(iNdex)(0)
Arr(iNdex, 1) = xItem(iNdex)(1)
Arr(iNdex, 2) = xItem(iNdex)(2)
Next iNdex
Application.ScreenUpdating = False: Application.EnableEvents = False
Set oSheet = ThisWorkbook.Worksheets.Add
Cells(1, 1).Resize(UBound(Arr, 1) + 1, UBound(Arr, 2) + 1).Value = Arr ' запись 2D-массива на лист
Rows("2:2").Select: ActiveWindow.FreezePanes = True: Rows("1:1").Font.Bold = True ' красота на листе
With Cells: .EntireColumn.AutoFit: .HorizontalAlignment = xlLeft: .VerticalAlignment = xlBottom: End With
Application.ScreenUpdating = True: Application.EnableEvents = True
End Sub
Ну а теперь о возникшей странной проблеме при использовании Environment("USER"). Передача стрингов через них получается не сложно и устойчиво работает. Вот только удивляют большие задержки при создании переменной и её последующем удалении. Стал анализировать. При счёте времени по Timer получил не только не повторяющиеся, но и вообще странные результаты. Мало того, что длительность процедур сильно плавает от теста к тесту, но при чтении она каким-то образом вообще иногда получается отрицательной! Для проверки прицепил ещё и счёт времени через API Длительности процессов, полученных через Timer и GetTickCount получаются разные! Отрицательных значений GetTickCount, правда не даёт, но и нулевые как-то напрягают. Вот код, который я использовал для проверки длительности:
Environment("USER").Count = 4 Create Duration (by Timer) = 0,96875 s Create Duration (by Ticker) = 1,294 s Environment("USER").Count = 5 Read Duration (by Timer) = -0,03125 s Value = test-test-test Read Duration (by Ticker) = 0 s Delete Duration (by Timer) = 2,28515625 s Delete Duration (by Ticker) = 2,325 s Environment("USER").Count = 4
Ничего не понимаю! Неделю назад в Миру создал топик Работа с переменными окружения Windows для обсуждения данного вопроса. Но что-то никто из знатоков этот феномен так и не объяснил. P.S. Файл с процедурами, к сожалению, с работы выложить не могу: собаки-сисадмины, маньяки, макросы из интранета наружу не выпускают.
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Ребята, напомните, как называется строка меню, где слева окошко с адресом ячейки/именем диапазона, а правее - строка ввода формул. Вдруг пропала. Не тогу найти.
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Одна из причин, почему я перестал тусить на Планете, это то, что в оповещениях приходят почему-то ссылки не на пост, где появились новые ответы, а на мой же профиль. [QUOTE]Информационное сообщение сайта Планета Excel ------------------------- Новое сообщение на форуме planetaexcel.ru. Тема: Пошаговая отладка кода VBA Автор: Johny Дата : 14.05.2014 09:34:51 Текст сообщения: Если Вы пытаетесь поставть break point на строке объявления переменных, то она ставится не будет.
Случайно наткнулся на долгожителя... При всём уважении, antal10, скажите, как Вы умудрились зарегистрироваться на форуме 1 Января 1970 года? 1. На каком компьютере тогда работали? 2. А что тогда было вместо Интернета? 3. На каком движке у Николая Павлова был форум?
И вообще, как Вы умудрились протащить на 44 года назад не только себя, но и компьютер вместе с сегментом интернета?
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Столкнулся с простой, как сначала показалось, задачей. В договоре написано что-то типа: "Срок сдачи работ - через 30 рабочих дней с момента оплаты" Думал, что удастся использовать функцию ЧИСТРАБДНИ, но она считает рабочие дни от даты до даты. А вот как используя её получить срок исполнения договора? Что-то у меня затык настал
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Мне нужно в .OnAction процедуры модуля ЭтаКнига прописать имя процедуры, размещённой в стандартном модуле и определённой как Private Sub (Private - чтобы не мозолила глаза в "Макросах" . Модуль пока называется по умолчанию Module1, но при "причёсывании" кода скорее всего будет переименован. Вот я и хотел .OnAction сделать составным из программно задаваемого (через переменную) имени модуля и имени процедуры. А узнать имя модуля что-то не получается
Указать в коде имя модуля листа, где работает процедура, просто:
Код
Sub Module_Name()
Debug.Print Me.Name
End Sub
А как указать имя стандартного модуля?
Изменено: Alex_ST - 22.02.2013 14:28:15(Сплющился в одну строку код... Долбаные тэги!)
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Чистил список своих UDF и обнаружил, что в категории "Определённые пользователем" есть функции IsShared и Accrint, путь к книге с которыми не указан в отличие от моих "самоделок", как будто они находятся в текущей книге или являются встроенными в Excel. Прошёлся поиском по всем открытым проектам VBA. Нет там таких. Правда, в пакет анализа (ATPVBAEN.XLA и FUNCRES.XLA) заглянуть не смог, т.к. они от меня закрыты паролем. Отключив пакет анализа, выяснил, что это, действительно, функции оттуда. Кто знает, что это за функции, где есть по ним справка?
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Что-то я не пойму, в какой последовательности открываются файлы надстроек и Personal Excel при его загрузке? Вот, к примеру, у меня в AddIns'ах лежат файлы надстроек: ConditionalFormatting_Menu v1.2.xla, Выбор даты v2.1.xla, Управление видимостью листов.xla А в XLSTART, естественно, Personal.xls
Проверил, в каком порядке они загружаются (добавил им в процедуры обработки событий Open строчку Debug.Print ThisWorkbook.Name & " Open") Получил такую фигню: Управление видимостью листов.xla Open Выбор даты v2.1.xla Open ConditionalFormatting_Menu v1.2.xla Open Personal.xls Open
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Причёсываю свой Personal.xls При его открытии производится настройка разных менюшек (добавляются/удаляются меню, кнопки и подменю) Перед тем, как добавить макросом кнопку в меню, на всякий случай (чтобы не было дублирования) хорошо бы попытаться её удалить. Добавить то стандартную кнопку можно просто по её ID, а вот как обратиться к .Controls не по индексу или капче кнопки (они могут меняться), а тоже по ID?
Вот, например, как я сейчас в выпадающее меню ячейки после "Вставить" добавляю стандартную команду "Вставить значения" Private Sub PopupMenuCellChange() On Error Resume Next With Application.CommandBars("Cell"): .Controls("Вст&авить значения").Delete .Controls.Add ID:=370, Before:=.Controls("Вставить").Index + 1, Temporary:=True End With End Sub Оно, конечно, работает, но при смене наименований пунктов (например, в английской локали) работать перестанет, т.к. пункты "Вст&авить значения" и "Вставить" будут называться по-другому. Но ведь при этом команда "Вст&авить значения" имеет вполне однозначный идентификатор ID:=370, а команда "Вставить" имеет ID:=22, которые, как я понимаю, не зависят ни от локализации, ни от версии Excel Вот и встал вопрос: нельзя ли вместо обращения к стандартному элементу меню по его названию использовать обращение по его ID? Что-то я не смог найти как ? :(
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Делаю надстройку, которая вводит дополнительные пункты в меню ячейки Excel-2003. Подменюшки и кнопки добавил, но для красоты хотел отделить их разделителями от стандартных. Забыл как элемент называется! Честно поискал и на Планете, и в и-нете. Все уже переехали на 2007/2010, а там это только через XML делается - элемент menuSeparator вставляется. И про мой любимый уже никто не пишет :( В Справке тоже что-то не находится. Народ, напомните, как вставить разделитель пунктов в меню Excel-2003?
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
В процессе работы с таблицами ячейки/строки/столбцы могут удаляться/перемещаться через"вырезать-вставить". Формулы листа сразу покажут ошибки при их возникновении. А вот как отследить (найти) ошибки, возвращаемые формулами УФ на листе? Ведь их результат - всего лишь отсутствие должного форматирования. Короче: как сделать цикл по ячейкам листа, который найдёт ячейки с УФ и проверит их формулы на наличие ошибок?
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Заранее прошу прощения за кросспост, но в Миру ( http://www.excelworld.ru/forum/2-2857-1 ) что-то ничего толкового мне не подсказали, а у Серёги (KuklP) сегодня День варенья (и здесь ПОЗДРАВЛЯЮ) и он на более важное дело отвлёкся, естественно. А свободное время у меня чтобы поковыряться с проблемой есть сейчас. Чуть сокращу свой пост "в Миру": Пытаюсь подкрутить свой макрос для склеивания текстов из нескольких объединяемых ячеек в один стринг с переносами строк до юзабилити состояния чтобы было можно делать не только Merge без потери данных, но и UnMerge с распределением по ячейкам. Sub Merge_with_Chr10() ' объединить выделенные ячейки, склеив их тексты с переносами строк If TypeName(Selection) <> "Range" Then Exit Sub Dim rRng As Range: Set rRng = Intersect(Selection, ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible)) If rRng Is Nothing Then Exit Sub If rRng.Cells.Count = 1 Then Exit Sub Dim text$, rCell As Range For Each rCell In Intersect(Selection, ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible)) If Len(rCell.Value) Then text = text & IIf(Len(text), vbLf, "") & rCell.Value Next rCell Application.DisplayAlerts = False rRng.Merge: rRng.Value = Application.Trim(text) Application.DisplayAlerts = True End Sub Да ещё при этом хотелось бы в объединённой ячейке умудриться данные из объединяемых не только "в столбик" vbLF'ом разделять, но и по горизонтали. Ну в смысле чтобы в объединённой ячейке сохранялось подобие расположения данных, которое было в объединяемых. Множественные пробелы, естественно, не катят для горизонтального распределения данных внутри ячейки (ну не блондинки же мы-секретарши чтобы переносы в ячейках пробелами делать :D ) Я тут в ручном режиме ввода в ячейку попробовал организовать наглядность разделителями-символами псевдографики. Не наглядно получилось. Хотя потом по этим символам не сложно было бы и UnMerge с обратной расстановкой по ячейкам организовать. А потом решил попробовать сделать "в лоб" - ввести макросом в стринг, вставляемый в объединённую ячейку табуляцию. В окне Immediate выполнил: [a1]="12" & vbtab & "34" Посмотрел на лист. На первый взгляд в ячейке А1 на листе ничего не получилось. Но когда я "прошёлся" в строке формул курсором по символам слева-направо, то очень интересно получилось: после 2 курсор скакнул за несколько знако-мест на середину символа 4, а потом пошёл дальше 2 раза по пустому месту (прямо как будто у меня там пробелов после 4 понатыкано). Т.е. символ табуляции в ячейке всё-таки не "глушится" Excel'ем, а только не отображается! Вот бы придумать, как его отображать! Есть у кого-нибудь идеи?
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Народ, помогите, пожалуйста, довести до законченного вида аналог MS Progect'a в части построения план-графиков работ (диаграмм Ганта) Сразу предупреждаю: статью "Календарный график проекта (диаграмма Ганта) версия 3.0" на http://www.planetaexcel.ru/tip.php?aid=83 я читал и файл "щупал". ИМХО, слишком сложно (по крайней мере для меня) и не гибко (если вдруг понадобимся что-то сдвинуть или добавить, то всё съедет).
В своём варианте я использую одновременно и макросы, и формулы, и именованные диапазоны, и условное форматирование... В общем - полный фарш :) Применение именованных диапазонов позволяет не лезть в код при перемещении при необходимости таблицы по листу, изменения количества столбцов до начала графиков и изменения символа-заполнителя.
Дабл-кликом в поле графика инвертируется значение конкретной ячейки в области графика (символ-заполнитель ставится/снимается). Можно просто при желании и просто стирать, вписывать, протягивать символы заполнения по области графика. УФ в ячейках строки дат закрашивает субботы, воскресенья, праздники и "чёрные выходные", назначенные из-за переноса рабочих дней. Поставив "гульку" в чек-боксе, можно выделять одновременно строки+столбцы "кликнутых" ячеек в области построения графика (за идею спасибо The_Prist, но реализовано по другому).
Почти всё уже доделал. Осталось сделать зачистку строк и добавление новых строк событий. Но это мелочи. ПРОБЛЕМА: Формулы для вычисления первой и последней дат и длительности в столбцах C-D-E не мои. А там, похоже, удобнее использовать именно формулы листа, а не макросы. Я их списал у ber$erk здесь: http://www.planetaexcel.ru/forum.php?thread_id=44584 и где смог вместо прямого указания диапазонов подставил имена вычисляемых диапазонов. Но смог не везде (я не формулист, а макрописец). Никак не могу сообразить, как реализовать ИНДЕКС(... ПОИСКПОЗ()) ТОЛЬКО на именованных диапазонах?
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Народ, помогите, пожалуйста! У товарища после прохождения массового апдейта ХРюши очень хитро съехали оба Excel ( и 2010, и 2003): перестали открываться файлы, содержащие UserForm'ы. Удалил напрочь папки XLSTART и ADDINS и анинсталлил Офис (благо там было не много личных настроек и дистрибутивчик лежал в заначке) Пофигу! Тот же результат: Excel долго грязно ругается и надстройки и файлы, содержащие UserForm, либо не открываются вообще, либо открываются, но на каждый чих матерятся ... (скриншоты делать не стал, уж слишком много раз ругается) Попробовал выйти в VBE и просто кнопкой добавить в проект UserForm … Был послан на: Class not registered. Looking for object with CLSID:{AC9F2F90-E377-11CE-9F68-00AA00574A4F}
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Сделал надстройку. Хочу, чтобы при выборе её в окне управления надстройками появлялось краткое описание-назначение. Ну, например, как на прилагаемом скриншоте. Что-то никак не могу найти, где это задавать :(
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Что-то я торможу... Никак не могу разрешить в ComboBox только выбор из списка и запретить ручной ввод? Если сделать .Enabled=False , то вообще не выбирается мышкой Если сделать .Locked=True , то не выпадает список...
Кажется мне, что как-то просто делалось... Но как? Склероз, зараза!
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Понадобилось сделать на форме группу зависимых переключателей (в смысле нажат может быть только один, остальные при этом отжимаются :) Вспомнил, что в Access использовал для этого элемент управления OptionGroup, в который вставлял сколько нужно ToggleButton Поискал в Excel'e - не нашёл. По картинке в панели инструментов формы OptionGroup брат-близнец Frame, но Frame не делает переключатели связанными. Приходится программировать нажатие/отжатие кнопок по событиям каждой из них... Да и вообще Frame тогда получается просто элементом оформления. Как-то это грубо... Или я "просто не умею его готовить"?
P.S. OptionButton в отличие от ToggleButton, будучи запихнутыми в Frame хоть зависимыми становятся. И то хорошо. Но вот значение элементу Frame в отличие от OptionGroup придать не удаётся - нет у него параметра Value Да и для красоты формы мне нужны не радиокнопки, а утапливающиеся кнопки.
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Народ, очень меня заинтересовал элемент ListView Но, к сожадению, его описания везде только на инглише или на МСДН - в разбивку по пунктам. Очень не удобно. Да и понять трудно. Никто где-нибудь не встречал толковую статью про ListView на русском и с примерами?
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Мне на форме нужно выводить данные в многоколоночный ListBox. Данные в "ячейках" разных столбцов могут быть разные по длине, поэтому очень желательно сделать изменяемой юзером ширины столбцов (просто мышкой тягать границу как на стандартном листе Excel). Стандартный ListBox такого делать не позволяет. Решил попробовать заюзать SpreadSheet , но он, к сожалению, очень плохо описан в Справке. И при его создании набор параметров обрезан "короче некуда". Приходится параметры устанавливать в UserForm_Initialize Но бОльшая часть методов и параметров просто нигде не указана :( Приходится делать настройки "методом тыка", подбирая название параметра по аналогии с параметрами стандартного листа Excel. Например, чтобы было похоже на ListBox, нужно сделать: 1. Невидимыми заголовки строк и столбцов. Параметра такого не указано, но я подобрал срабатывающие .DisplayColumnHeadings = False .DisplayRowHeadings = False 2. Нужно убрать ярлычки выбора листов - подобрал название параметра .DisplayWorkbookTabs = False 3. Нужно сделать не изменяемыми размеры самого SpreadSheet на форме (уголок растяжения/сжатия справа внизу) - не нашёл параметра 4. Очень хотелось бы закрепить первую строку и сделать в ней заголовки - не нашёл как 5. Запретить ввод в ячейки - как? 6. Как писать процедуры обработки событий? 7. Как вывести на лист массив? У меня не получилось :(
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Мне понадобилось сделать цикл по всем видимым листам всех открытых ВИДИМЫХ книг Написал на вскидку: Sub ListOfSheets() Dim wb As Workbook, sh As Worksheet For Each wb In Application.Workbooks If Not wb.IsAddin Then For Each sh In wb.Worksheets If sh.Visible = -1 Then Debug.Print wb.Name, sh.Name, sh.CodeName Next sh End If Next wb End Sub
Но свойства .Visible у объекта Workbook нет... Поэтому прихватывается и лист из Personal.xls А если я в XLSTART положу и ещё какой-нибудь файл-не надстройку, то прихватятся листы и из него. А если перенести на другую машину, где стоит не 2003, а 2007/2010, то файл будет уже не Personal.xls, а Personal.xlsm ВОПРОС: как ПРОСТО отделить книги с отображаемыми страницами от файлов, книги и, соответственно, страницы которых не отображаются?
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Что случилось? Был 2 недели в отпуске. Решил посмотреть, что нового появлялось на форуме... Выяснил, съехали ссылки на все старые топики! Даже в "Вопросы по работе форума" доступа нет и правильно спросить не удаётся :(
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Excel-2010: в группе на вкладке Ribbon'а не удаётся разместить более 4000 элементов :( Осваиваю XML-настройку Ribbon'а "под себя" Нужны картинки для своих кнопок. Чтобы вставлять существующие в Офисе картинки кнопок в XML-текст сделал файл, который при его открытии размещает на вкладке "разработчик" новую группу, а в ней - галереи картинок. При нажатии на интересующую картинку на экран выводится форма с 3-мя видами картинки (16х16, 24х24, 32х32) и двумя кнопками: "Закрыть" и "Копировать". Кнопка "Копировать" помещает имя картинки в готовом для вставки к код виде(типа imageMso="HappyFace" )в буфер обмена. Делал для начала для 2007-го. Там картинок чуть больше 1800 штук. Первые "грабли", на которые наткнулся, это то, что в галерее оказывается не может содержаться более 1000 объектов (иначе XML-схема становится не валидной и не отрабатывается). Ну, и фиг с ним. Слишком большие галереи смотреть всё равно не удобно. Сделал три галереи по примерно 600 картинок. Всё отлично заработало.
А когда взялся за аналогичную работу для 2010-го, то наткнулся на вторые "грабли" (и намного хуже): встроенных картинок в 2010-м больше 7000. Попробовал сделать 8 галерей каждая немного меньше 1000 картинок. Валидацию-то файл прошёл, а вот отобразилось всего 5 галерей с 3994 картинок в сумме (5-я оказалась совсем коротенькая). Остальные же 3 галереи и оставшиеся элементы 5-й не отобразились вообще. Вот и вопрос, а кто ограничивает общее количество элементов: вкладка, группа или бокс, в котором размещены галереи? И если я создам новую вкладку и размещу галереи в её группах, то на вкладке тоже будет такой же предел или всё-таки получится разместить 7000 элементов в галереях на одной, а не делать две вкладки (уж очень не хочется) ?
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Народ, тут мне всё-таки придётся похоже осваивать "десятку" - на работе новая IT-метла купила лицензию и всё "старьё украденное" велела начать сносить... Нарыл я себе для пробы портабельный Офис-10. Запустил любимый Ёксель. ВСЁ НЕ ТАК! Подёргался, потыкался... Ничего найти не могу.
ВОПРОС:Никто не знает какой-нибудь книжки по семёрке или десятке (я так понимаю, что они очень близки по принципу интерфейса), но чтобы там было изложено примерно так: в 2003-ем вот это (ну, например, автофигуры) находится здесь, а в 2007/10 - здесь. В 2003-ем это делается так, а в 2007/10 - так. Очень интересует в первую очередь настройка интерфейса в ручную (пока не до макросов) "под себя": создание панелей инструментов, добавление на них кнопок для вызова макросов, изменение рисунка кнопки (пол-часа сегодня рылся, а так отредактировать выбранный рисунок кнопки не смог!)
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Народ, подскажите, пожалуйста как можно выбрать все рисунки в выделенном диапазоне ячеек?
На всём листе-то это сделать не трудно: Sub All_Draws_Select() ' выделить все рисунки на листе ActiveSheet.DrawingObjects.Select End Sub
А вот как выбрать в Selection? При этом, конечно, хотелось бы обойтись без цикла перебора всех элементов DrawingObjects в Selection :), но если нельзя, то и ладно, пусть с циклом …
К сожалению, Справка про коллекцию .DrawingObjects молчит как рыба об лёд и узнать что-то про свойства её элементов, относящиеся к привязке картинок к ячейкам, по аналогии с элементами коллекции .Shapes при моём слабом знании инглиша трудно.
Мне нужно выделять только РИСУНКИ, поэтому я и пытаюсь использовать именно коллекцию .DrawingObjects, а не .Shapes, т.к. (насколько я смог нарыть по разным источникам) в .DrawingObjects в отличие от .Shapes не входят примечания, выпадающие списки проверки данных, автофильтра, списков и сводных таблиц
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Уже час бьюсь над простейшей задачей: слепить UDF, которая будет сцеплять в одну строку стринги из диапазона ячеек-аргументов с заданным разделителем перечисления (в т.ч. и с переводом строки)… У меня давно лежит в "копилке" такая UDF с циклом-перебором всех ячеек. Решил, что так не красиво и надо бы упростить до безобразия, использовав Join Function СКЛЕИТЬ(ДИАПАЗОН, Optional Разделитель$ = "", Optional Переносить As Boolean = True) As String ' Purpose : склеить тексты из выделенных ячеек в одну строку с задаваемыми при необходимости разделителями данных из разных ячеек ' Notes : по умолчанию включен перенос строк внутри ячейки Разделитель = Разделитель & IIf(Переносить, vbLf, "") СКЛЕИТЬ = Join(ДИАПАЗОН.Value, Разделитель) End Function Не работает, зараза! Никак не пойму почему? Наверное, конец рабочего дня, мозги "замылились" :(
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Пишу процедуру, которая должна сохранять копию рабочего файла в заданной директории, задавая копии при этом пароли на открытие и на запись, отличные от паролей рабочего файла. Т.к. у методе SaveCopyAs я не нашёл параметров для задания паролей, то решил перед сохранением копии сначала запомнить в переменных процедуры имеющиеся пароли рабочего файла, потом заменить их на пароли для копии, сохранить копию и восстановить пароли рабочего файла. Как бы не так! Оказывается, что хоть пароли книги и доступны для чтения, но считываются-то не сами пароли, а звёздочки! Хорошо, что тренировался не на рабочем файле! Вот, если не верите, то можете проверить: Sub testPasswords() Debug.Print ActiveWorkbook.Password Debug.Print ActiveWorkbook.WritePassword End Sub В книге пароли ВООБЩЕ не установлены. А процедура вернёт: ******** ******** ВОПРОС: есть идеи как считать, а потом восстановить пароли ОТКРЫТОЙ книги?
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Народ, формулисты! Поможите макрописцу, плиз... Срочно лабаю отчёт для руководства, а макросы туда нельзя (они их бояться изволют) Нужно ФОРМУЛОЙ выделить из стринга целые числа и сложить их. Например, если: А1= "1 дед, 1 коза; 2 кочана капусты" , то В1=4 А1= "нет, 1 коза 1 волк" , то В1=2 А1= "1 дед, 1 коза; 1 капуста 2 волка" , то В1=5
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Народ, помогите, плиз… Мне нужно как-то просто и наглядно без макросов (чтобы защита от макросов в "бюстгалтерии" их не пугала :-) и ручного ввода данных регулировать значения в ячейке листа от 0% до 100% с шагом в 1% Решил попробовать использовать элемент управления "полоса прокрутки" из набора формы, связав его с нужной ячейкой. Тогда в связанную ячейку, имеющую %-ный формат нужно выводить десятичные значения от 0 до 1 с шагом 0,01 Не получилось задать не целый шаг изменения… Этот элемент что, понимает только целые шаги?
Выбор из выпадающего списка - не выход. Скрытая связанная ячейка для пересчёта её значения в проценты - тоже.
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)