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

vba excel - tabela przestawna z dużą ilością wierszy

krzysieks100 29 Sie 2012 20:37 4176 6
  • #1 29 Sie 2012 20:37
    krzysieks100
    Poziom 7  

    Witam, mam problem z kodem tworzącym tabelę przestawną.
    Wszystko działa dobrze i jestem zadowolony, do czasu gdy kod nie musi zrobić tabeli z dużej ilość wierszy, np: 130 000, wtedy się coś wywala.
    Ma ktoś pomysł?
    Z góry dziękuję.

    0 6
  • #2 29 Sie 2012 22:10
    adamas_nt
    Moderator Programowanie

    Wklej kod tej procedury (w znacznikach Syntax).

    1
  • #3 30 Sie 2012 21:02
    krzysieks100
    Poziom 7  

    Witam

    Dodałem plik zawierający makro. Plik jest dosyć uproszczony ale oddaje ideę o którą mi chodzi.
    Jeżeli ilość rekordów w arkuszu 1 powiększę do powiedzmy 130 000, w ogóle nie działa i nie wiem dlaczego?

    pozdrawiam

    0
  • #4 30 Sie 2012 23:15
    marcinj12
    Poziom 40  

    krzysieks100 napisał:
    Dodałem plik zawierający makro.
    Ja w tym pliku żadnego makra nie widzę :] Ani tabeli przestawnej która może się psuć... Natomiast widzę że jest to plik z rozszerzeniem .xls, który ma ograniczoną ilość wierszy do 65536. Może to jest przyczyną - jeżeli jakimś cudem możesz mu zapisać 130.000 wierszy, spróbuj użyć rozszerzenia .xlsx (lub .xlsm, jeżeli plik zawiera makra).

    0
  • #5 31 Sie 2012 18:45
    krzysieks100
    Poziom 7  

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    Sub Makro1()
    '
    ' Makro1 Makro
    '
    ' Klawisz skrótu: Ctrl+l
    '

    Dim PT As PivotTable
    Dim PRange As Range
    Dim FinalRow As Long
    Dim FinalColumn As Long

    For Each PT In Arkusz1.PivotTables
    PT.TableRange2.Clear
    Next PT

    'określenie zakresu danych tabeli wjściowej

    FinalRow = Arkusz1.Cells(Rows.Count, 1).End(xlUp).Row
    FinalColumn = Arkusz1.Cells(1, Columns.Count).End(xlToLeft).Column


    Set PRange = Arkusz1.Cells(1, 1).Resize(FinalRow, FinalColumn)
    Set PTCache = ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:=PRange)

    Range("A1").Select
    Range(Selection, Selection.End(xlDown)).Select
    Range(Selection, Selection.End(xlToRight)).Select
    ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
    PRange, Version:=xlPivotTableVersion12).CreatePivotTable _
    TableDestination:="Arkusz1!W4K4", TableName:="Tabela przestawna1", _
    DefaultVersion:=xlPivotTableVersion12
    Sheets("Arkusz1").Select
    Cells(4, 4).Select
    With ActiveSheet.PivotTables("Tabela przestawna1").PivotFields("aa")
    .Orientation = xlRowField
    .Position = 1
    End With
    ActiveSheet.PivotTables("Tabela przestawna1").AddDataField ActiveSheet. _
    PivotTables("Tabela przestawna1").PivotFields("bb"), "Suma z bb", xlSum
    End Sub
    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Hej,
    Tak wyglada makro do pliku który zamieściłem w poprzednim poście.
    nie jest to wina rozszerzenia pliku .xls, bo makro. W plikach excela z innymi rozszerzeniami też nie działa dla dużej ilości wierszy, nie wiem zupełnie dlaczego

    0
  • #6 03 Wrz 2012 19:22
    krzysieks100
    Poziom 7  

    Witam,
    Jest ktoś kto może mi pomóc z problemem jak powyżej?

    pozdrawiam,
    krzysieks100

    0
  • #7 21 Sie 2013 13:14
    SkubaniecPL
    Poziom 10  

    Hey;
    rozwiązanie problemu (trochę późno, ale lepiej późno jak w cale):
    "Generując tabelę przestawną z poziomu kodu pod Excelem 2003 można było jako argumentu Source metody tworzącej PivotCache podać dowolny poprawnie zdefiniowany obiekt Range, np CurrentRegion lub UsedRange. Podobnie rzecz ma się pod Excelem 2007/2010 (pamiętajmy tylko o użyciu metody PivotCaches.Create zamiast PivotCaches.Add). Niestety okazuje się, że w momencie gdy obiekt Range ma liczbę wierszy przekraczającą 65 536 (co teoretycznie nie powinno być problemem pod Excelem 2007/2010) metoda generuje błąd nr 13 Type mismatch :( Rozwiązaniem (niezbyt eleganckim ale innego chyba nie ma) tego problemu jest użycie zamiast obiektu Range klasycznego stringa R1C1 z tymże zakresem:"

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    pozdro,

    Ps.
    czasami szybciej znajdzieś odpowiedź pytając Google niż pytając na forum
    Wiele problemów już zostało opisanych a Google fajnie radzi sobie z ich wyszukiwaniem ;-)[/code]

    0