Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 141 След.
Невозможно скопировать надстройку в библиотеку, Надстройка для общего пользования
 
Цитата
Александр Моторин написал: Надстройка без пароля
Александр, пароль надстройки вскрыли в соответствии с правилами форума?
Можно ли выставить динамический максимум оси Х для графика
 
Мой код приведен для примера из сообщения #16, в котором устанавливается максимальное значение оси Y диаграммы, а не оси X, как в названии этой темы.
Минимальное значение осей там не корректируется, подразумевая, что они автоматические.
MinorUnit - это шаг дополнительной горизонтальной сетки, а не  минимальное значение оси Y, и этот шаг должен быть больше нуля.

> При задании значения диаграммы "1" - макрос выдает ошибку.
О каком конкретно значении речь? Константа MyChart задает номер или имя диаграммы на активном листе.
А текстовые значение в диапазоне F4:G8 диаграмма Excel воспринимает как нулевые, если что.
> При других манипуляциях со значениями значения оси Y улетают в отрицательные значения и обратно уже не возвращаются.
Нужен пример, где и что конкретно меняется, чтобы понять о чем речь.
Повторю - минимальное значение осей не корректируется, подразумевая, что они автоматические.
> И приоритет конечно, чтобы значения Минимума и Максимума оси Y задавалось именно формулой.
Вместо:   .Round(.Max(rng.Value) + 0.5, 0)
впишите:  Range("A1").Value
Аналогично - и для ячейки A2.

Если ищите решение, отличающееся от того, что написано в названии темы, то напишите в своем новом сообщении правильное название, тогда модераторы смогут исправить название темы.
Изменено: ZVI - 02.05.2022 23:54:25
Как убрать отображение именованных диапазонов на листе при малом масштабе, Мешают работать при масштабе менее 40%
 
:)
Можно ли выставить динамический максимум оси Х для графика
 
Вариант для обеих осей:
Код
Private Sub Worksheet_Change(ByVal Target As Range)
  
  Const MyChart = 1 ' Номер или "имя" диаграммы активного листа
  
  Dim chrt As Chart, rng As Range
  Set chrt = ChartObjects(MyChart).Chart
  
  ' Ось Y
  Set rng = Range(Split(chrt.SeriesCollection(1).Formula, ",")(2))
  If Not Intersect(Target, rng) Is Nothing Then
    With WorksheetFunction
      chrt.Axes(xlValue).MaximumScale = .Round(.Max(rng.Value), 0)
    End With
  End If
  
  ' Ось X
  Set rng = Range(Split(chrt.SeriesCollection(1).Formula, ",")(1))
  If Not Intersect(Target, rng) Is Nothing Then
    With WorksheetFunction
      chrt.Axes(xlCategory).MaximumScale = .Round(.Max(rng.Value), 0)
    End With
  End If
  
End Sub
Можно ли выставить динамический максимум оси Х для графика
 
Вариант для оси Y (как в примере) без необходимости ячеек A1:A2
Код
Private Sub Worksheet_Change(ByVal Target As Range)
  Const MyChart = 1 ' Номер или "имя" диаграммы активного листа
  Dim chrt As Chart, rng As Range
  Set chrt = ChartObjects(MyChart).Chart
  Set rng = Range(Split(chrt.SeriesCollection(1).Formula, ",")(2))
  If Intersect(Target, rng) Is Nothing Then Exit Sub
  With WorksheetFunction
    chrt.Axes(xlValue).MaximumScale = .Round(.Max(rng.Value) + 0.5, 0)
    'chrt.Axes(xlValue).MinorUnit = .Round(.Min(rng.Value) / 4, 0)
  End With
End Sub
Изменено: ZVI - 02.05.2022 23:45:17
Как убрать отображение именованных диапазонов на листе при малом масштабе, Мешают работать при масштабе менее 40%
 
