Сообщество - MS, Libreoffice & Google docs

MS, Libreoffice & Google docs

761 пост 14 950 подписчиков

Популярные теги в сообществе:

269

Снятие защиты листа / книги

Прочитал тут пост: Excel триальный от @bighouse.live про защиту листа функциями MS, как установить пароль и т.д.


Данный способ защиты, как пароль - обходится за 5 секунд. Краткая инструкция, как снять защиту на странице:

Снятие защиты листа / книги Windows, Защита, Обход защиты, Microsoft Excel

Аналогично защита снимается и с книги, только другой  параметр.


Защита макросом - надо разобраться. Думаю тоже ничего сложного.

Показать полностью 1
203

Excel триальный

Немного отвлечённый пост о защите своей работы.

Итак, общеизвестны способы закрытия информации в Excel, а именно:

1. Защита листа/книги

Excel триальный Microsoft Excel, Vba, Прост, Длиннопост

Выбираем разрешения/допуски, вводим пароль, сохраняем файл.

Дополнительно для каждой ячейки можно указать защищается ли она или нет. По умолчанию - защищается.

2. Защита кода

Excel триальный Microsoft Excel, Vba, Прост, Длиннопост

Точно так же вводим пароль (с повторением), ок, сохраняем.


Но все эти способы не более чем игрушки, и вскрываются совершенно не сложно при наличии некоторых минимальных навыков и особенно при сохранении в *.xlsm (файл с поддержкой макросов). Сохраняйте в *.xlsb (двоичный код), если хотите хоть немного защитить свою работу.

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


Каким же образом можно ещё затруднить использование вашей работы, кроме как не давать её?

Ну для начала надо определиться что защищаем. Если это просто текст, и вы его кому то отдали, то забудьте о защите - он общедоступен. Но документ Excel это, прежде всего расчёты. Своей масштабируемостью они и ценны - при изменении исходных данных пересчёт произойдёт автоматически. 

Этим можно воспользоваться выполнив передачу результатов расчёта в виде статических таблиц. Да, можно распечатать/сохранить в pdf,  или банальным Ctrl+А /  Ctrl+C / Ctrl+V /только значения/. А можно просто воспользоваться простым макросом:


' Замена всех формул на листе в значения

Sub Form_2_Dan()

Dim a As Integer

' Запрашиваем подтверждение

a = MsgBox("Внимание!" & _

Chr(10) & "Вы точно хотите заменить все формулы на листе на значения?" & _

Chr(10) & "Это необратимо!", _

52, "Замена формул на значения.")

' Если OK, то замену производим

If a = 6 Then

ActiveSheet.UsedRange.Value = ActiveSheet.UsedRange.Value

End If

End Sub


Расположение макроса - модуль.

Макрос сохраняется в личный набор/надстройку и кнопка запуска выводится на панель.

Внимание! Действие макроса необратимо!


Можно сделать "триальным" расчёт разместив в модулях листов вот такого вида макрос.


Private Sub Worksheet_Activate()

Application.ScreenUpdating = False

If Date >= #10/6/2022# Then ActiveSheet.UsedRange.Value = ActiveSheet.UsedRange.Value

Application.ScreenUpdating = True

End Sub


Т.е. после 10.06.2022 все расчёты с листа исчезнут... А цифры останутся.

Можно заменить проверку на заполнение ячейки, например проверить что в определённой ячейке записан автор труда "Вася Пупкин". :) При смене которого всё превратится в набор цифр..

Естественно доступ к макросам должен быть закрыт/запаролен.


Ещё вариант - ввод пароля на саму книгу:


Private Sub Workbook_Open()

Dim i&, n&, P As Variant

Application.ScreenUpdating = False

n = 2

If Date >= #1/2/2022# Then

For i = 1 To Sheets.Count

Sheets(i).Activate

Sheets(i).Protect "1234"

Next

1:

P = InputBox("Время использования книги истекло, для продолжения введите пароль", "ВВОД ПАРОЛЯ")

