(2003/XP/2000 - [архив] Microsoft Excel 2003 и более ранние версии
-
iam_alex
Re: 2003/XP/2000 - [архив] Microsoft Excel 2003 и более ранние версии
win XP SP1, и офис тоже XP (2002)... просто раньше то нормально было...а потом вот так вот стало...
(
(-
iam_alex
Re: 2003/XP/2000 - [архив] Microsoft Excel 2003 и более ранние версии
вспоминал-вспоминал... а 1С не стоит случаем?
-
grigory2005
Re: 2003/XP/2000 - [архив] Microsoft Excel 2003 и более ранние версии
В столбце находятся ячейки в которых работают формулы.
Задача:исключить возможность появления в этих ячейках отрицательных чисел.
Задача:исключить возможность появления в этих ячейках отрицательных чисел.
-
Pliomera
Re: 2003/XP/2000 - [архив] Microsoft Excel 2003 и более ранние версии
Уточни немного задачу, что значит "исключить" ? А если результат формулы дает отрицательное число? То есть надо исключить область определения аргументов формулы, в которых ее значение отрицательно? Ну эту задачу вряд-ли возможно решить в общем виде, так как формулы могут быть бесконечно разнообразны. Другое дело можно использовать так называемое "форматирование по условию", при этом например все ячейки, в которых будут появляться отрицательные значения, можно сделать, например красным шрифтом, или на желтом фоне, или выделить другим типом форматирования. Если тебе нужно решение вопроса, опиши задачу в целом, можно в мыло...
-
grigory2005
Re: 2003/XP/2000 - [архив] Microsoft Excel 2003 и более ранние версии
Уточняю:
в ячейке, где находится формула ,определяется разность между одной ячейкой
где число постоянно и второй ячейкой (накопительной),куда вводят данные.
При разности =0,необходимо заблокировать ввод в накопительную ячейку.
Количество строк очень большое,
Спасибо.
в ячейке, где находится формула ,определяется разность между одной ячейкой
где число постоянно и второй ячейкой (накопительной),куда вводят данные.
При разности =0,необходимо заблокировать ввод в накопительную ячейку.
Количество строк очень большое,
Спасибо.
-
Pliomera
Re: 2003/XP/2000 - [архив] Microsoft Excel 2003 и более ранние версии
Все равно не совсем понятно: в момент ввода числа в ячейку результат формулы в другой ячейке, зависящей от нее - ЕЩЕ НЕ ИЗВЕСТЕН!!! Он будет вычислен ПОСЛЕ окончания ввода числа и может оказаться как >0, так и
-
aESThete
Re: 2003/XP/2000 - [архив] Microsoft Excel 2003 и более ранние версии
PliomeraЧестно говоря, не силен в VBA. Предположение: не знаю, есть ли такие события как Validate или OnChange, видно ли там старое значение. Попробовать вычислить формулу для результирующей ячейки, если некорректное значение, изменения отклонить или восстановить старое значение и/или рявкнуть меседжбоксом.
PS придумалось по ходу: копировать старые значения в скрытый защищенный параллельный столбец/строку/лист и при "неправильном" значении восстанавливать оттуда.
PS придумалось по ходу: копировать старые значения в скрытый защищенный параллельный столбец/строку/лист и при "неправильном" значении восстанавливать оттуда.
-
Pliomera
Re: 2003/XP/2000 - [архив] Microsoft Excel 2003 и более ранние версии
Вот, по размышлению, такой может быть реализация идеи с резервированием предыдущих значений:
Предположим, что в столбце B листа Sheet1 в момент активации листа хранятся допустимые
(валидные) значения, при котором результаты формул, записанных в столбце C - имеют также
допустимые значения. Здесь могут быть 2 варианта: 1 вариант - число строк (пар
значение-формула) конечно, например с 5 по 25 строку, и 2 вариант - число строк
неопределено, допустим постоянно пополняемая таблица, при этом формулы протягиваются по
мере надобности.
В момент активации листа нам надо заполнить значениями из столбца текущих аргументов (B)
заранее объявленный массив, размер которого будет либо фиксированным (1 вариант) либо
динамическим (2 вариант), для того, чтобы воспользоваться нужным значением для отката, в
случае, если пользователь введет некорректные данные.
Таким образом:
- объявляем в general declarations листа:
Private UndoValues(5 To 25) As Variant 'Для 1 варианта
Private UndoValues() As Variant 'Для 2 варианта
В модуле листа пишем:
Для 1 варианта:
Private Sub Worksheet_Activate()
Dim iCount As Integer 'Счетчик цикла
For iCount = 5 To 25
UndoValues(iCount) = Sheets("Sheet1").Cells(iCount,2).Value 'Здесь 2 - номер столбца
Next iCount
End Sub
Для 2 варианта (пусть ряд аргументов начинается также с 5 строки, но их число не
определено):
Private Sub Worksheet_Activate()
Dim iCount As Integer 'Счетчик цикла
Dim rowCount As Integer 'Счетчик строк
rowCount = 5 'Присваиваем начальное значение
Do Until Len(CStr(Sheets("Sheet1").Cells(rowCount,2).Value)) = 0 'Проверка не пуста ли очередная ячейка
rowCount = rowCount + 1 'Инкремент
Loop
Redim UndoValues(rowCount - 1) 'Задаем диапазон динамического массива, при этом элементы с 0 по 4 нам не потребуются
For iCount = 5 To rowCount - 1
UndoValues(iCount) = Sheets("Sheet1").Cells(iCount,2).Value 'Считываем значения
Next iCount
End Sub
Теперь там же в модуле листа пишем:
Private Sub Worksheet_Change(ByVal Target As Range)
If Sheets("Sheet1").Cells(Target.Row, 3).Value >= 0 Then Exit Sub 'В данном случае - проверка является ли положительным значение формулы расположенной в соседней ячейке справа
Target.Value = UndoValues(Target.Row) 'А здесь возвращаем первоначальное значение
End Sub
При последовательных изменениях в одной и той же ячейке, процесс считывания исходных
валидных значений лучше убрать из события активации листа куда-нибудь еще, например в
отдельный модуль, и вызывать, скажем по нажатию кнопки, или по событию Calculate.
Надеюсь понятно изложил
Предположим, что в столбце B листа Sheet1 в момент активации листа хранятся допустимые
(валидные) значения, при котором результаты формул, записанных в столбце C - имеют также
допустимые значения. Здесь могут быть 2 варианта: 1 вариант - число строк (пар
значение-формула) конечно, например с 5 по 25 строку, и 2 вариант - число строк
неопределено, допустим постоянно пополняемая таблица, при этом формулы протягиваются по
мере надобности.
В момент активации листа нам надо заполнить значениями из столбца текущих аргументов (B)
заранее объявленный массив, размер которого будет либо фиксированным (1 вариант) либо
динамическим (2 вариант), для того, чтобы воспользоваться нужным значением для отката, в
случае, если пользователь введет некорректные данные.
Таким образом:
- объявляем в general declarations листа:
Private UndoValues(5 To 25) As Variant 'Для 1 варианта
Private UndoValues() As Variant 'Для 2 варианта
В модуле листа пишем:
Для 1 варианта:
Private Sub Worksheet_Activate()
Dim iCount As Integer 'Счетчик цикла
For iCount = 5 To 25
UndoValues(iCount) = Sheets("Sheet1").Cells(iCount,2).Value 'Здесь 2 - номер столбца
Next iCount
End Sub
Для 2 варианта (пусть ряд аргументов начинается также с 5 строки, но их число не
определено):
Private Sub Worksheet_Activate()
Dim iCount As Integer 'Счетчик цикла
Dim rowCount As Integer 'Счетчик строк
rowCount = 5 'Присваиваем начальное значение
Do Until Len(CStr(Sheets("Sheet1").Cells(rowCount,2).Value)) = 0 'Проверка не пуста ли очередная ячейка
rowCount = rowCount + 1 'Инкремент
Loop
Redim UndoValues(rowCount - 1) 'Задаем диапазон динамического массива, при этом элементы с 0 по 4 нам не потребуются
For iCount = 5 To rowCount - 1
UndoValues(iCount) = Sheets("Sheet1").Cells(iCount,2).Value 'Считываем значения
Next iCount
End Sub
Теперь там же в модуле листа пишем:
Private Sub Worksheet_Change(ByVal Target As Range)
If Sheets("Sheet1").Cells(Target.Row, 3).Value >= 0 Then Exit Sub 'В данном случае - проверка является ли положительным значение формулы расположенной в соседней ячейке справа
Target.Value = UndoValues(Target.Row) 'А здесь возвращаем первоначальное значение
End Sub
При последовательных изменениях в одной и той же ячейке, процесс считывания исходных
валидных значений лучше убрать из события активации листа куда-нибудь еще, например в
отдельный модуль, и вызывать, скажем по нажатию кнопки, или по событию Calculate.
Надеюсь понятно изложил

-
aESThete
Re: 2003/XP/2000 - [архив] Microsoft Excel 2003 и более ранние версии
Pliomera
Вот, родилось:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target ... ' здесь надо проверить, попадает ли изменяемое значение в "наш" (сохраненный) диапазон
If Sheets("Sheet1").Cells(Target.Row, 3).Value >= 0 Then ' здесь можно (нет, нужно!) вместо проверки соседней, вставить ту самую вычисляемую формулу, и проверять на валидность
UndoValues(Target.Row) = Target.Value ' сохраняем вновь введенное значение для последующих возможных откатов
else
Target.Value = UndoValues(Target.Row) ' или возвращаем первоначальное значение
end if
end if
End Sub
Вот, родилось:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target ... ' здесь надо проверить, попадает ли изменяемое значение в "наш" (сохраненный) диапазон
If Sheets("Sheet1").Cells(Target.Row, 3).Value >= 0 Then ' здесь можно (нет, нужно!) вместо проверки соседней, вставить ту самую вычисляемую формулу, и проверять на валидность
UndoValues(Target.Row) = Target.Value ' сохраняем вновь введенное значение для последующих возможных откатов
else
Target.Value = UndoValues(Target.Row) ' или возвращаем первоначальное значение
end if
end if
End Sub
-
Pliomera
Re: 2003/XP/2000 - [архив] Microsoft Excel 2003 и более ранние версии
aESThete
Цитата:
вставить ту самую вычисляемую формулу
Это не всегда возможно, потому что формула может ссылаться на множество разных ячеек и считывать значения их всех программным способом может быть очень громоздко, а вариант проверки по некоторому условию результата формулы записанной на листе - возможен, потому что значение в ячейке, содержащей формулу перевычисляется ДО окончания работы процедуры Worksheet_Change. Не обязательно эта формула должна быть справа от изменяемой ячейки, это просто для примера...
Цитата:
вставить ту самую вычисляемую формулу
Это не всегда возможно, потому что формула может ссылаться на множество разных ячеек и считывать значения их всех программным способом может быть очень громоздко, а вариант проверки по некоторому условию результата формулы записанной на листе - возможен, потому что значение в ячейке, содержащей формулу перевычисляется ДО окончания работы процедуры Worksheet_Change. Не обязательно эта формула должна быть справа от изменяемой ячейки, это просто для примера...