Добрый день.
Макросами:
Код
Sub HideNames()
' Скрыть имена
  Dim n As Name
  For Each n In Names
    n.Visible = False
  Next
  Application.ScreenUpdating = True
End Sub

Sub ShowNames()
' Отобразить имена
  Dim n As Name
  For Each n In Names
    n.Visible = True
  Next
  Application.ScreenUpdating = True
End Sub
Изменено: ZVI - 02.05.2022 15:52:55
написание програмного кода тригонометрической функции
 
Цитата
Виталий Улюкин написал: что то не работает, подставляю Х пишет ошибку. может не в ту степь пошел.
'Матрос на зебре' Вам все написал, его код нужно вставить в VBA -модуль (в VBE - Insert- Module).
Потом запустить AddToCategory.
Потом, в ячейку A1 записать значение X, например: 1
А в B1 - формулу: =myF(A1)
Меняйте значение X в A1 и смотрите, что посчитается в B1.
Приложите свой пример книги XLSM сюда если не получается.
Изменено: ZVI - 12.04.2022 18:16:09
написание програмного кода тригонометрической функции
 
Цитата
sokol92 написал:
столько цифр  не знаю .  
Да и я тоже, это VBA знает своё :)
?WorksheetFunction.pi
3,14159265358979
?WorksheetFunction.pi - 3.14159265358979
3,10862446895044E-15
?WorksheetFunction.pi - (3.14159265358979 + 3.10862446895044E-15)
0
написание програмного кода тригонометрической функции
 
Цитата
Jack Famous написал: А по скорости ...
Да, за наносекундами здесь мало кто гоняется  ;)
написание програмного кода тригонометрической функции
 
Цитата
Jack Famous написал:
Static pi#, f As Boolean:   If Not f Then f = True: pi = Atn(1) * 4
Алексей, добрый день!
f  вроде как лишняя,
достаточно: If pi = 0 Then pi = Atn(1) * 4
Изменено: ZVI - 12.04.2022 17:45:57
написание програмного кода тригонометрической функции
 
Цитата
sokol92 написал: Можно π узнать и без помощи Excel: Atn(1) * 4
Добрый день, Владимир!
А я Pi через константу объявляю, она один раз вычисляется на стадии компиляции.
Код
Const Pi As Double = 3.14159265358979 + 3.10862446895044E-15

Точность при этом более 15 значащих цифр, как у WorksheetFunction.pi и у Atn(1)*4
Автоматическая блокировка ячеек после сохранения, под разных пользователей.
 
Цитата
ScreamSc написал: Спасибо огромное, то, что надо
Рад был помочь, удачи Вам!
Автоматическая блокировка ячеек после сохранения, под разных пользователей.
 
Сделал по другому. Пароль отдела вводятся нажатием кнопки 'Редактирование'.
Пароли - те же. Ввод даты - по двойному клику на ячейке.
Изменено: ZVI - 08.04.2022 13:55:36
Автоматическая блокировка ячеек после сохранения, под разных пользователей.
 
Цитата
ScreamSc написал:
Ну да, ставится... я думал что понятно будет что само проставляться должно, но явно это не указал, мой косяк...  
В какой момент должна записываться дата?
Автоматическая блокировка ячеек после сохранения, под разных пользователей.
 
В моем варианте - шаблон решения по тому, что запрашивалось, без прочих неоговоренных нюансов.
Подразумевая, что  нюансы, конечно, будут появляться по мере работы, надеюсь, Вы отработаете их самостоятельно.

По поводу:
> И ещё, в столбце В, дата ставится дд-мм-ггг чч-мм. Но часы и минуты ставятся 00-00, надо чтобы ставилось текущее время, то есть например, 07.04.2022 11:22

Мне неведомо, кем и как ставится дата и время.
Ввел вручную: 08.04.2022  9:34 - все отобразилось.
Изменено: ZVI - 08.04.2022 09:40:19
Автоматическая блокировка ячеек после сохранения, под разных пользователей.
 
Добрый вечер.

