vbamania.pl
login:
hasło:
 
  *Rejestracja *Zapomniane hasło
 Dziś jest sobota, 18 maja 2024 roku.
Ustaw jako stronę startową Ulubione Napisz
PowrótPowrót do serwisu  RegulaminRegulamin rssRSS

  tytuł wątku:
Wątki dyskusji

srednia ruchoma


otwartyotwarty rozpoczął: abuk postów: 5



napisał: abuk
postów: 20


umieszczony:
5 kwietnia 2006
17:18

  
Witam witam i bardzo dziekuje za pomoc...
Cytat:
Typ każdej zmiennej musi być zadeklarowany odrębnie

tego nie wiedzialem... wyczytalem gdzies, ze mozna deklarowac j, i as... z reDim probowalem ale cosik nie wychodzilo, Cells(i, j).Resize(3, 1) takiej metody rowniez nie znalem...
raz jeszcze dzieki...
pozdrawiam i wracam do vba... :)
napisał: Rycho
postów: 291


umieszczony:
5 kwietnia 2006
01:13

  
Errata
Sorry, znowu się pośpieszyłem z wysłaniem, zamiast do końca makro przetestować.
Funkcja licząca średnią powinna wyglądać tak:
WorksheetFunction.Average(tablicaA(i, j).Resize(3, 1))


Rycho
napisał: Rycho
postów: 291


umieszczony:
5 kwietnia 2006
01:04

  
Witaj.
Na początek kilka uwag.
Typ każdej zmiennej musi być zadeklarowany odrębnie.
Dim i,j as integer oznacza, że i jest typu domyślnego czyli variant.
Metoda InputBox może zwrócić obiekt typu range.
Dlaczego w pęlach zmienna j jest do kA-2 a nie zmienna i do wA-2 ?

Nie ma delaracji rozmiarów tablicy "srednia".
Dim srednia() as variant
...
reDim srednia( ? , ? )

Właściwie można obyć się bez tablic operując wyłącznie na komórkach.

Twój program po zmianach może wygladać tak:
Sub srednia_ruchoma()
    Dim zakresC As String
    Dim tablicaA As Range
    Dim wA As Integer, kA As Integer, wC As Integer, kC As Integer
    Dim i As Integer, j As Integer
    
    On Error GoTo canceled
    Set tablicaA = Application.InputBox( _
            prompt:="Wskaż zakres tablicy A :", _
            Title:="srednia ruchoma", _
            Type:=8)
    wA = tablicaA.Rows.Count: kA = tablicaA.Columns.Count
    
Label:
    zakresC = Application.InputBox( _
        "Wskaż pierwsza komorke tablicy wynikowej :", _
        "srednia ruchoma", , , , , , 8).Address()
    wC = Range(zakresC).Row - 1: kC = Range(zakresC).Column - 1
    
    If Range(zakresC).Row + tablicaA.Row > 65536 Or _
      Range(zakresC).Column + tablicaA.Column > 256 Then
        MsgBox "Tablica nie miesci sie we wskazanym zakresie!", , "Błąd"
        GoTo Label
    End If
    
    On Error GoTo 0

    For i = 1 To wA - 2
        For j = 1 To kA
            Cells(wC + i, kC + j).Value = _
              WorksheetFunction.Average(Cells(i, j).Resize(3, 1))
        Next j
    Next i
    
Exit Sub

canceled:
  MsgBox "Operacja została anulowana"
End Sub



Rycho

PS W edytorze otwórz okno zmiennych lokalnych (Locals Window) i obserwuj działanie makra krok po kroku (F8).
napisał: abuk
postów: 20


umieszczony:
4 kwietnia 2006
23:01

  
doszedlem do czegos takiego....
Sub srednia_ruchoma()
Dim zakresA, zakresC As String
Dim tablicaA As Range
Dim wynik As Variant
Dim srednia
Dim wA, kA, wC, kC, i, j As Integer

'On Error GoTo Label2

Label1:
zakresA = Application.InputBox("Wskaż zakres tablicy A :", "srednia ruchoma", , , , , , 8).Address()

Set tablicaA = Range(zakresA)

wA = tablicaA.Rows.Count: kA = tablicaA.Columns.Count

Label: zakresC = Application.InputBox("Wskaż pierwsza komorke tablicy wynikowej :", "srednia ruchoma", , , , , , 8).Address()
    wC = Range(zakresC).Row - 1: kC = Range(zakresC).Column - 1
    
    If Range(zakresC).Row + tablicaA.Row > 65536 Or Range(zakresC).Column + tablicaA.Column > 256 Then
        MsgBox "Tablica nie miesci sie we wskazanym zakresie!", , "Błąd"
        GoTo Label
    End If
    wynik = tablicaA

    For i = 1 To wA
        For j = 1 To kA - 2
             srednia(i, j) = WorksheetFunction.Average(wynik(i, kA + 2))
        Next j
    Next i

    For i = 1 To wA
        For j = 1 To kA
            Cells(wC + i, kC + j).Value = srednia(i, j)
        Next j
    Next i

'Exit Sub
'Label2: MsgBox "Klilnąłeś 'Anuluj'"

End Sub

ale wiesza sie na srednia(i, j) wyskakuje "type mismatch....
ma ktos moze pomysl???
pozdrawiam...
napisał: abuk
postów: 20


umieszczony:
4 kwietnia 2006
13:37

  
Witam!
Probuje napisac makro ktore bedzie mi liczylo srednia ruchoma... Ma to sie odbywac w nastepujacy sposob... Uzytkownik uruchamia makro ktore prosi o zaznaczenie obszaru oraz pierwszej komorki tablicy wynikowej... zaznacza zakres np. A1:A24 i B1... Chodzi o to aby wypisac w B1, B2 itd. wynik dzialania B1=srednia(A1:A3), B2=srednia(A2:A4), B3=srednia(A3:A5)... domyslam sie ze
wynik = WorksheetFunction.Average(?????)

wynik trzeba wpuscic w petle... to nie jest problem... tylko jak poruszac sie po adresach? A1:A3, A2:A4... czy wynik zapisac najpierw do tablicy i po nim sie poruszac?
Pozdrawiam...


<-wstecz  1  dalej->
wszystkich stron: 1


Sortuj posty: z