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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 03.06.2008, 12:26   #1
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию Мой первый макрос

Мой первый макрос, без всяких подсказок, независимый ввод данных в Н1 и В1, для всей книги.
Пожалуйста, Ваше мнение!
Какие ошибки я допустил, вообщем ......?

Код:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range)
With Application
    .ScreenUpdating = False
    .EnableEvents = False
        Range("H1").Select
a = ActiveCell.Value
        Range("B1").Select
b = ActiveCell.Value
        Sum = a + b
        Range("A1").Value = Sum
        Range("A1").Activate ' Не совсем понимаю этот пункт, без него тоже работает
        Range("H1").Select
    .EnableEvents = True
    .ScreenUpdating = True
    End With
End Sub
valerij вне форума
Старый 03.06.2008, 13:30   #2
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Мужики, ну че Вы молчите!
Самому прилежному ученику........, учителя, молчат!!
valerij вне форума
Старый 03.06.2008, 13:34   #3
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Если я правильно понял, то нужно чтобы происходило суммирование ячеек "B1" и "H1", при изменении значения любой ячейки.
Можно чуть проще:
Код:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range)

    Application.EnableEvents = False
    Range("A1") = Range("H1") + Range("B1")
    Application.EnableEvents = True
        
End Sub
Но зачем эту процедуру выполнять, если значения влияющих на результат ячеек не меняется? Рациональнее проводить какие-либо операции при изменении именно этих ячеек. Например, так:
Код:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range)

    If Target.Address = Range("B1").Address Or Target.Address = Range("H1").Address Then _
    Range("A1") = Range("H1") + Range("B1")
        
End Sub
Отключение обработки событий не отключаем, т.к. не трогаем ячейки, вызывающие событие.
На будущее: По-возможности не используйте методы Select и Activate - это тормозит. А также при использовании переменных (констант) - присвойте тип этих переменных. Это тоже экономит и время и память.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума
Старый 03.06.2008, 13:39   #4
VictorM
Старожил
 
Аватар для VictorM
 
Регистрация: 15.05.2008
Сообщений: 2,058
По умолчанию

Цитата:
Range("A1").Activate ' Не совсем понимаю этот пункт, без него тоже работает
Ячейка А1.Активировать. В данном случае строка не нужна, если только не для того, чтобы специально обратить на ячейку внимание.
А для чего он предназначен, это макрос?
Что будет делать в "реальных условиях"?
"Дайте людям рыбы, и вы накормите их на весь день; научите их ловить рыбу - и вы накормите их на всю жизнь"
"Большое спасибо" - Z261597841314, R208907249777, U447361470499
VictorM вне форума
Старый 03.06.2008, 13:54   #5
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Цитата:
Сообщение от SAS888 Посмотреть сообщение
Если я правильно понял, то нужно чтобы происходило суммирование ячеек "B1" и "H1", при изменении значения любой ячейки.
Так точно
Цитата:
Можно чуть проще:.
Понял!
Цитата:
Но зачем эту процедуру выполнять, если значения влияющих на результат ячеек не меняется?
В "B1" и "H1" значение меняется
Цитата:
А также при использовании переменных (констант) - присвойте тип этих переменных. Это тоже экономит и время и память.
Я думал, что Dim, используется только для массивов или это не ТО!
Цитата:
Сообщение от VictorM
А для чего он предназначен, это макрос?.
Да, просто учусь.
valerij вне форума
Старый 03.06.2008, 13:57   #6
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
В "B1" и "H1" значение меняется
Про это я и говорю. Мой второй макрос выполняет сложение только тогда, когда меняется значение именно в одной из этих ячеек (а не других).
Цитата:
Я думал, что Dim, используется только для массивов
Как раз для массивов можно (но не нужно) не использовать описание, т.к. по умолчанию - тип Variant.
Чем шире угол зрения, тем он тупее.

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

Цитата:
Сообщение от SAS888 Посмотреть сообщение
Про это я и говорю.
А про Dim?
valerij вне форума
Старый 03.06.2008, 14:03   #8
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Посмотрите примеры различных макросов на нашем форуме и обратите внимание на описание типов. Думаю, все будет понятно.

Кстати, в нашем примере возможно возникновение ошибки при попытке сложения несовместимых типов значений. Это можно контролировать макросом.
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 03.06.2008 в 14:07. Причина: Добавлено
SAS888 вне форума
Старый 03.06.2008, 14:05   #9
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Ошибка №1 - не стоило начинать писать макросы))

с точки зрение упростить немного строк, не меняя сути я бы сделал так:
Код:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range)   
With Application   
    .ScreenUpdating = False   
    .EnableEvents = False   
        a = Range("H1").Value   
        b = Range("B1").Value   
        Sum = a + b   
        Range("A1").Value = Sum   
        'Range("A1").Activate ' Не совсем понимаю этот пункт, без него тоже работает   
        Range("H1").Select   
    .EnableEvents = True   
    .ScreenUpdating = True   
    End With   
End Sub
это чтобы не менять сути происходящего.

Activate действительно можно закоментировать, а то и выбросить совсем из кода. А последний Select, который Range("H1").Select, может есть смысл заменить на Target.Select?
Меня бы, как пользователя, могло озадачить почему курсор с отмеченой мною ячейки улетел на Н1, тем более, что запрещено обновление экрана, и все приведенные здесь манипуляции могли происходить вообще не в зоне видимости, но если в этом перемещении есть смысл, то конечно, после выполнения макроса, оставлять отмеченной Н1, а не Target.

на первую фразу можно не обращать внимания.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума
Старый 03.06.2008, 14:07   #10
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Цитата:
Сообщение от SAS888 Посмотреть сообщение
и обратите внимание на описание типов.
SAS888
Я имел ввиду "описание типов", Dim и As это разные вещи?
valerij вне форума
Закрытая тема


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MsSQL - первый раз установил майкрософт SQL vados SQL, базы данных 16 19.07.2008 20:01
Первый баг (фото) mutabor Свободное общение 1 06.05.2008 11:51
Вроде на первый взгляд всЁ просто...... Solny6ko YasnoE Помощь студентам 4 17.09.2007 08:23
а первый взгляд просто.. Аlex Win Api 7 05.04.2007 18:34
конкурс программистов ! (первый конкурс) Alar Свободное общение 129 18.03.2007 00:50