Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 26.10.2008, 11:37   #11
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Перед строкой iSS = iSS + Cells(i + 13, 5) * val(Cells(i + 13, 4).Value)

добавьте строку Cells(i + 13, 5).Interior.ColorIndex = 3
После этого измените любую ячейку в 4 или 5 столбце.

При этом ячейки, для которых будут выполняться вычисления, окрасятся в красный цвет.

Сразу видно, что суммируются данные совсем не из того диапазона, из которого нужно...

После чего измените эти строки на
Cells(i , 5).Interior.ColorIndex = 3
iSS = iSS + Cells(i , 5) * Cells(i , 4)


Теперь выделение цветом подскажет, что вычисления производятся верно.


Кроме того, вместо использования кода
Код:
If Not Intersect(Target, [K34:K1569]) Is Nothing Then
                Dim iCell As Range
                For Each iCell In Intersect(Target, [K34:K1569])
                    Select Case Len(CStr(iCell.Value))
                        Case Is = 0    'Case 0
                            'Здесь можно отследить удаление
                        Case Is <> 8
                            Application.EnableEvents = False
                            Application.Undo
                            Application.EnableEvents = True
                            Exit For    'Exit Sub
                    End Select
                Next
            End If
по-моему, проще поставить условия на значение этих ячеек
(через меню Данные - Проверка)


Цитата:
А по поводу
iSS = iSS + Cells(i + 13, 5) * val(Cells(i + 13, 4).Value)
я правильно сделал?
Если в Cells(i + 13, 5) будет текст, снова получите ту же ошибку
(рано или поздно Ваш бухгалтер всё равно снова вместо числа занесёт в ячейку что-нибудь неподходящее)

Можете использовать подобный код в качестве обёртки для получения числового значения ячейки:
Код:
Function CV(ByVal ro As long, ByVal col As long)
    CV = val(Cells(ro, col).Value)
    ' здесь можно сделать обработку ошибок
End Function
А потом обращаться к значениям ячеек, например, так:
Код:
Sub test()
    ss = CV(5, 6)
    s2 = CV(i + 1, 22) * 5
End Sub

Последний раз редактировалось EducatedFool; 26.10.2008 в 11:55.
EducatedFool вне форума
Старый 26.10.2008, 12:17   #12
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Кроме того, вместо использования кода
Код:
If Not Intersect(Target, [K34:K1569]) Is Nothing Then
                Dim iCell As Range
                For Each iCell In Intersect(Target, [K34:K1569])
                    Select Case Len(CStr(iCell.Value))
                        Case Is = 0    'Case 0
                            'Здесь можно отследить удаление
                        Case Is <> 8
                            Application.EnableEvents = False
                            Application.Undo
                            Application.EnableEvents = True
                            Exit For    'Exit Sub
                    End Select
                Next
            End If
по-моему, проще поставить условия на значение этих ячеек
(через меню Данные - Проверка)
При таком коде удаляется не верное значение(по длине, хотя и тут есть минус, еще не добрался до решений, например: 123456,8, сохраняется, а такого не должно быть), а через Данные - Проверка, только сигнализирует об ошибки и ее оставляет, мой бух., просто пропустит ее и дальше пойдет
Цитата:
Если в Cells(i + 13, 5) будет текст, снова получите ту же ошибку
(рано или поздно Ваш бухгалтер всё равно снова вместо числа занесёт в ячейку что-нибудь неподходящее)
Ну тут не страшно, в этот столбец модуль вставляет данные и редактирование запрещено.

С остальным, разбираюсь!
valerij вне форума
Старый 26.10.2008, 12:33   #13
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
а через Данные - Проверка, только сигнализирует об ошибки и ее оставляет
Насколько я знаю, неверное значение в ячейку никак не ввести, если на вкладке Сообщение об ошибке выбрать вид действия Останов

Цитата:
еще не добрался до решений, например: 123456,8, сохраняется, а такого не должно быть
If Not Cells(1, 1).Value Like String(8, "#") Then Cells(1, 1).Value = ""

