Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

VBA jak przekazac tablice do funkcji

orkan_81 22 Paź 2015 14:28 540 3
  • #1 22 Paź 2015 14:28
    orkan_81
    Poziom 14  

    Witam!
    Może ktoś w prosty sposób wytłumaczyć jak przekazać tablice do funkcji countif jako zakres?


    Sub tabela()
    '
    '

    Application.ScreenUpdating = False
    Dim start, koniec
    start = Timer
    Dim a, b, c, d, e, f, x, q, zakres As Integer

    Dim pobrane() As Variant ' tablica pobiera 6 liczb
    Dim szesc(8703) As Integer
    Dim tabela() As Variant ' tablica pobiera zdarzen los
    Sheets("dane").Select
    tabela = range("a1:cb8703") ' tu bedzie pobieralo do tablicy los
    Sheets("Arkusz1").Select
    pobrane = range("a1:f1048574") ' pobiera liczby do ustalenia kolumny w tabeli tabela :)



    For x = 1 To 10000

    a = pobrane(x, 1)
    b = pobrane(x, 2)
    c = pobrane(x, 3)
    d = pobrane(x, 4)
    e = pobrane(x, 5)
    f = pobrane(x, 6)


    For q = 1 To 8703
    szesc(q) = tabela(q, a) + tabela(q, b) + tabela(q, c) + tabela(q, d) + tabela(q, e) + tabela(q, f) ' j jest 10 kolumna

    Next q

    ' Tu powinna byc funkcja countif, która pobiera tablice "szesc" jako zakres, szukajac wystapien np: liczby 3

    Next x

    Sheets("arkusz1").Select
    Application.ScreenUpdating = True
    koniec = Timer

    cells(1, 12) = koniec - start


    End Sub

    0 3
  • Pomocny post
    #2 23 Paź 2015 20:39
    marek003
    Poziom 40  

    Człowieku :) tak to opisałeś że nikt się nie domyśli o co ci chodzi.
    Countif to licz.jeżeli() i jest funkcją arkusza. Jak chcesz jej koniecznie użyć nie twórz tablicy sześć() tylko wprowadź dane do drugiego arkusza i wtedy wykorzystuj countif.

    Ale może źle cię zrozumiałem więc nie wiem czy moja porada się na coś przyda.

    Tak na marginesie:
    Pętla 10000 z wewnętrzną pętlą 8703 to ciut więcej niż 87 milionów kroków - nie dodajęc czasu na "countif". Jesteś pewny że wytrzymasz ten czas zanim otrzymasz jakieś wyniki?

    0
  • #3 24 Paź 2015 10:24
    orkan_81
    Poziom 14  

    Witaj marek003 !
    No chyba aż tak źle nie opisałem zagadnienia bo zrozumiałeś w 100% :D.
    To co zaproponowałeś, przerobiłem już wcześniej, spadek wydajności był kolosalny. Dlatego chciałem wszystko zrobić w kodzie VBA, bez operowania na komórkach arkusza. Osiągnąłem już swój cel inna metodą. Zrezygnowałem z tablicy na rzecz zmiennej. Przekazywana ona jest do pętli If Then Else, ilość wystąpień zliczam za pomocą drugiej zmiennej np. i = i + 1. Dla czterech liczb 6,5,4,3 wygląda to tak
    dodawanie = tabela(q, a) + tabela(q, b) + tabela(q, c) + tabela(q, d) + tabela(q, e) + tabela(q, f)

    If dodawanie > 2 Then
    If dodawanie = 3 Then
    licznik3 = licznik3 + 1
    Else
    If dodawanie = 4 Then
    licznik4 = licznik4 + 1
    Else
    If dodawanie = 5 Then
    licznik5 = licznik5 + 1
    Else
    If dodawanie = 6 Then
    licznik6 = licznik6 + 1
    Else
    End If
    End If
    End If
    End If
    Else
    End If



    Z czasem nie jest aż tak źle. Dla x = 10000 dla całego kodu VBA który robi wszystko to co chciałem czas t = 52,56875s. X będzie równy 1048574. To są obliczenia dla leciwego IBM T61 z procesorem Intela T7500 i ddr2.

    0
  • Pomocny post
    #4 26 Paź 2015 09:34
    cbrman
    Poziom 26  

    COUNTIF (MSDN)

    Cytat:
    Arg1 - Required - Range - The range of cells from which you want to count cells.

    Nie da się bezpośrednio przekazać tablicy do funkcji licz.jeżeli.

    0
TME logo Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME
TME Logo