If P = "°0176" Then

For i = 1 To Sheets.Count

Sheets(i).Activate

Sheets(i).Unprotect "1234"

Next

Else

If n = 0 Then

Application.DisplayAlerts = False

ThisWorkbook.Close

Application.DisplayAlerts = True

Else

MsgBox "Пароль не верный, у вас еще " & n & " попытки"

n = n - 1

End If

GoTo 1

End If

End If

Application.ScreenUpdating = True

End Sub


Расположение макроса - "Эта книга".


#1/2/2022# - дата с которой будет запрашиваться пароль

"°0176" – правильный пароль

Excel триальный Microsoft Excel, Vba, Прост, Длиннопост

И при открытии файл будет встречать весёлым окошком:

Excel триальный Microsoft Excel, Vba, Прост, Длиннопост

Естественно можно открыть файл без выполнения макросов, но если расчёт в экселе построен на использовании макросов, то цель достигнута - расчёт производиться не будет.


И да, это всё игрушки - серьёзные дяденьки с тётеньками при необходимости поломают сие поделия, и узнают как вы определяли дискриминант...  (0_о). Даже если Вы применили обфускацию кода или перенос кода в dll.

Показать полностью 3
262

Формат отображения чисел

Многие знакомы с понятием формата отображения чисел в ячейках. Но не многие знают что данные форматы работают не только в ячейках...

Для начала напомню в кратце о чём речь:

Для любой ячейки можно задать независимый формат отображения. Можно воспользоваться как преднастроенными форматами, так и создать пользовательский формат:

Формат отображения чисел Microsoft Excel, График, Плюшка, Длиннопост

Пользовательский формат может состоять из 4 фрагментов-масок, разделенных точкой с запятой*, где каждый фрагмент применяется в определенном случае:

<ПОЛОЖИТЕЛЬНЫЕ>; <ОТРИЦАТЕЛЬНЫЕ>; <НУЛЕВЫЕ>; <ТЕКСТ>

Три подряд точки с запятой Excel воспринимает как четыре пустых маски для всех четырех возможных случаев, т.е. выводит пустоту при любом значении ячейки.

Не нужно включать все разделы кода в пользовательский числовой формат. Если указано только два раздела, первый используется для положительных чисел и нулей, а второй — для отрицательных чисел. Если задан только один раздел, он применяется для всех чисел. Если нужно пропустить раздел кода и включить раздел, который следует за ним, необходимо оставить точку с запятой для пропускаемого раздела.


Excel использует несколько спецсимволов в масках форматов:

• 0 (ноль) - одно обязательное знакоместо (разряд), т.е. это место в маске формата будет заполнено цифрой из числа, которое пользователь введет в ячейку. Если для этого знакоместа нет числа, то будет выведен ноль. Например, если к числу 12 применить маску 0000, то получится 0012, а если к числу 1,3456 применить маску 0,00 - получится 1,35.

• # (решетка) - одно необязательное знакоместо - примерно то же самое, что и ноль, но если для знакоместа нет числа, то ничего не выводится

• (пробел) - используется как разделитель групп разрядов по три между тысячами, миллионами, миллиардами и т.д.

• [ ] - в квадратных скобках перед маской формата можно указать цвет шрифта. Разрешено использовать следующие цвета: черный, белый, красный, синий, зеленый, жёлтый, голубой.

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


Примеры использования:
Формат отображения чисел Microsoft Excel, График, Плюшка, Длиннопост

Естественно вариаций масок гораздо больше, но данный пост не об этом -пользовательский формат общеизвестен.

Примечание: *пользовательские форматы в русской и английской версии офиса не совпадают. Внезапно. Всё мной написанное относится к русской версии.


Данный пост о том, как построить диаграмму вот с такими осями (например):

Формат отображения чисел Microsoft Excel, График, Плюшка, Длиннопост

Как видно - это обычная диаграмма с двумя графиками, построенными по основной и вспомогательным вертикальным осям. И в этом построении нет никакого секрета. А вот сделать так, чтобы подписи левой оси начинались с 4-х, а подписи правой заканчивались на 2000-х нам помогает именно формат чисел подписей осей:

