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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 08.07.2008, 05:24   #71
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

1) Я не знаю, о чем речь, но разберитесь в различных событиях, что Вам конкретно требуется в тот или иной момент.
2) Если у Вас не кратное приращение от одного дня до другого, то можно попробовать найти формулу этого приращения (если, конечно есть закономерность). Если нет - использовать табличные значения, которые где-нибудь должны быть записаны (в коде макроса, либо на рабочем листе).
Чем шире угол зрения, тем он тупее.
SAS888 вне форума
Старый 08.07.2008, 11:13   #72
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Цитата:
Сообщение от SAS888 Посмотреть сообщение
1) что Вам конкретно требуется в тот или иной момент.
SAS!
Я же подробно в №67 и далее №69 описал. Не понимаю в чем разница:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Private Sub Worksheet_Activate()
Цитата:
2) Если у Вас не кратное приращение от одного дня до другого, то можно попробовать найти формулу этого приращения .
Сделал, но так
Код:
For oStat = 0 To 30
Cells(39, 6) = Cells(38, 6)
If oStat <> 0 Then
Cells(oStat * 48 + 39, 6) = Cells(oStat * 48 + 38, 6) + Cells(oStat * 48 - 9, 6) 
End If
Next oStat
(\__/)
(='.'=)
E[:]|||[:]З
(")_(")
valerij вне форума
Старый 08.07.2008, 11:42   #73
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Private Sub Worksheet_Change(ByVal Target As Excel.Range) - Это событие изменения значения любой ячейки (где Target - адрес ячейки).
Private Sub Worksheet_Activate() - Это событие активации листа.
Определитесь, при наступлении какого события Вы хотите запускать выполнение кода.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума
Старый 08.07.2008, 12:08   #74
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Цитата:
Сообщение от SAS888 Посмотреть сообщение
Private Sub Worksheet_Change(ByVal Target As Excel.Range) - Это событие изменения значения любой ячейки (где Target - адрес ячейки).
Private Sub Worksheet_Activate() - Это событие активации листа.
Ага, понял, понял.
valerij вне форума
Старый 15.07.2008, 01:33   #75
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Цитата:
Сообщение от SAS888 Посмотреть сообщение
Определитесь, при наступлении какого события Вы хотите запускать выполнение кода.
SAS!
А как быть, если одно событие происходит при вводе данных, а другое событие при активации листа и все это происходит в одном листе, вот пример:
Код:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim cSum2 As Long, cSum3 As Long
With Application
    .EnableEvents = False
        For i = 7 To 37
            cSum2 = cSum2 + Cells(i, 2)
            cSum3 = cSum3 + Cells(i, 3)
                Next i
            Cells(38, 2) = cSum2
            Cells(38, 3) = cSum3
'Данные вводятся в [B7:C37] и суммируюся в Cells(39, 2) а значение _
в Cells(37, 4) зависят от данных с других Листов
        Cells(39, 2) = Cells(38, 2) + Cells(38, 3)
        Cells(39, 3) = Cells(39, 2) - Cells(37, 4)
    .EnableEvents = True
    End With
End Sub
Private Sub Worksheet_Activate()
-------------- КОД ---------------
    Cells(39, 3) = Cells(39, 2) - Cells(37, 4)
    .EnableEvents = True
    .ScreenUpdating = True
    End With
End Sub
Если я закомментирую №21, то значение в №15 не меняется, пока не введу в [B7:C37], хоть ноль, а если комментирую наоборот, то пока не перещелкну листы, значение тоже не меняется, а вот так, как есть, все работает, не ужели двойная запись должна быть?

Последний раз редактировалось valerij; 15.07.2008 в 01:50.
valerij вне форума
Старый 15.07.2008, 05:07   #76
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Чтобы не писать один и тот же код дважды, целесообразно создать отдельный макрос. Тогда в дальнейшем, его можно вызывать из любой процедуры.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума
Старый 15.07.2008, 09:19   #77
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Цитата:
Сообщение от SAS888 Посмотреть сообщение
Чтобы не писать один и тот же код дважды, целесообразно создать отдельный макрос. Тогда в дальнейшем, его можно вызывать из любой процедуры.
Я делал так, результат тот же. Т. е. создал модуль в нем:
Sub zxc()
Cells(39, 3) = Cells(39, 2) - Cells(37, 4)

И "run zxc" , то же дважды

SAS
Я на завтра подготовлю вложение, бо так, я, наврядли пойму.

Последний раз редактировалось valerij; 15.07.2008 в 23:07.
valerij вне форума
Старый 16.07.2008, 01:22   #78
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