См. вложенный файл.
Пароль к VBA-проекту: 123
Пароль листа: 000
Пароль A4:I1000: 125
Пароль K4:01000: 238

Весь код - в модуле ЭтаКнига, в начале есть константы паролей листа и диапазонов
Код
' ZVI:2022-04-07 https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&TID=148740

Option Explicit

' Passwords and departments names
Const PwdSh01 = "000" ' <-- Password of Sh01 for Admin
Const Dep1 = "Отдел1", PwdDep1 = "125"
Const Dep2 = "Отдел2", PwdDep2 = "238"

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  With Sh01
    .Unprotect PwdSh01
    On Error Resume Next
    .Protection.AllowEditRanges(Dep1).Delete
    .Protection.AllowEditRanges(Dep2).Delete
    On Error GoTo 0
    .Protect PwdSh01, DrawingObjects:=True, Contents:=True, Scenarios:=True, _
                      AllowFormattingCells:=True, AllowFiltering:=True, _
                      UserInterfaceOnly:=True
    Application.OnTime Now, "'" & Me.Name & "'!" & Me.CodeName & ".WbOpen"
  End With
End Sub

Private Sub Workbook_Open()
  Application.OnTime Now, "'" & Me.Name & "'!" & Me.CodeName & ".WbOpen"
End Sub

Private Sub WbOpen()
  
  Dim i As Long, j As Long
  
  With Sh01
    
    ' Unprotect Sh01
    .Unprotect PwdSh01
    
    ' Del AllowEditRanges of Dep1 & Dep2
    On Error Resume Next
    .Protection.AllowEditRanges(Dep1).Delete
    .Protection.AllowEditRanges(Dep2).Delete
    On Error GoTo 0
    
    ' Find last row
    j = .UsedRange.Rows.Count + 1000
    If j < 10000 Then j = 10000
    
    ' Protect actual range of Dep1
    i = .UsedRange.EntireRow.Columns("b").Cells.Find(What:="*", LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, SearchFormat:=False).Row
    .Protection.AllowEditRanges.Add Dep1, .Range("A" & i + 1 & ":I" & j), PwdDep1
    
    ' Protect actual range of Dep2
    i = .UsedRange.EntireRow.Columns("k").Cells.Find(What:="*", LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, SearchFormat:=False).Row
    .Protection.AllowEditRanges.Add Dep2, .Range("J" & i + 1 & ":O" & j), PwdDep2
    
    ' Protect Sh01
    .Protect PwdSh01, DrawingObjects:=True, Contents:=True, Scenarios:=True, _
                      AllowFormattingCells:=True, AllowFiltering:=True, _
                      UserInterfaceOnly:=True
    
  End With
End Sub

P.S. Это - шаблон решения. Как по мне, то диапазон отдела 2 лучше оставить фиксированным, т.к. вряд ли даты в нем заполняются сверху вниз подряд (без пропусков).
Изменено: ZVI - 08.04.2022 08:14:38
В чём отличие циклов «For Each …» для ячеек диапазона и элементов массива, Different «For Each …» cycles for Cells in Range vs Elements of Array
 
Цитата
bedvit написал: А вот массивы СОМ (в т.ч. и в VBA) это порядок сверху-вниз-направо.
Добрый день, Виталий! Все верно, в инете куча примеров C/C++ для обоих вариантов.
В чём отличие циклов «For Each …» для ячеек диапазона и элементов массива, Different «For Each …» cycles for Cells in Range vs Elements of Array
 
Цитата
Jack Famous написал:
готово
Спасибо! Осталось еще раз попросить модератора почистить тему, оставив только #1, т.к. остальное теперь - лирика  :D
В чём отличие циклов «For Each …» для ячеек диапазона и элементов массива, Different «For Each …» cycles for Cells in Range vs Elements of Array
 