Формат отображения чисел Microsoft Excel, График, Плюшка, Длиннопост

Код формата левой (основной) оси - [>=4] 0 ;;;

Код формата правой (вспомогательной) оси - [<=2000] 0 ;;;


Возможно данный способ кому-то пригодится. Ну а с масками формата - экспериментируйте :)


УПД. Благодарю Yacl за наблюдательность

Показать полностью 4
28

Excel, ВПР по большому количеству файлов

Привет! Кто может посоветовать, как быть или какое обучающее видео мне посмотреть по PowerQuery чтобы проВПРить сразу большое количество Excel-фалов?

Есть куча объемных фалов, мне из них нужно по пять значений, расположенных в определённых столбцах напротив определенных значений, но на разной "высоте" (классический ВПР, собственно).


Первым делом я в PQ подключил папку, где лежат все эти папки, чтобы вывести все их наименования и пути к файлам в таблицу (это я делал впервые, очень понравилось :) ).

После этого я написал формулу ВПР с ДВССЫЛом, что в принципе работало, но было ограничение в виде того, что ВПР работает только если файл-источник данных открыт. Я бы даже остановился на этом варианте, но после добавления трех новых файлов в папку и обновления списка файлов с помощью PQ формула ВПР почему-то не сработала на новые файлы, со старыми файлами все было нормально, я даже поменял значение в файле-доноре данных и оно обновилось в моей "сводной".

А когда я переписал формулу еще раз так, чтобы "Искомое значение" ВПРа ссылалось на именованный диапазон, а не на конкретную ячейку, как было изначально, то она наоборот начала работать только на вновь добавленные файлы.

Спецы по PQ, отзовитесь, пожалуйста!


UPD. Отбой, оказалось, что названия листов в новых файлах отличались от первой партии. В первом случае был пробел, во втором - нижнее подчеркивание.

10

Формула в excel

Всем привет.

Помогите, пожалуйста, с составлением формулы для расчёта остатка рулонного материала.

Есть рулоны материалов с втулкой внутри (с разными диаметрами и радиусами как материалов так и втулок, и с разной намоткой материала), и есть так же линейка для измерения.
Сейчас это выглядит так (не правильно):
Линейкой измеряется радиус материала от втулки и считается как 1(целое), а остаток высчитывается на остаточную намотку (0.7рл, 0.3рл, и тд).

12

Excel закрывается при открытии файла1

Добрый день! Может подскажите что-нибудь, а то уж всю голову сломал. Есть ряд файлов с макросами и запросами PQ. Обычно работают как часы, но иногда случается следующее: при попытки открытия файла, Excel без объявления войны закрывается (просто вылетает без всяких сообщений). Закрывается целиком: все открытые файлы, ничего не сохраняет. И если с файлом случается подобное, он уже не открывается, Excel продолжает вылетать до тех пор пока... я не открою его на другом компьютере и не сохраню на том компе (файлы лежат в облаке на яндекс-диске)! Хотелось вывести работу в состояние стабильности и решить эту проблему. Я пробовал и отключать те макросы и PQ-запросы, которые срабатывают при запуске - не помогает.

16

Microsoft Excel ожидает, пока другое приложение завершит действие OLE

Добрый день. Последнее время Excel стал задумываться и выдавать сообщение после долгих раздумий "Microsoft Excel ожидает, пока другое приложение завершит действие OLE". Выскакивает на разных компьютерах с разными версиями Эксель и при открытии или редактировании разных файлов. Как это можно полечить? Способы из гугла не помогли.

127

Построение графиков

Сегодня разберём задачку, которая вставала перед каждым пользователем Excel - необходимость построить график функции.

Построение графиков Microsoft Excel, Vba, Плюшка, Длиннопост

Любой, кто решал эту задачку - действовал следующим способом:

1. Создаётся столбец Х;

