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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.01.2010, 10:42   #1
Ольга Ларина
Пользователь
 
Регистрация: 26.01.2010
Сообщений: 15
По умолчанию Ячейка с накоплением

Здравствуйте, очень нужна помощь

есть табличка в столбец В вводятся числа, а в столбце D они суммруются, но так, чтобы при вводе каждого нового в В в D отображадлся накопительный итог.
Для двух ячеек я поняла как сделать, вот:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
With Target
If .Address(False, False) = "B2" Then
If IsNumeric(.Value) Then
Application.EnableEvents = False
Range("D2").Value = Range("D2").Value + .Value

Application.EnableEvents = True
End If
End If
End With
End Sub
а для всей колонки - не понимаю

Пожалуйста , подсткажите.. вот тут файлик с примером
Вложения
Тип файла: rar примерчик.rar (6.2 Кб, 64 просмотров)

Последний раз редактировалось Ольга Ларина; 26.01.2010 в 10:56.
Ольга Ларина вне форума Ответить с цитированием
Старый 26.01.2010, 19:11   #2
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Здравствуйте Ольга.
Вашу задачу можно решить подобным кодом:
Код:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    With Target
        If .Column = 2 Then
            If IsNumeric(.Value) Then
                Application.EnableEvents = False
                .Offset(0, 2).Value = .Offset(0, 2).Value + .Value
                Application.EnableEvents = True
            End If
        End If
    End With
End Sub
но применение этой конструкции не может быть использовано для учета чего либо, т.к. не позволяет учесть кол-во изменений в ячейке.
Евгений.
P.S. для удобочитаемости выкладываемый код заключайте в тэги [соde]...[/соde]

Последний раз редактировалось Teslenko_EA; 26.01.2010 в 19:42.
Teslenko_EA вне форума Ответить с цитированием
Старый 27.01.2010, 09:08   #3
Ольга Ларина
Пользователь
 
Регистрация: 26.01.2010
Сообщений: 15
По умолчанию

Teslenko_EA спасибо Вам за помощь. Всё получилось!
Ольга Ларина вне форума Ответить с цитированием
Старый 27.01.2010, 15:03   #4
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Цитата:
Сообщение от Teslenko_EA Посмотреть сообщение
Вашу задачу можно решить подобным кодом
Женя, то же самое делает:
Код:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Application.EnableEvents = False
    Static nVar1 As Integer
       nVar1 = nVar1 + Cells(3, 2)
    [d3] = nVar1
Application.EnableEvents = True
End Sub
З. Ы.
ну не уже ли, так сложно, прокомментировать Static, ну не создавть же новую тему??
valerij вне форума Ответить с цитированием
Старый 27.01.2010, 15:43   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Сообщение от valerij Посмотреть сообщение
ну не уже ли, так сложно, прокомментировать Static, ну не создавть же новую тему??
Валера, а что надо прокомментировать?
Что такое Static, и для чего используется?
Так для этого совсем необязательно создавать тему на форуме.
Достаточно потратить несколько секунд на поиск в Google или Yandex:

Цитата:
Visual Basic дает возможность объявлять переменные как статические. При выходе из процедуры содержимое статической переменной сохраняется. При новом вызове этой процедуры переменной присваивается значение, которое она имела при последнем выходе из этой процедуры. Содержимое переменной сохраняется в течение всего времени, пока существует в памяти форма или модуль.

Объявление переменной как статической производится оператором:

Static <Имя_переменной> [As <Тип_переменной>]

Чтобы объявить статическими все локальные переменные процедуры, следует записать ключевое слово Static в заголовке процедуры.

Полное описание общей процедуры выглядит следующим образом:

Код:
<ОбластьВидимости>] [Static] Sub <имяПроцедуры>
(<Списокпараметров>)
<Операторы>
End Sub
Область видимости — это одно из двух ключевых слов Public или Private. Они устанавливают, к какому классу принадлежит процедура: к классу локальных или классу глобальных процедур. Процедура локальная (Private), если она доступна (видна) только внутри данного модуля и не может быть вызвана из других модулей. Процедура глобальная (Public), если она доступна (видна) из других модулей.

Наличие или отсутствие ключевого слова Static говорит о статусе локальных переменных, т. ё. переменных, объявленных внутри этой процедуры. При наличии этого слова локальные переменные будут сохранять свои значения между Последовательными вызовами этой процедуры. При отсутствии слова Static — не будут.
EducatedFool вне форума Ответить с цитированием
Старый 27.01.2010, 15:53   #6
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
а что надо прокомментировать?
Почему ее, ни где, практически не применяют, ведь она удобна.
По крайней мере у нас на форуме, я ее никогда не видел и не знал о ней, пока не гуглил где то...
valerij вне форума Ответить с цитированием
Старый 27.01.2010, 18:09   #7
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Здравствуйте Валерий.
для решения задачи "..при вводе каждого нового в В в D отображадлся накопительный итог..", "..то же самое.." - но с применением Static не самое лучшее решение, скорее даже неприемлемое учитывая количество строк листа Excel 2007.
Евгений.
Teslenko_EA вне форума Ответить с цитированием
Старый 27.01.2010, 18:23   #8
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Цитата:
Сообщение от Teslenko_EA Посмотреть сообщение
но с применением Static не самое лучшее решение, скорее даже неприемлемое учитывая количество строк листа Excel 2007..
Здравствуйте, Женя!
Поясните, причем здесь "количество строк листа Excel 2007"?
Переменной, какая разница?
valerij вне форума Ответить с цитированием
Старый 27.01.2010, 21:11   #9
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Поясняю:
Ваша конструкция nVar1 = nVar1 + Cells(3, 2) - добавляет в переменную значение ячейки третьей строки колонки B. Переменных для "..каждого нового в В.." т.е. для всех новых строк будет много.....
Евгений.

Последний раз редактировалось Teslenko_EA; 27.01.2010 в 21:13.
Teslenko_EA вне форума Ответить с цитированием
Старый 28.01.2010, 14:51   #10
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Цитата:
Сообщение от Teslenko_EA Посмотреть сообщение
Поясняю:...Ваша конструкция .
Женя, та для этого, конкретного примера, она конечно не нужна, я говорю о том, что удобно сохранять промеж результаты в переменной, такого типа, нежели в ячейках, а это не есть хорошо:
Код:
If [a21] = 1 Then [s3] =  Application.Sum([F3:F33])
' Где [s3] как промежуточное, временное значение
Так же правильней?
Код:
Static nVar1 As Integer
If [a21] = 1 Then nVar1  =  Application.Sum([F3:F33])
valerij вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ячейка с текстом, ячейка без текста. segail Microsoft Office Excel 5 16.09.2009 21:55
Защищаемая ячейка hamlook Microsoft Office Excel 4 15.06.2009 21:31
Линия тренда в гистограмме с накоплением Svett Microsoft Office Excel 1 18.08.2008 21:54