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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.06.2009, 20:37   #1
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию Как получить измененные ячейки в VBA?

Как получить в Excel названия измененных (и удаленных) ячеек в переменную VBA? Типа события OnChange, OnDelete
motorway вне форума Ответить с цитированием
Старый 28.06.2009, 20:48   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Как-то так:
Код:
Dim АдресаИзменённыхЯчеек As String

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim cell As Range
    For Each cell In Target.Cells
        If Not InStr(1, АдресаИзменённыхЯчеек, cell.Address) Then
            АдресаИзменённыхЯчеек = АдресаИзменённыхЯчеек & cell.Address & ", "
        End If
    Next cell
    Debug.Print АдресаИзменённыхЯчеек
End Sub
Результат:
Цитата:
$C$5,
$C$5, $C$8,
$C$5, $C$8, $B$10,
$C$5, $C$8, $B$10, $B$14, $C$14, $B$15, $C$15, $B$16, $C$16,
EducatedFool вне форума Ответить с цитированием
Старый 28.06.2009, 21:10   #3
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Попробую разобраться в коде, но для удаления столбцов и, думаю, строк он не подходит - начинает зависать. Спасибо
motorway вне форума Ответить с цитированием
Старый 28.06.2009, 22:56   #4
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

У меня задача - записать в таблицу БД все данные с экселевского листа. Но обычно он заполнен лишь на малый процент. Поэтому нет смысла писать весь лист, каждую ячейку. Наверно, нужно определить границы, где находится последняя заполненная ячейка, а дальше пусто? Как это лучше сделать?
motorway вне форума Ответить с цитированием
Старый 28.06.2009, 23:13   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Сделать всё это совсем несложно.
Только объясните подробнее, чего Вы пытаетесь добиться (желательно с примером файла)

Тем более, если надо записать с листа в БД все данные, то и отслеживать изменения не вижу смысла.

Кстати, я тут как-то делал уже такой макрос - который помечает цветом строки, в которых произошли изменения. (Вам осталось только найти тот пример на форуме)
Потом в базу данных заносятся только эти цветные строки.

Можно, конечно, записывать данные и в переменную, но это менее надёжно - если макрос вылетит с ошибкой (любой), все переменные обнулятся. А цвет строк точно не скинется ни при каких обстоятельствах.
EducatedFool вне форума Ответить с цитированием
Старый 28.06.2009, 23:24   #6
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Добиться хочу следующего: есть некий файл в Экселе. В нем какие-то данные - значения, формулы, а по бокам - текстовые названия колонок и строк. Предполагается, что эти данные будут посылаться на сервер в Интернете, чтобы потом пользователи могли нажимать на кнопку "Загрузить данные из БД", чтобы увидеть изменения, внесенные другими пользователями.
То есть БД делается для того, чтобы была многопользовательская работа, и каждый мог загрузить из нее текущую версию файла. Далее пользователь вводит что-то и посылает на сервер скрипту, который возвращает результаты в таблицу. Далее опять можно сохранить это в БД.
Вот поэтому у меня вопрос: записать-то можно все данные, но так как в Экселе огромный лист (миллион строк), то понятно, что все записывать не надо. Нужно только то, где есть последние данные, которые ограничивают рабочую область листа. Да и здесь лучше записывать только то, что изменилось, а не перезаписывать то же самое.
motorway вне форума Ответить с цитированием
Старый 01.07.2009, 18:09   #7
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Проблема еще одна: как сделать, чтобы при удалении или добавлении строки/столбца формулы в примечаниях менялись автоматически? Когда в самой ячейке, то они меняются, а так нет. Для начала нужно понять, как отлавливать событие добавления или удаления строки/столбца, и сразу вызывать по нему какую-то функцию.
motorway вне форума Ответить с цитированием
Старый 01.07.2009, 23:35   #8
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
как сделать, чтобы при удалении или добавлении строки/столбца формулы в примечаниях менялись автоматически?
А что, разве Excel позволяет вставлять формулы в примечания?
Что-то новенькое...

Цитата:
Для начала нужно понять, как отлавливать событие добавления или удаления строки/столбца, и сразу вызывать по нему какую-то функцию.
Да очень просто:
Код:
Private Sub Worksheet_Change(ByVal Target As Range)
    MsgBox Target.Address
End Sub
При вставке столбцов/строк этот код сообщит Вам адрес вставленного диапазона.
Проанализировав этот адрес, можно узнать, что именно было вставлено - строка или столбец:
Код:
Private Sub Worksheet_Change(ByVal Target As Range)
    addr = "Изменения в диапазоне  " & Target.Address

    Select Case True
        Case Target.Columns(1).Cells.Count = Rows.Count
            msg = "Добавлено столбцов:  " & Target.Cells.Count / Rows.Count
        Case Target.Rows(1).Cells.Count = Columns.Count
            msg = "Добавлено строк:  " & Target.Cells.Count / Columns.Count
        Case Else:    '  изменилось что-то другое
    End Select
    If Len(msg) Then MsgBox msg, vbInformation, addr
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 14.07.2009, 22:34   #9
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Посмотрел еще раз Ваш код. Но он работает одинаково в случае добавления/удаления столбцов или строк и все время пишет "добавлено...". А мне нужно как-то узнавать, что именно было сделано и где. Понятно, что основная идея в сравнении прошлого числа колонок/строк с нынешним. Но как это конкретно реализовать?

Мне нужно сделать, чтобы внутри обработчика события определялось, что было сделано - удаление/добавление строк или столбцов, и чтобы следующий код вызывался только при этом событии, а не просто изменении листа.

Последний раз редактировалось motorway; 14.07.2009 в 22:36.
motorway вне форума Ответить с цитированием
Старый 15.07.2009, 05:13   #10
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Если речь идет только об удалении (добавлении) строк (столбцов, ячеек), то можно перехватывать по номеру ID эти события и назначать свою, какую угодно процедуру. Например, перед тем, как удалить строку (столбец), присваивать переменной адрес этого диапазона. Естественно, при деактивации книги нужно отменять назначенные процедуры.
Если так устроит - могу сделать.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить копию ячейки вместе с форматом olimpus Microsoft Office Excel 7 11.04.2009 12:33
получить текст из заданной ячейки DbGrid furstenberg Компоненты Delphi 12 02.04.2009 00:54
Как удалять ячейки с помощью VBA Рома_Чайник Microsoft Office Excel 4 16.02.2009 11:31
Как средствами VBA получить доменное имя пользователя? Прохожий Microsoft Office Excel 3 04.10.2008 18:28