Страницы: 1
RSS
Сумма двух разных ячеек в разных листах книги кликом мыши
 
Уважаемые Гуру Экселя, просветите, пожста
Есть книга, и на каждом листе таблицы, мне нужно выделением ячейки мышкой суммировать любые ячейки любых страниц, чтобы рез-т был внизу на экране..

ТО есть как на одном листе, то надобно волшебство, чтоб перепрыгивать на страницы и добавлять к выделенной..

Только ловкостью рук..

Плиз хелп
 
Неужели невозможное так и остается невозможным...
 
Смотрите в чём прикол - строка снизу показывает сумму выделенных ячеек, а при сменен листа выделение "слетает".

Теоретически можно убиться и написать макрос, который будет при переходе с листа на лист сохранять сведения о сумме выделенных ячеек и будет учитывать его при суммировании (да-да, суммирование придётся делать вручную и результат выводить вместо стандартного интерфейса), но при дальнейших переходах в какой-то момент я вернусь на лист2 и окажется, что этот лист у меня уже учтён и его нужно будет как-то вычесть из общей суммы (точнее, похоже, нужно будет отдельно хранить сведения о сумме ячеек, выделенных на каждом листе). А как мне отличать те ячейки, которые вы хотите суммировать от ячеек, которые просто так выделены? (на листе же всегда активна какая-то ячейка).

Короче говоря там очень много мороки и сделать красивое универсальное решение будет очень сложно.
Я не волшебник, я только учусь.
 
Wiss, спасибо большое, что уделили внимание моему вопросу.
Фишка в том. что как то один раз это получилось, и нас было двое ) поэтому это был не глюк, второй раз не получилось повторить

Жаль, думала, что это просто сочетание клавиш, о которых я не знаю, и не смогла найти
 
Цитата
sinergy-s написал:
Теоретически можно убиться и написать макрос, который будет при переходе с листа на лист сохранять сведения о сумме выделенных ячеек
ну допустим это можно заменить проходом по всем листам и суммированием выделенных диапазонов, только надо учесть что выделить диапазон можно дважды и от этого сумма не должна меняться. Вот куда выводить и по какому событию - вопрос.

sinergy-s,  вы не путаете с вводом формулы =SUM(Sheet1:Sheet2!A1)
А не в Open/Libre Сalc у вас это получалось?
Изменено: БМВ - 15.05.2018 17:50:23
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
ну допустим...
ХМ... вы водить - то можно в application.StatusBar, просто он свою функциональность потеряет...
Код
Option Explicit

Public tmpSum As Long

Private Sub Workbook_SheetActivate(ByVal Sh As Object)

    Dim shX As Worksheet
    Dim X As Double
    
    
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    tmpSum = 0
    
    For Each shX In ThisWorkbook.Worksheets
        If shX.Visible = xlSheetVisible And shX.Name <> Sh.Name Then
            shX.Activate
            tmpSum = tmpSum + Application.WorksheetFunction.Sum(Selection)
        End If
            
    Next shX
    
    Sh.Activate
    
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    
    Application.StatusBar = tmpSum + Application.WorksheetFunction.Sum(Selection)
End Sub


Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    Application.StatusBar = tmpSum + Application.WorksheetFunction.Sum(Selection)
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Application.StatusBar = False
End Sub

Вводить прямо в код книги
Изменено: Wiss - 16.05.2018 09:05:34
Я не волшебник, я только учусь.
 
Цитата
sinergy-s написал:
как то один раз это получилось, и нас было двое )
Это замечательно! :)  
Изменено: skiv17 - 15.05.2018 21:54:17
 
Цитата
БМВ написал:
Вот куда выводить и по какому событию - вопрос.
Здравствуйте, Михаил! Немодальная форма?
Уважаемый Wiss! В макросе из #6 не учтены замечания из #5 о повторном выделении ячеек. Кроме того, сумма должна иметь тип Double.
Владимир
 
sokol92, да, с Double косяк (исправил). Привык к целым числам. Про повторное выделение не понял чуть больше чем совсем. Откуда там повторное? При каждом переходе с листа на лист пересчитывается сумма выделенных ячеек на всех всех листах, кроме активного. Сумма активного листа пересчитывается при каждой смене выделения. Дублей быть не должно.
Или я чего-то не учёл?

Не учёл. Думаю
Изменено: Wiss - 16.05.2018 09:10:43
Я не волшебник, я только учусь.
 
Переделал. Загнал все значения с листа в словарь, так что пришлось поставить ограничение количества выделенных ячеек в 100000.

А можно как-то "изящно" избавиться от пересечения диапазонов?
Код
Option Explicit
 
Public tmpSum As Long
Public shIsCounted As Boolean
Const MaxCells = 100000
 
Private Sub Workbook_SheetActivate(ByVal sh As Object)
    getAllShSum
    
    If shIsCounted Then
        On Error Resume Next
        If Selection.Cells.Count > MaxCells Then
           Application.StatusBar = "Выделено больше " & MaxCells & " ячеек"
           Exit Sub
        End If
        On Error GoTo 0
        
        Application.StatusBar = tmpSum + getActShSum
    End If
End Sub
 
Private Sub Workbook_SheetSelectionChange(ByVal sh As Object, ByVal Target As Range)
    Dim aShSum As Double
    Dim c As Range
    
    If shIsCounted Then
        On Error Resume Next
        If Selection.Cells.Count > MaxCells Then
           Application.StatusBar = "Выделено больше " & MaxCells & " ячеек"
           Exit Sub
        End If
        On Error GoTo 0
        
        Application.StatusBar = tmpSum + getActShSum
    Else
        getAllShSum
        
        If shIsCounted Then
            Application.StatusBar = tmpSum + getActShSum
        End If
    End If