Цитата
Jack Famous написал: ...если модераторы посчитают нужным,
Алексей ну, прочитайте, пожалуйста, что я написал.
Мое предложение касалось не названия темы, а описания проблемы в начале текста сообщения #1

Цитата
БМВ написал: Владимир, приветствую.
Добрый день, Михаил.
1. Там конкретизировано, что это касается только 2-мерного массива, ассоциированного с диапазоном ячеек,
2. Опечатка, спасибо! Исправил на A1:B2
В чём отличие циклов «For Each …» для ячеек диапазона и элементов массива, Different «For Each …» cycles for Cells in Range vs Elements of Array
 
Цитата
Jack Famous написал:
боюсь, что более "корректное" название темы типа "Коллекция ячеек диапазона и элементов двумерного массива, полученного из этого диапазона имеют разные индексы" не оставит шансов ищущим, а также отобъёт всякое желание открывать тему даже у тех, кто её видит  
Алексей, про краткое название темы я ничего не предлагал.
По названию проблема мне не ясна, так как реально нет отличий работы цикла «For Each …» для ячеек диапазона и элементов массива - и те и другие обрабатываются в порядке индексов элементов.
Для массива это неявный одномерный индекс, для ячеек - явный.
Мое предложение было - чтобы не было необходимости читать цепочку кодов и о чем-то самому догадываться, описывать проблему кратко в начале темы словами, в моем тексте выше это было сформулирована так:
"Используя оператор For-Each-Next, можно ошибиться в понимании порядка обработки ячеек диапазона и элементов 2-х мерного массива".
Так как понимание работы оператора и его реальная работа - это не всегда одно и тоже.
Изменено: ZVI - 17.02.2022 15:13:21
Поиск решения: ограничение по нелинейности (OpenSolver)
 
Добрый день.
Решение не смотрел - там требуется регистрация.
Но причина проблемы в применении функций МИН(), МАКС() , которые означают разрыв линейности.
В чём отличие циклов «For Each …» для ячеек диапазона и элементов массива, Different «For Each …» cycles for Cells in Range vs Elements of Array
 
Цитата
Jack Famous написал:
Цикл For Each Cell In Range идёт сначала по СТРОКАМ, потом по СТОЛБЦАМ
Цикл For Each Element In Array2D идёт сначала по СТОЛБЦАМ, потом по СТРОКАМ
Добрый день, Алексей.
Хорошо, что модераторы подчистили тему, т.к. с утра здесь что-то эмоционально обсуждали и по ходу поменяли термин "перебор по" на "ИДЕТ".
Термин "ИДЕТ" может толковаться по разному, например: пошел я по строкам 1-го столбца, потом по строкам 2-го.
Или, наоборот: потопал по всем столбцам первой строки, потом 2-й и т.д. Об этом же с утра здесь вроде спорили.

По-моему, в начале темы всегда полезно конкретно обозначить свою проблему, например: "Используя оператор For-Each-Next, можно ошибиться в понимании порядка обработки ячеек диапазона и элементов 2-х мерного массива".
А то вдруг это на самом деле окажется не проблема – мы же не знаем того, чего не знаем.
При приведенном мною описании проблемы, причина (понимание устройства коллекции ячеек диапазона) не спутается со следствием – интерпретацией кем-то работы оператора For-Each-Next, который, вообще-то, всегда работает однозначно.

Диапазон ячеек, это коллекция объектов ячеек.
Оператор For-Each-Next с любыми коллекциями работает в порядке следования индекса элемента коллекции от меньшего к большему.
У каждой ячейки диапазона (читай – коллекции объектов) Range тоже есть свой индекс. К ячейке можно обращаться по такому индексу, например Range("A1:B2").Item(2) это ячейка B1, а не A2, как некоторые могут неправильно подумать. И оператор For-Each-Next здесь совершенно не причем, он тупо перебирает коллекцию, которую ему подсунули: ячейки диапазона (читай – элементы коллекции) в порядке возрастания индекса ячеек.

