Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Excel - sumowanie w stopce danych na stronie

02 Lip 2009 13:40 6438 3
  • Poziom 40  
    Witam
    Tym razem nie wiem jak to ugryźć.

    Mam tabelę w excelu (powiedzmy 100 wierszy z liczbami) które drukują sie na np. 4 stronach. Nie mogę "rozwalić" ciągłości tabeli, więc nie mogę wstawiać dodatkowych wierszy (chyba że tylko na moment wydruku). Docelowo arkusz może mieć zmienną liczbę wierszy z danymi. Innymi słowy potrzebuję uniwersalnego rozwiązania do tzw. papierowego rejestru sprzedaży.

    I teraz główny problem:
    Jak umieścić na każdej stronie (np. w stopce - chyba tak najlepiej lub poprzez dodatkowe chwilowe wiersze) podsumowanie strony (czyli liczb na wydrukowanej stronie oraz ich sumę od początku zestawienia (od wiersza pierwszego na pierwszej stronie)?

    Jakim poleceniem określić wiersze z liczbami znajdujące się na stronie do wydruku (na pierwszej stronie tabela zaczyna się np od 10 wiersza arkusza na pozostałych jest inaczej)? Przy czym nie mam strony na stałe ustawionej. Jeżeli ktoś zmieni marginesy to makro również powinno działać dobrze.

    Samo wprowadzenie danej do stopki nie jest trudne (np na środku stopki)

    Code:
    Sheets(1).PageSetup.CenterFooter = "Suma strony" & sumaS &"|Suma od początku "& sumaSp

    (Oczywiście sumaS i sumaSp docelowo wyjdzie z obliczeń).

    Ale jak określić ile wierszy wejdzie na tą stronę aby je posumować?
    Próbuje coś z
    Code:
    Sheets(1).HPageBreaks
    ale jakoś nie mogę tego ugryźć


    Na marginesie wiem że w accesie to moment ale mi chodzi wyłącznie o excel.

    Dodano po 36 [minuty]:

    Prawdę mówiąc to wystarczy mi w stopce wyłącznie suma narastająco (od pierwszej strony. Ale to nie ma wpływu na pytanie jak określić ilość wierszy na stronie do wydruku.

    Dodano po 31 [minuty]:

    Znalazłem coś takiego:
    Code:
    LiczbaStronWydruku = ExecuteExcel4Macro("Get.Document(50)")

    Działa jeżeli chodzi o liczbę stron wydruku.
    Chociaż nie wiem o co chodzi z tą funkcją ExecuteExcel4Macro i np dlaczego "Get.Document(50)" a nie co innego.
    Teraz pozostaje policzyć wiersze na stronie a z tych wierszy wybrać grupę danych.
  • Moderator Programowanie
    Excel niestety kaleki jest w opcję "suma strony". Też próbowałem swego czasu z hPageBreacks.count i hPageBreacks(n).Location, ale ja swoje a Excel swoje... Sposobu nie znalazłem.

    Jeżeli zmuszony jestem do sumowania stron w przypadku długiej tabeli, to przełączam do widoku "Układ strony", wstawiam wiersz na dole strony i sumuję zakres. Na nst. stronie suma str1+str2 itd.

    Jeżeli tabela jest naprawdę długa, to można napisać makro i wstawiać wiersz z sumowaniem w pętli z krokiem= ilości wierszy na stronie.
  • Poziom 40  
    Tak po przemyśleniu stwierdziłem że w stopce się nie da bo trzeba by było zmieniać stopkę każdej strony a nie mogę znaleźć funkcji odpowiedzialnej za (kierującej na) stopkę danej strony.

    Pomyślałem więc, że zrobię coś takiego.
    Sprawdzę ile jest "złamań" strony.
    Odczytam wiersz złamania i dodam jeden wiersz z sumą od góry do przedostatniej komórki.
    Na kolejnej to samo z sumą z poprzedniej strony itd . W ten sposób bym miał dane narastająco.
    Stworzyłem taki kod:

    Code:
    Sub test()
    
    Dim a As Integer

    a = Sheets("Arkusz4").HPageBreaks.Count
    c = 1

    For x = 1 To a

    b = Sheets("Arkusz4").HPageBreaks(x).Location.Row
    Sheets("Arkusz4").Range(b - 1 & ":" & b - 1).Insert Shift:=xlDown
    Sheets("Arkusz4").Cells(b - 1, 1).Formula = "=SUM(a" & c & ":a" & b - 2 & ")"
    c = b - 1

    Next x

    End Sub


    I tu mam dziwne zachowanie makra (testuje na E2003).

    Wprowadzam tabelę w 1 kolumnie z kolejnymi liczbami na ok 4 strony w dół.
    Makro na ten moment robi wszystko dobrze pod warunkiem, że na ekranie widzę ostatnią stronę. Jeżeli przesunę się "widokiem" na 1 stronę (widzę dane tylko z pierwszej strony) to makro zatrzymuje się po pierwszej pętli na linii
    Code:
    b = Sheets("Arkusz4").HPageBreaks(x).Location.Row

    z błędem:
    run-time error 9
    Subscript out of range.

    Jeżeli ustawię się "widokiem" na drugiej stronie błąd pojawi się po drugim przejściu pętli.

    Co jest nie tak? Wiem że można aktywować widok ostatniej strony ale jest to trochę nielogiczne jak się patrzy na kod.
  • Moderator Programowanie
    A gdyby "b" policzyć przed pętlą tylko raz a w pętli dodawać?
    Code:
    Sub test()
    
    'z sumowaniem na ostatniej str
    a = ThisWorkbook.Sheets("Arkusz4").HPageBreaks.Count +1
    b = Sheets("Arkusz4").HPageBreaks(1).Location.Row - 1
    d = b
    c = 1

    For x = 1 To a
        Sheets("Arkusz4").Range(d & ":" & d).Insert Shift:=xlDown
        Sheets("Arkusz4").Cells(d, 1).Formula = "=SUM(a" & c & ":a" & d - 1 & ")"

        c = d
        d = d + b
    Next x

    End Sub


    Dodano o 18:30 / zmiana w sobotę :) o 9:00
    --------------------

    Wygrzebane z netu, lekko dopracowane
    Code:
    Sub Suma_w_stopce()
    
    Dim wks As Worksheet
    Dim str As Variant
    Dim b As Integer, c As Long, i As Integer, k As Integer
    Dim ileStr As Integer

    If ActiveSheet.HPageBreaks.Count = 0 Then MsgBox "Tylko dla >2 stron.": Exit Sub

    'dla 9 stron
    str = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)
    b = Sheets("Arkusz4").HPageBreaks(1).Location.Row - 1
    c = b

    With ThisWorkbook.Windows(1)
        For Each wks In .SelectedSheets
            'tu policzymy to przyspieszy
            ileStr = wks.HPageBreaks.Count + 1
            k = 1
            For i = LBound(str) To UBound(str)
                If str(i) <= ileStr Then
                    MsgBox "Suma z " & k & "=" & Application.WorksheetFunction.Sum(Range("a1:a" & c))
                    'wks.PageSetup.CenterFooter = "Suma z " & k & "=" & _
                    Application.WorksheetFunction.Sum(Range("a1:a" & c))
                    'tu drukowanie strony bo zmieni sie tekst stopki
                    'wks.PrintOut From:=str(i), To:=str(i), Copies:=1
                    c = c + b
                    k = k + 1
                    'zeby nie krecic bez potrzeby
                    If k > ileStr Then Exit For
                End If
            Next
        Next
    End With

    End Sub