End Sub

Sub getAllShSum()
    Dim sh As Worksheet
    Dim shX As Worksheet
    Dim X As Double
    Dim c As Range
    Dim aShSum As Double
     
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    tmpSum = 0
    shIsCounted = False
     
    Set sh = ActiveSheet
    
    For Each shX In ThisWorkbook.Worksheets
        If shX.Visible = xlSheetVisible And shX.Name <> sh.Name Then
            shX.Activate
            On Error Resume Next
            If Selection.Cells.Count > MaxCells Then
                Application.StatusBar = "На листе """ & shX.Name & """ выделено больше " & MaxCells & " ячеек"
                sh.Activate
                Application.ScreenUpdating = True
                Application.EnableEvents = True
                Exit Sub
            End If
        On Error GoTo 0
            tmpSum = tmpSum + getActShSum
        End If
    Next shX
     
    shIsCounted = True
    sh.Activate
     
    Application.ScreenUpdating = True
    Application.EnableEvents = True

End Sub
 
Function getActShSum() As Double
    Dim aShSum As Double
    Dim c As Range
    
    On Error Resume Next
    If Selection.Cells.Count > MaxCells Then
       getActShSum = 0
       Exit Function
    End If
    On Error GoTo 0
    
    With CreateObject("scripting.Dictionary")
        .Item(0) = 0
        For Each c In Selection.Cells
            If IsNumeric(c.Value) And c.Value <> 0 Then .Item(c.Row & "," & c.Column) = c.Value
        Next c
        aShSum = aShSum + Application.WorksheetFunction.Sum(.items)
    End With
    
    getActShSum = aShSum
End Function

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Application.StatusBar = False
End Sub
Изменено: Wiss - 16.05.2018 10:22:18
Я не волшебник, я только учусь.
 
Уважаемый Wiss! Спасибо! "Изящное" избавление от пересечения диапазонов обсуждалось (на форуме, в личной переписке), универсальное решение пока, насколько я знаю, не найдено.
Владимир
 
sokol92,  Владимир  intersect(selection,selection) не прокатит? :-)

?selection.address
$F$4,$H$4,$H$4,$F$4,$F$6,$H$6,$F$8,$H$8,$H$6,$F$6,$H$8,$H$4,$F$8,$F$4,$H$6
$E$3,$E$3,$G$4,$E$3,$G$4
?intersect(selection,selection).Address
$F$6,$H$8,$H$4,$F$8,$F$4,$H$6

?selection.address
$F$3:$G$7,$G$3:$H$7,$H$3:$I$7
?intersect(selection,selection).Address
$F$3:$I$7
Изменено: БМВ - 16.05.2018 11:08:23
По вопросам из тем форума, личку не читаю.
 
sokol92, это Вам спасибо, что на ошибку указали.

З.Ы. "Уважаемый" это уже перебор. Я еле-еле привык к тому, что в этой части интернета общаются на "Вы", а тут ещё и "уважаемый". Тем более, что полезность написанного мной кода крайне сомнительна.
Я не волшебник, я только учусь.
 
Цитата
БМВ написал:
Владимир  intersect(selection,selection) не прокатит? :-)
Здравствуйте, Михаил! Этот метод рассматривался (как и Union). Он справляется со случаями, когда одна область диапазона содержится внутри другой, но с частичным пересечением ему сложно.
Код
Option Explicit
Sub ShowRange(ByVal rg As Range)

  Dim r As Range

  Debug.Print "Областей " & rg.Areas.Count, "Ячеек " & rg.Cells.Count
  
  For Each r In rg.Areas
    Debug.Print r.Address
  Next r

End Sub

Sub test()

  Dim r As Range
  
  Set r = Range("A1:A3,A2:B2")
  ShowRange r
  
  r.Select
  ShowRange Union(Selection, Selection)

  ShowRange Intersect(Selection, Selection)

End Sub

Владимир (ZVI) предложил очень "хитрый" метод с использованием SpecialCells, но, например, диапазон  Range("A1:A8192,A2:B2" ) пока остается непобежденным.
Изменено: sokol92 - 16.05.2018 11:36:47
Владимир
 
Цитата
Wiss написал:
"Уважаемый" это уже перебор.
Коллега, если Вы опубликуете имя, то я с удовольствием буду обращаться по имени.
Владимир
 
БМВ, не поможет. Пробовал до того как словарь использовать

Создал отдельную тему про суммирование несвязанного диапазона.
https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=1&TID=104727&a...
Я не волшебник, я только учусь.
 
Wiss, sokol92,  ну как не макрушнику мне ошибится не стыдно, тем более на лету прикинул, особенно не тестировал :-) , признаю работает но не 100%, а когда это так, то значит не работает.
Изменено: БМВ - 16.05.2018 12:12:51
По вопросам из тем форума, личку не читаю.
 
Общий алгоритм решения понятен: загнать адреса областей в массив и далее исключать пересечения (подразбиением). При этом хорошо бы минимизировать число областей результата, тем более, что есть технические ограничения на Areas.Count. Правда, "изящным" это не назовешь. Посмотрим, что будет в новой теме...
Владимир
Страницы: 1
Наверх