Доброе утро многоуважаемые форумчане!!! Завершил я свою задумку чтоб не паролить лист от нерадивых, спрятать все формулы в код.
Цитата
Да многие скажут что нужно было тогда самим кодом производить вычисления (как примерно это сделал krosav4ig, в одной из моих тем My WebPage ) Но, увы!!! Я так не умею и как говорил Александр _Boroda_, Я только учусь (пусть и в натяжку но пытаюсь).
Ну так вот. Я бы не сказал что это проблема но работа все равно (сам понимаю) не корректна в самой работе + есть ряд неудобных моментов. Не которые коды начинают свою работу лишь после того если я произведу какие нибудь изменения Вот к примеру если я начинаю изменять "Разрушающая нагрузка, кН" (столбец 11 в таблице) то я вынужден куда нибудь или где нибудь что изменить/сделать чтоб про извелись вычисления. Также имеются небольшие зависания если я ввожу какое то либо значение в таблицу (как бы это сказать в обдумывании действии кода что ли)
Вот теперь прошу вас подскажите как лучше усовершенствовать!? Возможно мне нужно формулы прописать не на события на листе Worksheet_Change а на Worksheet_Calculate. Как вы думаете!? Заранее 1000 извинений и огромнейшее спасибо за подсказки или решение
Доброе утро многоуважаемые форумчане!!! Завершил я свою задумку чтоб не паролить лист от нерадивых, спрятать все формулы в код.
Цитата
Да многие скажут что нужно было тогда самим кодом производить вычисления (как примерно это сделал krosav4ig, в одной из моих тем My WebPage ) Но, увы!!! Я так не умею и как говорил Александр _Boroda_, Я только учусь (пусть и в натяжку но пытаюсь).
Ну так вот. Я бы не сказал что это проблема но работа все равно (сам понимаю) не корректна в самой работе + есть ряд неудобных моментов. Не которые коды начинают свою работу лишь после того если я произведу какие нибудь изменения Вот к примеру если я начинаю изменять "Разрушающая нагрузка, кН" (столбец 11 в таблице) то я вынужден куда нибудь или где нибудь что изменить/сделать чтоб про извелись вычисления. Также имеются небольшие зависания если я ввожу какое то либо значение в таблицу (как бы это сказать в обдумывании действии кода что ли)
Вот теперь прошу вас подскажите как лучше усовершенствовать!? Возможно мне нужно формулы прописать не на события на листе Worksheet_Change а на Worksheet_Calculate. Как вы думаете!? Заранее 1000 извинений и огромнейшее спасибо за подсказки или решениеlebensvoll
lebensvoll, привет! Может, отказаться от формул? Например, вместо этого [vba]
Код
If Target.Address = "$B$14" Then With Range("$P$28") .FormulaR1C1 = _ "=MID(R[-14]C[-14],SEARCH(""-"",R[-14]C[-14],1)+1,2)" .Value = .Value End With End If
[/vba] попробуйте так [vba]
Код
With Target If .Address = "$B$14" Then Range("P28").Value = Mid(.Value, InStr(.Value, "-") + 1, 2) End With
[/vba]
lebensvoll, привет! Может, отказаться от формул? Например, вместо этого [vba]
Код
If Target.Address = "$B$14" Then With Range("$P$28") .FormulaR1C1 = _ "=MID(R[-14]C[-14],SEARCH(""-"",R[-14]C[-14],1)+1,2)" .Value = .Value End With End If
[/vba] попробуйте так [vba]
Код
With Target If .Address = "$B$14" Then Range("P28").Value = Mid(.Value, InStr(.Value, "-") + 1, 2) End With
nilem, Спасибо за ответ!!! Так в том то и дело Вы сейчас в самом коде производите вычисления. Как и предлагал мне krosav4ig,
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim ar As Range, arr As Variant On Error Resume Next 'при любых изменениях размеров образцов "Площадь образца =" With Me.UsedRange.Columns("A:D") For Each ar In Intersect(.Offset(5), .Cells, Target).Areas With ar.Offset(, .Column - ar.Column).Resize(, 5) arr = .Value For i = 1 To .Rows.Count arr(i, 5) = Round(arr(i, 1) * arr(i, 3) / 100, 0) Next Application.EnableEvents = 0 .Value = arr Application.EnableEvents = 1 End With Next End With End Sub
[/vba]
Но для меня это пока что очень сложно в понимании. Да и потом есть ряд других более сложных формул которые я лично не смогу сам прописать также грамотно как и вы... Поэтому и прошу подсказки возможные варианты чтоб в этом же духе оформления. но за посыл спасибо я постараюсь в подобном образе осуществить прописание
nilem, Спасибо за ответ!!! Так в том то и дело Вы сейчас в самом коде производите вычисления. Как и предлагал мне krosav4ig,
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim ar As Range, arr As Variant On Error Resume Next 'при любых изменениях размеров образцов "Площадь образца =" With Me.UsedRange.Columns("A:D") For Each ar In Intersect(.Offset(5), .Cells, Target).Areas With ar.Offset(, .Column - ar.Column).Resize(, 5) arr = .Value For i = 1 To .Rows.Count arr(i, 5) = Round(arr(i, 1) * arr(i, 3) / 100, 0) Next Application.EnableEvents = 0 .Value = arr Application.EnableEvents = 1 End With Next End With End Sub
[/vba]
Но для меня это пока что очень сложно в понимании. Да и потом есть ряд других более сложных формул которые я лично не смогу сам прописать также грамотно как и вы... Поэтому и прошу подсказки возможные варианты чтоб в этом же духе оформления. но за посыл спасибо я постараюсь в подобном образе осуществить прописаниеlebensvoll
Кто бы ты ни был, мир в твоих руках
Сообщение отредактировал lebensvoll - Пятница, 05.04.2019, 09:30
Чтобы при открытии файла запускался пересчет макроса, можно в модуле книги написать что-то типа [vba]
Код
Private Sub Workbook_Open() Sheets("Протокол").Cells(1) = Sheets("Протокол").Cells(1) End Sub
[/vba]
Еще у Вас есть строка [vba]
Код
If Target.Cells.Count > 1 Then Exit Sub
[/vba] Она находится ДО кода с пересчетом формул. То есть если мы меняем 2 (или больше) ячейки сразу, то пересчет не запускается, а происходит выход из макроса. Убиваем эту строку
Отключение реакции на события Вы написали, а где отключение обновления экрана и автопересчета? Вот так напишите [vba]
Код
'Прячем формулы с глаз долой Application.ScreenUpdating = 0 Application.Calculation = 3 Application.EnableEvents = 0 'при изменение "Нумерация протокола" возраст "суток" (бетона/раствора) меняется ... ... Application.EnableEvents = 1 Application.Calculation = 1 Application.ScreenUpdating = 1 End Sub
[/vba] Поскольку Вы меняете значения в ячейках, то именно в этих изменяемых ячейках пересчет все равно происходить будет. А во всем остальном - нет
Чтобы при открытии файла запускался пересчет макроса, можно в модуле книги написать что-то типа [vba]
Код
Private Sub Workbook_Open() Sheets("Протокол").Cells(1) = Sheets("Протокол").Cells(1) End Sub
[/vba]
Еще у Вас есть строка [vba]
Код
If Target.Cells.Count > 1 Then Exit Sub
[/vba] Она находится ДО кода с пересчетом формул. То есть если мы меняем 2 (или больше) ячейки сразу, то пересчет не запускается, а происходит выход из макроса. Убиваем эту строку
Отключение реакции на события Вы написали, а где отключение обновления экрана и автопересчета? Вот так напишите [vba]
Код
'Прячем формулы с глаз долой Application.ScreenUpdating = 0 Application.Calculation = 3 Application.EnableEvents = 0 'при изменение "Нумерация протокола" возраст "суток" (бетона/раствора) меняется ... ... Application.EnableEvents = 1 Application.Calculation = 1 Application.ScreenUpdating = 1 End Sub
[/vba] Поскольку Вы меняете значения в ячейках, то именно в этих изменяемых ячейках пересчет все равно происходить будет. А во всем остальном - нет_Boroda_
Отключение реакции на события Вы написали, а где отключение обновления экрана и автопересчета?
Я и не думал о том что нужно еще дополнять к отключению события два других Не я бы так просто не смог бы тем более о предложении nilem, но я по мере возможности постараюсь осуществить это предложение... Потому как я понимаю: Что если данный файл кто то захочет как то приоброзить исправить таблицу (удалит строки или же добавит) то все мои макросы полетят Ну а также самому попытаться еще глубже окунуться в познание vba СПАСИБО ВАМ всем ОГРОМНЕЙШЕЕ!!! И за отзывчивость и за подсказки и за посыл к учебе....
_Boroda_, да уж...
Цитата
Отключение реакции на события Вы написали, а где отключение обновления экрана и автопересчета?
Я и не думал о том что нужно еще дополнять к отключению события два других Не я бы так просто не смог бы тем более о предложении nilem, но я по мере возможности постараюсь осуществить это предложение... Потому как я понимаю: Что если данный файл кто то захочет как то приоброзить исправить таблицу (удалит строки или же добавит) то все мои макросы полетят Ну а также самому попытаться еще глубже окунуться в познание vba СПАСИБО ВАМ всем ОГРОМНЕЙШЕЕ!!! И за отзывчивость и за подсказки и за посыл к учебе....lebensvoll