2. Создаётся столбец Y,  котором происходит расчёт согласно заданной функции;

3. Выделяются два созданных столбца и вставляется график.


Но это просто и скучно. Есть другой способ. Построить график непосредственно из макроса.

Начнём с простого - у нас есть набор точек соответствия X и Y.


Sub Построй_график_по_точкам()

Dim MyChart As Chart

Set MyChart = ActiveSheet.Shapes.AddChart2.Chart

With MyChart

.SeriesCollection.NewSeries

.SeriesCollection(1).Name = "xlXYScatterSmoothNoMarkers"

.SeriesCollection(1).XValues = Array(0#, 0.5, 1#, 1.5, 2#, 2.5, 3#, 3.5, 4#, 4.5, 5#)

.SeriesCollection(1).Values = Array(0#, 0.4794, 0.8415, 0.9975, 0.9093, 0.5985, 0.1411, -0.3508, -0.7568, -0.9775, -0.9589)

.ChartType = xlXYScatterLines ' Соединение точек прямыми

.SetElement msoElementLegendNone

End With

End Sub


Другие варианты отображения линии графика:

.ChartType = xlXYScatterLinesNoMarkers ' Соединение точек прямыми без маркеров

.ChartType = xlXYScatterSmoothNoMarkers ' Сглаженная линия

Более подробно о типах - тут

Сборка  Array(...) может быть выполнена с использованием программы, которую я выкладывал в 7-й части темы про оцифровку, ну или заполнить руками.


Как не трудно догадаться - вовсе не обязательно иметь готовый набор данных.

Рассмотрим ситуацию, когда требуется построить два графика на одной диаграмме.

Для упрощения восприятия использую две простые функции линий y1 = x - 20, y2 = x + 20.


Sub Создать_диаграмму()

Dim MyChart As Chart

Dim i As Integer, Xmin As Single, dX As Single, Xmax As Single, _

Ymin As Single, Ymax As Single, dY As Single

Dim X() As Single

Dim Y() As Single

Dim Yp() As Single

Xmin = 0: Xmax = 300: dX = 20 ' Сие больше нужно для осей и оформления

Ymin = 0: Ymax = 160: dY = 20

ReDim X(0 To Xmax - Xmin): ReDim Y(0 To Xmax - Xmin, 1 To 2)

ReDim Yp(0 To Xmax - Xmin)

For i = 0 To Xmax - Xmin Step 1

X(i) = Xmin + i

' Заполнение данных первого графика

Y(i, 1) = X(i) - 20

' Заполнение данных второго графика

Y(i, 2) = X(i) + 20

Next i

' создадим новую диаграмму и зададим ей габаириты

Set MyChart = ActiveSheet.Shapes.AddChart2(, , , , 300, 200).Chart

For i = 1 To 2

For j = 0 To Xmax - Xmin Step 1

Yp(j) = Y(j, i)

Next j

With MyChart

.SeriesCollection.NewSeries

.SeriesCollection(i).XValues = X

.SeriesCollection(i).Values = Yp

.ChartType = xlXYScatterSmoothNoMarkers

End With

Next i

End Sub


При задании новой диаграммы можно задать в том числе и положение диаграммы на листе

AddChart2(Стиль,XlChartType,слева,сверху,ширина,высота,NewLayout)

В итоге получим вот такую диаграмму:

Построение графиков Microsoft Excel, Vba, Плюшка, Длиннопост

В дальнейшем можно обработать её  как обычную - задать цвета, толщины и т.д. Но можно это сразу поручить нашему макросу:


Sub Создать_диаграмму()

Dim MyChart As Chart

Dim i As Integer, Xmin As Single, dX As Single, Xmax As Single, _

Ymin As Single, Ymax As Single, dY As Single

Dim X() As Single

Dim Y() As Single

Dim Yp() As Single

Xmin = 0: Xmax = 300: dX = 20 ' Сие больше нужно для осей и оформления

Ymin = 0: Ymax = 340: dY = 20

ReDim X(0 To Xmax - Xmin): ReDim Y(0 To Xmax - Xmin, 1 To 2)

ReDim Yp(0 To Xmax - Xmin)

For i = 0 To Xmax - Xmin Step 1

X(i) = Xmin + i

Y(i, 1) = X(i) - 20

Y(i, 2) = X(i) + 20

Next i

Set MyChart = ActiveSheet.Shapes.AddChart2(, , 0, 0, 400, 230).Chart

For i = 1 To 2

For j = 0 To Xmax - Xmin Step 1

Yp(j) = Y(j, i)

Next j

With MyChart

.SeriesCollection.NewSeries

.SeriesCollection(i).XValues = X

.SeriesCollection(i).Values = Yp

.ChartType = xlXYScatterSmoothNoMarkers

End With

Next i

With MyChart

.SetElement (msoElementPrimaryCategoryGridLinesMajor)

' Включаю отображение названия осей

.Axes(xlCategory, xlPrimary).HasTitle = True

.Axes(xlValue, xlPrimary).HasTitle = True

.Axes(xlCategory, xlPrimary).AxisTitle.Text = "Расход Go т/ч"

.Axes(xlValue, xlPrimary).AxisTitle.Text = "Давление кгс/кв.см."

' Выключаю отображение легенды

.SetElement (msoElementLegendNone)

' Выключаю отображения заголовка диаграммы

.SetElement (msoElementChartTitleNone)

' Выставляем параметры осей

.Axes(xlCategory).MinimumScale = Xmin

.Axes(xlCategory).MaximumScale = Xmax

.Axes(xlCategory).MajorUnit = dX

.Axes(xlValue).MinimumScale = Ymin

.Axes(xlValue).MaximumScale = Ymax

.Axes(xlValue).MajorUnit = dY

End With

' Оформление гризонтальной оси

MyChart.Axes(xlCategory).Select

With Selection.Format.Line

.Visible = msoTrue

.ForeColor.RGB = RGB(0, 0, 0)

.ForeColor.TintAndShade = 0

.ForeColor.Brightness = 0

.Transparency = 0

.Visible = msoTrue

.Weight = 1.25

End With

' Оформление вертикальной оси

MyChart.ChartArea.Select

MyChart.Axes(xlValue).Select

With Selection.Format.Line

.Visible = msoTrue

.ForeColor.RGB = RGB(0, 0, 0)

.ForeColor.TintAndShade = 0

.ForeColor.Brightness = 0

.Transparency = 0

.Visible = msoTrue

.Weight = 1.25

End With

' Оформление горизонтальной сетки

MyChart.Axes(xlValue).MajorGridlines.Select

With Selection.Format.Line

.Visible = msoTrue

.DashStyle = msoLineDash

.Visible = msoTrue

.ForeColor.RGB = RGB(0, 176, 240)

.Transparency = 0

End With

' Оформление вертикальной сетки

MyChart.Axes(xlCategory).MajorGridlines.Select

With Selection.Format.Line

.Visible = msoTrue

.DashStyle = msoLineDash

.Visible = msoTrue

.ForeColor.RGB = RGB(0, 176, 240)

.Transparency = 0

End With

End Sub


По итогу диаграмма будет выглядеть так:

Построение графиков Microsoft Excel, Vba, Плюшка, Длиннопост

Как не трудно понять, данных, по которым построена диаграмма, на листе нет. И после удаления макроса останется только итоговый результат.

Кому то это покажется слишком сложным, однако открою маленький секрет - очень редкие люди пишут макрос с нуля. В 90% достаточно иметь готовый макрос (см листинг выше), заменить в нём пару строк (сменить функции, изменить диапазоны...) и всё. По итогу построение занимает меньше времени чем построение классическим способом.

Такое построение позволит извлечь данные промежуточного расчёта, построить массово однотипные диаграммы и... и дальнейшее применение зависит только от фантазии.

Ну и всегда есть вариант удивить преподавателя (0_о).

Показать полностью 2
Отличная работа, все прочитано!