2003/XP/2000 - [архив] Microsoft Excel 2003 и более ранние версии

Ответить
 • Просмотры: 10
Аватара пользователя
iam_alex

Re: 2003/XP/2000 - [архив] Microsoft Excel 2003 и более ранние версии

Сообщение iam_alex »

win XP SP1, и офис тоже XP (2002)... просто раньше то нормально было...а потом вот так вот стало...Изображение(
Аватара пользователя
iam_alex

Re: 2003/XP/2000 - [архив] Microsoft Excel 2003 и более ранние версии

Сообщение iam_alex »

вспоминал-вспоминал... а 1С не стоит случаем?
Аватара пользователя
grigory2005

Re: 2003/XP/2000 - [архив] Microsoft Excel 2003 и более ранние версии

Сообщение grigory2005 »

В столбце находятся ячейки в которых работают формулы.

Задача:исключить возможность появления в этих ячейках отрицательных чисел.
Аватара пользователя
Pliomera

Re: 2003/XP/2000 - [архив] Microsoft Excel 2003 и более ранние версии

Сообщение Pliomera »

Уточни немного задачу, что значит "исключить" ? А если результат формулы дает отрицательное число? То есть надо исключить область определения аргументов формулы, в которых ее значение отрицательно? Ну эту задачу вряд-ли возможно решить в общем виде, так как формулы могут быть бесконечно разнообразны. Другое дело можно использовать так называемое "форматирование по условию", при этом например все ячейки, в которых будут появляться отрицательные значения, можно сделать, например красным шрифтом, или на желтом фоне, или выделить другим типом форматирования. Если тебе нужно решение вопроса, опиши задачу в целом, можно в мыло...
Аватара пользователя
grigory2005

Re: 2003/XP/2000 - [архив] Microsoft Excel 2003 и более ранние версии

Сообщение grigory2005 »

Уточняю:

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

где число постоянно и второй ячейкой (накопительной),куда вводят данные.

При разности =0,необходимо заблокировать ввод в накопительную ячейку.

Количество строк очень большое,

Спасибо.
Аватара пользователя
Pliomera

Re: 2003/XP/2000 - [архив] Microsoft Excel 2003 и более ранние версии

Сообщение Pliomera »

Все равно не совсем понятно: в момент ввода числа в ячейку результат формулы в другой ячейке, зависящей от нее - ЕЩЕ НЕ ИЗВЕСТЕН!!! Он будет вычислен ПОСЛЕ окончания ввода числа и может оказаться как >0, так и
Аватара пользователя
aESThete

Re: 2003/XP/2000 - [архив] Microsoft Excel 2003 и более ранние версии

Сообщение aESThete »

PliomeraЧестно говоря, не силен в VBA. Предположение: не знаю, есть ли такие события как Validate или OnChange, видно ли там старое значение. Попробовать вычислить формулу для результирующей ячейки, если некорректное значение, изменения отклонить или восстановить старое значение и/или рявкнуть меседжбоксом.



PS придумалось по ходу: копировать старые значения в скрытый защищенный параллельный столбец/строку/лист и при "неправильном" значении восстанавливать оттуда.
Аватара пользователя
Pliomera

Re: 2003/XP/2000 - [архив] Microsoft Excel 2003 и более ранние версии

Сообщение Pliomera »

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



Предположим, что в столбце 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 и более ранние версии

Сообщение aESThete »

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
Аватара пользователя
Pliomera

Re: 2003/XP/2000 - [архив] Microsoft Excel 2003 и более ранние версии

Сообщение Pliomera »

aESThete


Цитата:



вставить ту самую вычисляемую формулу



Это не всегда возможно, потому что формула может ссылаться на множество разных ячеек и считывать значения их всех программным способом может быть очень громоздко, а вариант проверки по некоторому условию результата формулы записанной на листе - возможен, потому что значение в ячейке, содержащей формулу перевычисляется ДО окончания работы процедуры Worksheet_Change. Не обязательно эта формула должна быть справа от изменяемой ячейки, это просто для примера...
Ответить

Вернуться в «Microsoft Office (Word, Excel, Outlook и т.д.)»