Страницы: 1
RSS
Вычисление на листе, при изменении только выбранных столбцов.
 
Я уже создавал тему по вопросу вычисления в отдельных столбца - Огромное спасибо за мопощь, использовал рекомендации от Казанский - [A:B].calculate (для пересчета ст. А и В текущего листа.
 
Теперь стоит вопрос в другом.  
При активации листа у меня срабатывает макрос вычисления в столбцах А,В, как описал выше.  
Но, к тому же там работает макрос на вычисления при изменении любой ячейки, и получается так, что при активации листа вычисление запускается два раза - не порядок.  
Скажите, как произвести вычисление, если изменения были НЕ в любой ячейке, а скажем в ячейках столбцов С,D,E, или в любых кроме А и В?
 
> там работает макрос на вычисления при изменении любой ячейки  
Вы имеете в виду Private Sub Worksheet_Change(ByVal Target As Range)?  
Он не запускается при пересчете ячеек, а только при изменении ячеек вручную или макросом.  
Для очистки совести отключите события на время пересчета:  
 
Private Sub Worksheet_Activate()  
Application.EnableEvents = False  
[A:B].Calculate
Application.EnableEvents = True  
End Sub  
 
> как произвести вычисление, если изменения были НЕ в любой ячейке, а скажем в ячейках столбцов С,D,E, или в любых кроме А и В?  
Для С,D,E:  
 
Private Sub Worksheet_Change(ByVal Target As Range)  
If Not Intersect(Target, [C:E]) Is Nothing Then Me.Calculate
End Sub
 
Использовал макрос    
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)  
If Sh.Name = "Услуги" Or Sh.Name = "Оплаты" Or Sh.Name = "Бартер" Then  
  Sh.Calculate  
       With Application  
           .Calculation = xlManual  
           .MaxChange = 0.001  
       End With  
End If  
 
End Sub  
 
 
К тому же есть макрос    
Private Sub Workbook_SheetActivate(ByVal Sh As Object)  
 
   If (Sh.Name = "Услуги" Or Sh.Name = "Оплаты" Or Sh.Name = "Бартер") Then  
   Range("A6:A20000").ClearContents  
   Worksheets("Клиенты").Range("B4:B20000").Copy  
   Range("A6").Select  
   Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _  
       :=True, Transpose:=False  
   Application.CutCopyMode = False  
   Selection.Sort Key1:=Range("A6"), Order1:=xlAscending, Header:=xlGuess, _  
       OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _  
       DataOption1:=xlSortNormal  
   Range("A3").Select  
   End If  
   If Sh.Name = "Расчет" Then  
   [A:B].Calculate
   End If  
End Sub  
 
Получалось так, что макрос Private Sub Workbook_SheetActivate(ByVal Sh As Object) при активации делал свое дело, а макрос Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) на это реагировал и запускал вычесление, то на даном этапе мне не нужно...  
 
Сейчас я изменил макрос реагирующий на изменения  
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)  
If (Sh.Name = "Услуги" Or Sh.Name = "Оплаты" Or Sh.Name = "Бартер") And _  
   Target.Column > 1 Then  
       Sh.Calculate  
       With Application  
           .Calculation = xlManual  
           .MaxChange = 0.001  
       End With  
End If  
 
If Sh.Name = "Клиенты" Or Sh.Name = "Итог" Then  
Sh.Calculate  
With Application  
.Calculation = xlManual  
.MaxChange = 0.001  
End With  
End If  
End Sub  
 
Таким образом я ушел от риагирования изменений в первом столбце. Дальше в процессе работы пользователем он не используется (свернут).  
 
Может все это криво, но работает.  Я пошел путем использования одного макроса для всех листов, а не каждому листу по макросу. :)  
 
Но, все равно - БОЛЬШОЕ Вам спасибо!
Страницы: 1
Читают тему
Наверх