Результатом выражения Cells(1, 1).Value Like String(8, "#") будет True, если все 8 символов ячейки Cells(1, 1) являются цифрами.

Код If Not Cells(1, 1).Value Like String(8, "#") Then Cells(1, 1).Value = "" будет удалять содержимое ячейки Cells(1, 1), если в неё введено что-либо кроме 8-значного числа

Цитата:
При таком коде удаляется не верное значение(по длине, хотя и тут есть минус, еще не добрался до решений, например: 123456,8, сохраняется, а такого не должно быть), а через Данные - Проверка, только сигнализирует об ошибки и ее оставляет, мой бух., просто пропустит ее и дальше пойдет
Самый простой способ:
Данные - Проверка
Тип данных - целое число, Значение - между, Минимум - 10000000, Максимум - 99999999
Сообщение об ошибке - Действие - Останов

Пусть потом Ваш так называемый "бух." попытается вбить в ячейку что-нибудь кроме 8-значного числа...

Последний раз редактировалось EducatedFool; 26.10.2008 в 12:47.
EducatedFool вне форума
Старый 26.10.2008, 13:07   #14
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Самый простой способ:
Данные - Проверка
Тип данных - целое число, Значение - между, Минимум - 10000000, Максимум - 99999999
Сообщение об ошибке - Действие - Останов

Пусть потом Ваш так называемый "бух." попытается вбить в ячейку что-нибудь кроме 8-значного числа...
Да, отлично, только очень много ручной работы 13 Листов по 31 дню.

Цитата:
If Not Cells(1, 1).Value Like String(8, "#") Then Cells(1, 1).Value = ""

Результатом выражения Cells(1, 1).Value Like String(8, "#") будет True, если все 8 символов ячейки Cells(1, 1) являются цифрами.

Код If Not Cells(1, 1).Value Like String(8, "#") Then Cells(1, 1).Value = "" будет удалять содержимое ячейки Cells(1, 1), если в неё введено что-либо кроме 8-значного числа
А это интересно, только я не знаю как это вставить в мой код?
Вводится № в яч. К34:К39 и далее с шагом 51(К85:К90,....)
valerij вне форума
Старый 26.10.2008, 13:18   #15
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Да, отлично, только очень много ручной работы 13 Листов по 31 дню.
Странно это слышать от человека, использующего VBA...

Цитата:
Вводится № в яч. К34:К39 и далее с шагом 51(К85:К90,....)
Код:
Sub Макрос2()
    'Вводится № в яч. К34:К39 и далее с шагом 51(К85:К90,....)
    Dim ra As Range:    Set ra = [k34:k39]
    For i = 0 To 30    ' ну или сколько там надо
        With ra.Offset(51 * i).Validation
            .Delete
            .Add Type:=xlValidateWholeNumber, AlertStyle:=xlValidAlertStop, _
                 Operator:=xlBetween, Formula1:="10000000", Formula2:="99999999"
            .IgnoreBlank = True
            .InCellDropdown = True
            .InputTitle = "Заголовок подсказки"
            .ErrorTitle = "Заголовок сообщения об ошибке"
            .InputMessage = "Содержание подсказки"
            .ErrorMessage = "Текст сообщения об ошибке"
            .ShowInput = True
            .ShowError = True
        End With
    Next
End Sub
EducatedFool вне форума
Старый 26.10.2008, 13:31   #16
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Странно это слышать от человека, использующего VBA...
EducatedFool, да я в VBA еще "зелень", но прорастающея, благодаря таким людям!!!!!
valerij вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Указать нужный тип переменной KiDoki Общие вопросы Delphi 3 06.10.2008 17:11
Как указать в регулярке............ Adamant PHP 12 25.03.2008 10:11
Указать критерии поиска? фЁдОр БД в Delphi 28 18.02.2008 17:17
Как указать путь компилируемуму exe файлу shurik_7866 Общие вопросы Delphi 2 18.07.2007 23:24
Как указать диапазон чисел? Inbox Общие вопросы Delphi 2 29.06.2007 01:21