Теперь пояснения по устройству массивов.
Строго говоря, у массива нет ни строк, ни столбцов, у него – размерности, каждая из которых может начинаться не обязательно с единичного индекса.
Например: Dim a(0 To 3, 10 To 11)
Физически же в памяти как элементы коллекции, так и элементы массивы всегда располагаются в непрерывном диапазоне адресов, как одномерный массив.
Но, чтобы немного «очеловечить» их восприятие и позволить произвольный перебор, у массива есть структура, которая позволяет (логически) обращаться к элементам по логическим индексам элемента, при этом внутри индекс всегда пересчитывается в индекс одномерного, так как в памяти все элементы лежат в непрерывном диапазоне адресов.

Для 2-мерного массива представление об 1-й разрядности как о строках – это вольная интерпретация конкретного программиста, у другого это легко может ассоциироваться со столбцами или ещё с каким-либо попугаями. Это лучше конкретизировать.

С массивами оператор For-Each-Next работает по порядку физического (одномерного) хранения элементов массива. С точки зрения разрядностей массива это равносильно перебору от элемента с наименьшим индексом - a(0, 11) к наибольшему a(3, 11) для примера выше, перебирая поочередно элементы 1-й разрядностей ...-a(1,11)-a(2,11)-…, потом инкрементировать индекс 2-й разрядности, если она есть, и.т.д.

Если хочется упростить понимание обработки For-Each-Next, ассоциируя 2-мерный массив с диапазоном ячеек Excel, то порядок обработки такой:
1. Ячейки диапазона: Слева-Направо-Вниз
2. Элементы 2-мерного массива: Сверху-Вниз-Направо

Но, еще раз подчеркну, оператор For-Each-Next здесь не причем.

Пример кода для понимания устройства коллекции Range:
Код
Sub Test1()
  ' For-Each-Next
  Dim rng As Range, cell As Range
  Set rng = Range("A1:B2")
  Debug.Print "Cell"
  For Each cell In rng.Cells
    Debug.Print cell.Address(0, 0)
  Next
End Sub

Sub Test2()
  ' Аналог For-Each-Next
  Dim i As Long, rng As Range
  Set rng = Range("A1:B2")
  Debug.Print "Item"
  For i = 1 To rng.Cells.Count
    Debug.Print rng.Item(i).Address(0, 0)
  Next
End Sub

P.S. Извиняюсь за много слов
Изменено: ZVI - 17.02.2022 15:31:37
Объявление переменной по условию, Declare the variable by condition
 
Цитата
Jack Famous написал:
правильно ли я понимаю,
Правильно.
По коду - вместо If Not fStatic Then лучше If RE Is Nothing Then без всяких лишних дел
Вообще, экономить на переменных - это явный перебор:
- память они сами по себе отъедают никакую.
- глобальные переменные можно очищать, а локальные создаются и живут только на время выполнения процедуры/функции.

Непонятно, в чем проблема, которую нужно решать.
И проблема ли это?
Скорее, вопрос познавательный, как я понял.
Изменено: ZVI - 26.01.2022 13:57:41
Объявление переменной по условию, Declare the variable by condition
 
Цитата
vikttur написал:
Правильно ли понимаю
Добрый день, Виктор. Да, правильно.
Кроме тех, что объявлены в условном компилировании.

P.S. Для выполнения кода он автоматически компилируется, если ранее не был скомпилирован.
При этом резервируется память, в том числе, под все переменные как глобальные, так и локальные.
При этом из #If Cond #Else #End If компилируются только то, что определено условием Cond .
Изменено: ZVI - 26.01.2022 14:06:25
Объявление переменной по условию, Declare the variable by condition
 
Добрый день, Алексей.
Экономим переменные? Ну-ну  :)
Код
#Const ALEXEY = True ' Менять здесь

#If ALEXEY Then
  Dim a As Long
#Else
  Dim b As Range
#End If

Sub Test()
#If ALEXEY Then
  Debug.Print TypeName(a)
  Dim c
  '...
