Достаточно долго игрался с дизайном документов по части цветовых решений. Потом все это надоело и решил что в большинстве случаев достаточно выделить сущности и итоги. Не без помощи местных шаманов узнал кодирование цветов у всемогущего Excel’я тема здесь
Скрытый текст
К сожалению вариант предложеный Михаилом не сработал ибо остаток от деления страрших цифр (синего) сбивают значение младших (зеленого). Аналогично пара зеленый, красный.
Написал простенький макрос. Нашел его очень удобным, вот и решил поделиться. Выделяем данные которые нужно выделить (извините за тафтологию) и запускаем его. Макрос проходится по ячейкам и делает заливку немного темнее при этом максимально сохраняет оттенок цвета. Повторными прогонами можно затемнить еще и еще. Отмена не предусмотрена. Константу darker (0.9) можно поменять на свое усмотрение, даже увеличить выше единицы (будет осветлять).
Код
Sub darker_X_percent()
Const darker = 0.9
If MsgBox("Сделать цвет ячеек немного темнее? Количество обрабатываемых ячеек " & Selection.Count & ". Вы уверены?", vbQuestion + vbDefaultButton2 + vbYesNo, "Внимание") = vbYes Then
Dim change_area As Range
Application.StatusBar = ("Проводится замена цвета в " & Selection.Count & " ячейках...")
For Each change_area In Selection
Colour = change_area.Interior.Color
B = Int(Colour / 65536)
G = Int((Colour - B * 65536) / 256)
R = (Colour - B * 65536 - G * 256)
' +0.5 чтобы при отбрасывании дробной части округлить по стандартным правилам
B = Int(B * darker + 0.5)
G = Int(G * darker + 0.5)
R = Int(R * darker + 0.5)
Colour = R + G * 256 + B * 65536
change_area.Interior.Color = Colour
Next
MsgBox "Замена произведена.", vbInformation + vbOKOnly, "Ура!"
Application.StatusBar = False
End If
End Sub
Однако, не увлекайтесь. Миллион миллион алых, розовых, голубых и синих существенно утяжелят документ.
Товарищи, нужна помощь по программному изменению заливки ячеек. Имеется таблица, колонки которой раскрашены в разные цвета (характеристики номенклатуры, цех, склад, приход, расход, остатки). В связи с разрастанием асортимента продукция получина иерархическую структуру. Соответственно хочется промежуточные итоги разных уровней закрасить теми же цветами, но меньшей насыщенности. Попытки разобраться с принципом кодирования цветов увенчались провалом. Если оранжевый это R-255,G-192, B-0, то -5% это R-242,G-182, B-0, то -15% это R-217,G-163, B-0,
Код
Sub Orang()
Range("a36").Interior.Color = 49407 'чистый оранж
Range("a37").Interior.Color = 46834 '-5%
Range("a38").Interior.Color = 41945 '-15%
Range("a39").Interior.Color = 37055 '-25%
End Sub
Связи никакой. Есть ли способ пересчитать конкретный цвет на уменьшение или увеличение яркости? Хотелось бы выделить область, нажать кнопочку и макрос пройдясь по всем ячейкам уменьшит яркость цвета к примеру на 5%. При необходимости повторяем и получаем 10%, 15%. (пусть не совсем, вместо 20 будет 18,55, или около того за счет того что для последующего базой будет не оригинал 100, а только 95, да еще с округлением)
Спасибо за пример, сажусь разбираться. К ВПР надо цеплять проверку двух ошибок пустого класса и пустого типа. Это, конечно проще чем если(если(если...))), но на 25 тысячах строк будет не так быстро как хочется. А может только кажется.
Еще вопрос. Словарь - это постоянно хранимый объект который хранится после сохраниния и закрытия книги и восстанавливается при открытии или же уничтожается и при открытии его не существует?
Вложенное если. Своя функция для EXCEL’a.xls Здравствуйте, жители и гости Планеты. Возникла проблема использования вложенного Если() Сначала написал по классике индекс+поискпоз, но эта связка не дает 100% необходымый результат. Использовать макрос имеет свои неоспоримые преимущества, но и недостатки есть серьезные. Написана пользовательская функция, которая ищет заданое значение в справочном диапазоне и возвращает из второго массива значение соответствующее найденому. Может кому пригодится. Может кто ускорит ее работу.
Скрытый текст
Код
Function autoclas(typ As String, types_arr As Range, clases_arr As Range) As String''1 аргумент - значение'2 аргумент - массив, где нужно найти первый'3 аргумент - массив, из которого нужно взять соответствующий результат'Dim i, j As Integerj = UBound(types_arr())For i = 1 To jIf types_arr(i) = typ Then autoclas = clases_arr(i) Exit For
ремонт на планету.xls(55.5 КБ) Формат данных: Участок, единица оборудования, дата/время начала и завершения ремонта. Данные за год, 170 единиц оборудования, около 5000 записей На других листах просчитываются простои по причинам с разбивкой по месяцам и единицам оборудования (не привожу в примере)
Часто господа аксакалы (6 человек) пишут не правильно даты, задваивают записи, пишут перекрестные простои (еще идет текущий ремотн, а линия ставится на косервацию) Нужна помощь это отследить. Если сумма простоя за месяц превышает длительность месяца, ошибка находится, а так только вручную рисовать. Самым подходящим есть график Ганта, но он не позволяет "закрашивать" обльше одной области в ряду, да и его надо с бубуном плясать.
Более того, в перспективе нужно оценить адекватность простоев оборудования и выпуска продукции по оборудованию по дням. кроме как визуально график на ум приходит двумерная матрица коеффициентов использования рабочего времени по суткам.
PS если простой большпе месяца, он закрывается и открывается снова. Оговорено ранее для того чтоб легче считать время простоя на протяжении месяца.
Переписал макрос создания и назначения в рабочую книгу. Все работает. Выход программно внести в рабочую книгу макрос, который создаст кнопки и назначит им другие макросы, а потом самоудалится считаю входом в окно на третьем этаже.
Макросом из личной книги программно обрабатываю данные. На выходе сводная таблица. Дальше программно форматирую и хочу создать кнопки для отображения/скрытия подробностей
Код
Sub Create_Buttons_And_Module_for_buttons()
Dim objVBProj As Object, objVBComp As Object, objCodeMod As Object
Dim sModuleName As String, sFullName As String
Dim sProcLines As String
Dim lLineNum As Long
'добавляем новый стандартный модуль в активную книгу
Set objVBComp = ActiveWorkbook.VBProject.VBComponents.Add(1)
' не получилось задать имя objVBComp.Name = ("Buttons_For_Pivot"
'получаем ссылку на коды модуля
Set objCodeMod = objVBComp.CodeModule
'узнаем количество строк в модуле
'(т.к. VBA в зависимости от настроек может добавлять строки деклараций)
lLineNum = objCodeMod.CountOfLines + 1
'текст всставляемой процедуры
sProcLines = "Sub Pivot_Big()" & vbCrLf & _
"ActiveSheet.PivotTables(""СводнаяТаблица"".PivotFields(""Название склада"".ShowDetail = True" & vbCrLf & _
"End Sub" & vbCrLf & _
"Sub Pivot_Small()" & vbCrLf & _
"ActiveSheet.PivotTables(""СводнаяТаблица"".PivotFields(""Название склада"".ShowDetail = False" & vbCrLf & _
"End Sub"
'вставляем текст процедуры в тело нового модуля
objCodeMod.InsertLines lLineNum, sProcLines
ActiveSheet.Buttons.Add(0, 29, 75, 15).Select
Selection.OnAction = "Pivot_Small"
Selection.Characters.Text = "Свернуть"
ActiveSheet.Buttons.Add(76, 29, 75, 15).Select
Selection.OnAction = "Pivot_Big"
Selection.Characters.Text = "Развернуть"
End Sub
Код работает: создается модуль, вставляется его код, создаются кнопки, но кнопкам назначается макрос из личной книги PERSONAL.XLSB!Pivot_Small и PERSONAL.XLSB!Pivot_Big
Назначил вручную, запустив макрорекордер, указал, макросы для кнопок в текущей книге. Кнопки работают, но вновь созданным задается из личной. Подскажите где грабли?
Должно быть сохранено в рабочей книге так как она отправляется другим пользователям. Привязки к имени файла желательно избежать, пользователь может сохранить файл под другим именем.
Вот примерно так. Нужно в лист "база" столбец G вставлятьвыбирать данные из списка лист "обладнання-причина" C3:N3 только соответствующие введеному оборудованию.
Думал чтоб не плодить таблиц можно умножить соответствующую строку единиц/нулей на строку причин. Да вот не получается.
Господа, делаю учет ремонтов. Есть связаные выпадающие списки через умные таблицы. 1 Категория (производство1, произв2, ... ,произв5, вспомогательное, энергосистема, охрана) 2 Название оборудования (около 70 позиций, названия не повторяются, однородные единицы разделены по номерам/моделям) 3 Причина ремонта / дефектный узел / плановое ТО. По п.3 есть несколько универсальных типа сбой питания и плановое ТО, основная масса по 5-7 пунктов на однородное оборудовае дублируются, между производствами не повторяются.
Подскажите как можно организовать чтоб не делать 70 таблиц/списков на каждую единицу ообрудования.
Не универсально, но сработало CTRL+H (убрать баксы), CTRL+C, CTRL+V на новый лист, CTRL+X, CTRL+V на прошлый. При вырезании смещения не происходит! :) В следюущий раз долары убирать не нужно.
Теперь все таки хочется добить автоматику. Получается примерно так:
Dim Formulas As Range For Each Formulas In Selection Text_Line = Formulas.FormulaR1C1 массив = Split(Text_Line (что то в этом духе)) ' Разобрать на массив от начала до числа, число, все что есть до следующего числа, число......, последнее число ' Формула от простой ссылки до суммы четырех For j = 0 to UBound (массив) If массив(j) это число(забыл :( как проверить) then массив(j)=массив(j)+1 ' Если элемент число, то прибавить один Next j Formulas.FormulaR1C1 = Join(массив) Next
Запретить не получится, а вот проверить на наличие повтора и заставить изменить - запросто.
Отдельный столбец с формулой =СЧЁТЕСЛИ(S$3:S3;S3)-1 контролируются данные в столбце S
Дальше: Вариант1 Можно условным форматированием выделить стороку если в ней повторяющееся.
Вариант 2 Макрос при нахождении единички перенесет курсор в нужную ячейку и таким образом не позволит внести повторно уже введенное.
Что б не считать дублями пустые или нулевые значения нужно слегка поправить формулу на логику (способов несколько) либо в макросе делать перенос курсора по первому ненулевому дубляжу
Еще мысль пришла... Если скопировать таблицу P7:Y14 в примере не на тот же лист, а на новый, но вставлять в ячейку P8 (долары из формул естественно убрать). Теоретически получится смещение на 1 ячейку. Вопрос Как после такого зафиксировать формулы, чтоб при копировании на нужный лист они не сместились.
Формулы только a+b+c. Даже более, Nx+Ny+Nz. Буквы одинаковые, цифры разные, это видно в примере. Как бы вручную не переделывал копироваться будут коряво! Разница между одной позицией в разных месяцах составляет 9 сторок,а в исходных данных - 1. Перед цифрами поставил "долар" и после копирования ручками прибавляю по единичке к каждой цифре.
Имеется таблица глупо созданная моим предшественником с кучей информации. В конце каждого месяца делается баланс с тремя десятками формул такого рода "=' цех произ_'!AH$518+' цех перем_'!AH$249+'НФС '!AH$316" Для нового баланса нужно скопировать таблицу, а ссылаться на каждое значение одной строкой ниже. Подскажите как сделать оперативно без ручного перебора формул.