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

excel - jak zsumować dane w komórkach

januszcha 02 Lut 2013 00:27 4302 5
  • #1 02 Lut 2013 00:27
    januszcha
    Poziom 1  

    witam.
    jestem nowy. proszę o podpowiedź czy w excelu da się zsumować wartości przy zapisie np w kolumnach: ds12, ds14, ds12 tak aby zsumowal mi w ds12 to 12, ds14 to 14. wiem że się to da zrobić warunkiem, ale symbole poprzedzające liczbę też mogą być różne. chcę aby sumowało odpowiednie typy i dodatkowo liczby dopiete do typów.
    przykładowy zapis wiersza:
    ds12, w14, s23 , ds2
    aby posumował w następnej kolumnie ds = 14, w = 14, s = 23
    Powiedzcie czy to się da formułami czy muszę użyć VB

    0 5
  • CControls
  • CControls
  • #3 02 Lut 2013 09:04
    adamas_nt
    Moderator Programowanie

    Da się... Spróbuj tablicową z tego przykładu: Link

    0
  • #4 05 Lut 2013 14:13
    Maciej Gonet
    Poziom 32  

    Dzień dobry,
    Zasadniczą sprawą jest rozdzielenie części tekstowej i numerycznej w Pana danych. Gdyby przedrostki tekstowe w komórkach były jednakowej długości (np. 3 znaki) to łatwo można w Excelu to rozdzielić stosując formuły:
    Do części tekstowej: =LEWY(kod;3)
    Do części numerycznej: =ZASTĄP(kod;1;3;)*1
    Kod oznacza adres komórki z danymi.
    Podobnie gdyby część tekstowa i numeryczna były rozdzielone jakimś separatorem np. spacją, to wtedy długość części tekstowej byłaby nieistotna i też łatwo można by było sobie poradzić:
    Część tekstowa: =LEWY(kod; ZNAJDŹ(" ";kod))
    Część numeryczna: =PRAWY(kod; DŁ(kod)-ZNAJDŹ(" ";kod))*1
    W Pana przypadku gdy tekst może być różnej długości rozwiązanie w Excelu jest możliwe, ale dość złożone i mało przejrzyste. Lepiej w takim przypadku napisać funkcję w Visual Basicu np. taką:
    Function Separate(x)
    Dim Id As String, Num As String, i As Integer, Ch As String * 1
    For i = 1 To Len(x)
    Ch = Mid(x, i, 1)
    If Ch Like "[A-Za-z]" Then Id = Id & Ch
    If Ch Like "[0-9]" Then Num = Num & Ch
    Next i
    Separate = Array(Id, CInt(Num))
    End Function
    Ta funkcja zdefiniowana w module Visual Basica może być użyta jako funkcja użytkownika w arkuszu Excela. Jest to funkcja tablicowa, bo wypełnia od razu dwie komórki. Przy jej używaniu należy zaznaczyć dwie komórki poziomo obok siebie, wpisać =Separate(kod) i nacisnąć Ctrl+Shift+Enter. Po lewej stronie otrzymamy tekst, po prawej liczbę. Kod jest adresem danej. Funkcja nie sprawdza poprawności danych rozdziela tylko litery od cyfr, inne znaki pomija.
    Dane należy wprowadzić w kolumnie i obok zastosować powyższą funkcję raz, a potem skopiować wyniki w dół do końca danych. Będzie Pan miał dwie kolumny z rozdzielonym tekstem i liczbami.
    Teraz należy te dane skonsolidować, to znaczy znaleźć jednakowe teksty i zsumować odpowiadające im liczby. Umieszczamy kursor w miejscu gdzie ma być wynik, z menu Dane wybieramy Konsoliduj i w oknie dialogowym zaznaczamy Funkcja Suma, Odwołanie – wskazujemy zakres obejmujący 2 kolumny z rozdzielonymi danymi, Użyj etykiet w: lewa kolumna i OK.
    Otrzyma Pan dwie kolumny z połączonymi danymi: z lewej identyfikatory, z prawej odpowiadające im sumy. Procedura konsolidacji nie rozróżnia małych i dużych liter w etykietach (identyfikatorach).
    Powodzenia

    0
  • #5 05 Lut 2013 15:07
    marek003
    Poziom 40  

    Maciej Gonet napisał:
    W Pana przypadku gdy tekst może być różnej długości rozwiązanie w Excelu jest możliwe, ale dość złożone i mało przejrzyste

    :) Kolego Macieju, bez urazy ale uważasz że twoje rozwiązanie jest przejrzystsze od rozwiązania które wskazał w linku kolega adamas? Tym bardziej że proponujesz również funkcję tablicową.

    Rozumiem że to dość sprytne rozwiązanie ale osobiście uważam że jeżeli można coś zrobić funkcjami to nie ma potrzeby pchać sie w VBA.
    Tak jak w przykładzie (dla 9cio znakowych ciągów):

    Liczbę wyjmujemy:
    {=1*FRAGMENT.TEKSTU(A1;PODAJ.POZYCJĘ(PRAWDA;CZY.LICZBA(1*FRAGMENT.TEKSTU(A1;WIERSZ($1:$9);1));0);ILE.LICZB(1*FRAGMENT.TEKSTU(A1;WIERSZ($1:$9);1)))}

    a początkowy tekst (jak wynika z powyższego):
    {=LEWY(A1;PODAJ.POZYCJĘ(PRAWDA;CZY.LICZBA(1*FRAGMENT.TEKSTU(A1;WIERSZ($1:$9);1));0)-1)}

    Zaznaczam że to też są funkcje tablicowe czyli by działały trzeba zatwierdzając je wcisnąć Ctrl+Shift + Enter a potem tylko skopiować w dół.
    Jeżeli ciąg może być dłuższy należy w kodzie tam gdzie występuje poprawić WIERSZ($1:$9) na taką wartość ile może być maksymalnie znaków w ciągu czyli gdy ciąg ma np max 15 znaków wtedy WIERSZ($1:$15) [jak będzie mniej to nie ma problemu].

    A potem już tylko suma.jeżeli() i mamy wyniki.

    0
  • #6 06 Lut 2013 09:52
    Maciej Gonet
    Poziom 32  

    Wybór rozwiązania należy do tego, który je będzie stosował. Osobiście również preferuję rozwiązania w samym Excelu bez VBA, ale w tym przypadku uważam, że rozwiązanie w postaci funkcji użytkownika napisanej w VBA, które zaproponowałem jest bardziej przejrzyste, przy założeniu, że zna się podstawy Visual Basica. Bardzo nie lubię rozbudowanych tzw. megaformuł, lansowanych w niektórych książkach, jeśli już to staram się je rozbijać na kilka mniejszych albo stosować nazwy do fragmentów formuł.

    0