#Else
  Debug.Print TypeName(b)
  Dim d
  '...
#End If
End Sub


Локальные переменные можно задавать и обычным способом
Код
Sub Test1()
  Dim n&
  n = 1 ' или вызов функции, меняющей n: Call Fn(n)
  If n = 1 Then
    Dim ЧегоНибудь
    ' И дальше весь код здесь
    '...
  Else
    Dim ЧегоНибудьДругое
    'И дальше весь код здесь
    '...
  End If
End Sub
Кусочно-линейная интерполяция
 
Пара исторических ссылок по теме:
1. Работа с графиками
2. Линейная интерполяция
Там разные варианты, в том числе, от MCH и от С.М.
Приложил оттуда 2 своих варианта
Изменено: ZVI - 26.09.2021 04:31:54
Как отключить постоянно вылетающее окно "Некоторые файлы могут содержать вирусы или другое опасное содержимое... "
 
Нет фиксированного набора ключей реестра, которые нужно править, все зависит от установленных приложений, еще и от порядка их установки.
Отмечалось уже, что сообщения могут быть разными, например, если файл MP4 не разблокирован, то предупреждение безопасности операционной системы будет "Вы хотите открыть это файл?" - точно такое же, как при двойном клике на файле в проводнике, и это не лечится флагом EditFlags - требуется разблокировка файла, которая тоже ранее описывалась.
Мы с Вами прошли длинный путь по решению проблемы через реестр с MP3, но сейчас Вы не указали, о каком именно сообщении идет речь для MP4, а также - разблокирован ли MP4 или нет.

Так как компьютер локальный, то давайте попробуем сделать проще через изменение политики безопасности:
1. Нажать "Win"+"R",  или правый клик на иконке "Пуск" и затем "Выполнить", чтобы перейти в командную строку
2. Ввести: gpedit.msc и нажать OK
3. Перейти в раздел "Конфигурация пользователя" - "Административные шаблоны" - "Компоненты Windows" - "Диспетчер вложений"
4. В окне справа двойной клик на "Список включений для типов файлов с низким уровнем риска"
5. Выбрать "Включено", в поле "Параметры" вписать: .mp3;.mp4 (обратите внимание на точку!) и нажать OK
В реестре этот список расширений пропишется в строковый параметр:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\­Policies\Associations\LowRiskFileTypes
Можно создать этот ключ в реестре и вручную, его значение: .mp3;.mp4
Изменено: ZVI - 21.09.2021 04:53:33
Как отключить постоянно вылетающее окно "Некоторые файлы могут содержать вирусы или другое опасное содержимое... "
 
Цитата
Dalm написал: ...почему-то такие же ссылки на файлы mp4 - показывают окна-предупреждения
Рад, что заработало с MP3.
Здесь речь шла только о файлах с расширением MP3.
Для расширений MP4 нужно сделать аналогично, и не забыть разблокировать эти файлы.
Изменено: ZVI - 20.09.2021 13:18:40
Как отключить постоянно вылетающее окно "Некоторые файлы могут содержать вирусы или другое опасное содержимое... "
 
Цитата
Dalm написал: ...перезагружать компьютер надо...
Нет, перезагружать комп или Excel не требуется.
Пропись в PLEX
 
Цитата
Perec написал: ...так в английском языке не принято писать...
Пишут так тоже, а для чеков - вообще иначе.
Код того, что Вам нужно, есть в примере Microsoft по ссылке: http://support.microsoft.com/kb/213360
Но там для долларов и центов. Легко можно переделать для Евро и Евроцентов, еще и учесть различные символы разделителя целой и дробной части - см.приложенную модификацию кода под спойлером.
Вызывается в ячейке так: =EuroEn(A1) , где сумма - в A1.
Код

P.S. Это решение - вне Plex, конечно.
Изменено: ZVI - 16.09.2021 22:37:45
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 141 След.
Наверх