SAS!
Вот, прикрепил.
Еще, я вынес(в прищепке нет) в отдельный модуль, лист "ОБЩИЙ" и запускаю его из "ЭтаКнига", так:
Код:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range)
   Select Case Sh.Index
        Case 1 To 13
'-------- Код ------------------------------------------------
End Select
   Run "zz" 'Запуск лист "ОБЩИЙ" 
End Sub
Но этот модуль будет срабатывать при каждом вводе данных, а так теряется время. Как сделать, что бы Run "zz" запускался только при переключении листов?

Как упростить модуль zz(), я имею ввиду Sheets(15), часто повторяется?

Код:
Sub zz()
        For iL = 1 To 13 'Сбор данных по 13 листам
        With Sheets(iL)
            Sheets(15).Cells(iL + 2, 2) = .Cells(1479, 6) '.Value 'Х-з получено
            Sheets(15).Cells(iL + 2, 3) = .Cells(1479, 11) '.Value 'Х-з доставка
            Sheets(15).Cells(iL + 2, 4) = .Cells(1479, 12) '.Value 'Сумма реализации(ст.L)
                If iL < 9 Then
        For pEri = 41 To 1481 Step 48
            kAs(iL) = kAs(iL) + .Cells(pEri, 8).Value 'Касса
            mEs(iL) = mEs(iL) + .Cells(pEri + 1, 8).Value 'Местовое
            zPl(iL) = zPl(iL) + .Cells(pEri + 2, 8).Value 'Зар_платы
            uZe(iL) = uZe(iL) + .Cells(pEri + 3, 8).Value 'Уценка
            pRo(iL) = pRo(iL) + .Cells(pEri + 4, 8).Value 'Прочие
            Next
            Sheets(15).Cells(iL + 2, 5) = kAs(iL) 'Касса
            Sheets(15).Cells(iL + 2, 6) = .Cells(1482, 9).Value 'Прибыль
            Sheets(15).Cells(iL + 2, 7) = .Cells(1487, 8).Value 'Остатки
            Sheets(15).Cells(iL + 2, 8) = zPl(iL) 'Зар_платы
            Sheets(15).Cells(iL + 2, 9) = mEs(iL) 'Местовое
            Sheets(15).Cells(iL + 2, 10) = uZe(iL) 'Уценка
            Sheets(15).Cells(iL + 2, 11) = pRo(iL) 'Прочие
            Else
            Sheets(15).Cells(iL + 2, 5) = .Cells(1479, 8).Value 'Касса
            Sheets(15).Cells(iL + 2, 6) = .Cells(1479, 1).Value 'Прибыль
                End If
        End With
        Next iL
End Sub
Ну а в прищепке, лист "БАНК", пока для меня, загадка!
Все пояснение в аттаче.
Вложения
Тип файла: rar Z1.rar (76.8 Кб, 15 просмотров)
valerij вне форума
Старый 16.07.2008, 05:03   #79
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

1) Если нужно, чтобы макрос запускался при переключении листов книги, команду его запуска нужно поместить в модуль эта книга по событию Workbook_SheetActivate, т.е. так:
Код:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    Run "zz"
End Sub
2) Можно упростить написание кода, использовав метод Select (т.к. With уже используется как ссылка на лист). Т.е. в начале макроса выполнить Sheets(15).Select, далее в коде ссылку на лист можно опустить. Тогда в конце кода нужно будет осуществить переход на требуемый лист (снова Sheets(xx).Select). Но быстрее от этого макрос выполняться не будет. Лучше, на время выполнения макроса запретить обновление экрана (Application.ScreenUpdating = False) и определить переменные (и константы, если они есть) при помощи Dim. Вот это даст некоторый выигрыш.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума
Старый 16.07.2008, 10:23   #80
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Цитата:
Сообщение от SAS888 Посмотреть сообщение
1) Если нужно, чтобы макрос запускался при переключении листов книги, команду его запуска нужно поместить в модуль эта книга по событию Workbook_SheetActivate, т.е. так:
2) Лучше, на время выполнения макроса запретить обновление экрана (Application.ScreenUpdating = False) и определить переменные (и константы, если они есть) при помощи Dim. Вот это даст некоторый выигрыш.
1. Все ОК!!
2. Да, конечно, определины переменные при помощи Dim, что бы показать основной вопрос, пропустил все.
А от ScreenUpdating пришлось отказаться, дергается экран.
Почему так, везде ScreenUpdating, у меня, отключен.
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