Bosna i Hercegovina



#1 11.06.2015-23:39
Avko Offline
Super Moderator
Registrovan/a od: 28.05.2014-09:21
Komentari: 2,048


Subject: vba excel dim redim preserve matrica
dimenzioniranje matrice ovisi o broju redova i broju kolona
dim matrica(redova,kolona)
mozemo na pocetku zadati max broj redova i kolona
koje sigurno nikada necemo upotrijebiti.

dim matrica(1000,1000)
redovi=127
kolone=322
for f=1 to redovi
    for e=1 to redovi
        matrica(f,e)=cells(f,e).value
    next e
next f

problem je sto imamo praznih polja u matrici
isto tako UBound pokazuje sva polja i prazna i puna

1.pitanje:
molim objasnjenje za koristenje dim, redim i preserve
za 2D matricu.

2.pitanje:
redovi i kolone nemoraju uvijek krenuti od 1,
nekad redovi krenu od 17, 24 ili neki drugi broj,
a kolone isto tako, a htio bi da u matricu upisuju od 1,1
dakle

redovi=34
kolone = 189

for f= 15 to redovi
    for e=29 to kolone
        'ovo ispod nije dobro
        matrica(f-(f-1),e-(e-1))=cells(f,e).value
    next e
next f
noću je hladnije nego vani
↑  ↓

#2 12.06.2015-11:59
zxz Offline
Administrator
Registrovan/a od: 03.02.2009-16:22
Komentari: 8,949


Ocjena: Ocjena:100 Subject: Re: vba excel dim redim preserve matrica
Citat:
1.pitanje:
molim objasnjenje za koristenje dim, redim i preserve
za 2D matricu.

Kada neznamo koliki nam je niz onda dimenzionisemo na sledeci nacin:
dim NekiNaziv() as String

e sada kada u toku izvrsenja procedure dobijemo vrijednost niiza napr. na osnovu petlje ili nceega drugoga.
Uzmimo da je ta vrijednost i.
Dim i as integer

for i= 1 to n

next i
sad ide redim

Redim NekiNaziv(i,8) as string

Nekad se nam znam desiti da uopste neznamo vrijednost niza.
Primjera radi kada niz punimo u petlji.
tada bi morali jednom obrnuti pezlju na prazno da saznamo koliko varijabli trebamo pa onovo obrnuti da pokupimo vrijednosti.
U ovom slucaju vrsimo redim za svaki prolaz petlje i najvjerovatnije i popunimo tu vrijednost.
Ukoliko izvrsimo redim sve vrijednosti ako ih ima u toj varijabli se gube.
da nebi izgubili vrijednosti ona koristimo preserve.
Primjer:

for i= 1 to N
redim preserve NekiNaziv(i,8)
NekiNaziv(i,8)="nekiPodatak"
next i
Pozdrav
↑  ↓

#3 12.06.2015-12:03
zxz Offline
Administrator
Registrovan/a od: 03.02.2009-16:22
Komentari: 8,949


Subject: Re: vba excel dim redim preserve matrica
Citat:
2.pitanje:
redovi i kolone nemoraju uvijek krenuti od 1,
nekad redovi krenu od 17, 24 ili neki drugi broj,
a kolone isto tako, a htio bi da u matricu upisuju od 1,1
dakle

racunar uvije broji od 0.
ako dimenzionisemo:
Dim a(1) as string
Ovdje imamo dvije variable

a(0)="NekaVrijednost"
a(1)="nekavrijednost"

Cesto puta moi to nevidimo tako jer nama je obicaj brojati od 1 pa mi preskacemo var(0).
Nista se nece desiti sem sto se razbacujemo resursima pa ako je nasa app. kompleksna zauzimat ce vise memorije a nje nikad dosta i tra+eba voditi racuna.
Pozdrav
↑  ↓

#4 12.06.2015-16:43
Avko Offline
Super Moderator
Registrovan/a od: 28.05.2014-09:21
Komentari: 2,048


Ocjena: Ocjena:100 Subject: Re: vba excel dim redim preserve matrica
hvala
ja ocekivo da mi Div odgovori, a njega danas nema,ehh.
dobro, kad nece nitko drugi dobro i ti dodes Smiling
to sto si napisao dva posta ne znaci da cu ti dati + +
dobices samo jedan, bilo ti krivo il milo. Recesija je druze, treba da se stedi.
noću je hladnije nego vani
↑  ↓

#5 12.06.2015-18:55
zxz Offline
Administrator
Registrovan/a od: 03.02.2009-16:22
Komentari: 8,949


Subject: Re: vba excel dim redim preserve matrica
Hehe kod mene to ne znaci nista jer sam presao maksimum.
Pluseve treba davati radi postova jer se poslije lakse nadje.
Nazalost meni su na pocetku bubali pluseve i u zabavi.
Netreba stavljati pluseve na imena nego na post.
Pozdrav
↑  ↓

#6 12.06.2015-20:05
Avko Offline
Super Moderator
Registrovan/a od: 28.05.2014-09:21
Komentari: 2,048


Subject: Re: vba excel dim redim preserve matrica
tebi ubuduce samo hvala
Citat od zxz:

Pluseve treba davati radi postova jer se poslije lakse nadje.
aha znaci mogu naci po upitu "davanje +"

Iskljucena tema:
a ako se divim sam sebi kako sam dobro napisao mogu li sam sebi dati + kao u filmu vlak u snijegu kada je pero glasovo sam za sebe da bude voditelj zadruge hhhh

noću je hladnije nego vani
↑  ↓

#7 14.06.2015-11:16
Avko Offline
Super Moderator
Registrovan/a od: 28.05.2014-09:21
Komentari: 2,048


Subject: Re: vba excel dim redim preserve matrica
uhuhuhuuu, dakle bilo problema sa ovim dok nisam otkrio ovo:
"kod redimenzioniranja vise dimenzionalne matrice, mozete redimenzionirati, povecati samo posljednju dimenziju matrice"
u praksi je to ovako:

dim matrica(10,10)

ovo mozemo
redim matrica(10,20)

ali ovo ne mozemo
redim matrica(20,10)

dakle gubitak od cirka 4 dana dok sam banalnu stvar otkrio. Sigurno ste se zabavljali dok ste razmisljali o meni i mojim mukama. heheheh


image uploading
to sam onda rijesio ovako:

DownloadIzvorni kod (Visual Basic):
  1. Sub proba()
  2.     Dim matrica() As Variant
  3.     ReDim matrica(1 To 1, 1 To 1)
  4.    
  5.     Dim startDatum As Date
  6.     Dim endDatum As Date
  7.     startDatum = "2.1.2015."
  8.     endDatum = "5.1.2015."
  9.        
  10.     ActiveSheet.Range("B1").Select
  11.     ActiveSheet.Range(Selection, Selection.End(xlToRight)).Select
  12.     Set rangDatum = Selection 'stavim red datuma u rangDatum
  13.    Dim maxRed As Integer
  14.     maxRed = Range("A2").End(xlDown).Row 'max broj redova dakle od A2 do A5
  15.    Dim celija As Range
  16.  
  17.     For red = 2 To maxRed 'krece od drugod reda do maxRedova
  18.        For Each celija In rangDatum 'koja celija u rangu datuma
  19.            If celija >= startDatum And celija <= endDatum Then 'ima vrijednost
  20.                If red <= 2 Then 'ako je red prvi koji uzimamo u matricu
  21.                    kolona = celija.Column - 2 'stavimo kolonu na 1 zato da stavlja u matricu od prvog mjesta
  22.                    ReDim Preserve matrica(1 To red - 1, 1 To kolona) ' redimenzioniranje, povecamo drugu za kolonu tj +1
  23.                    matrica(red - 1, kolona) = Cells(red, celija.Column) 'ubacimo u matricu(red,celija.column) celija.column=kolona celija koja ispunjava uvijet
  24.                Else
  25.                     'ako nije pocetak tj red 2 onda vise ne redimenzioniramo matricu
  26.                    kolona = celija.Column - 2
  27.                     matrica(red - 1, kolona) = Cells(red, celija.Column)
  28.                 End If
  29.             End If
  30.         Next celija
  31.         If red < maxRed Then'ako red nije dostigao max vrijednost
  32.            matrica = Application.Transpose(matrica)' transponse = transportiram matricu(2,8) u matrica(8,2)
  33.            ReDim Preserve matrica(1 To kolona, 1 To red),'da bi mogao redimenzionirati posljednju dimenziju
  34.            matrica = Application.Transpose(matrica)' transportiram nazad matrica(8,3) u matrica(3,8)
  35.        Else
  36.             red = red + 1 'ako je red dostigao maxRed povecavamo red na max da bi izasli iz petlje
  37.                           'mogli smo i staviti goto
  38.        End If
  39.     Next red
  40.         'ispis matrice, a moze biti i u list ovdje je u immediate prozor
  41.    For red = 1 To maxRed - 1
  42.         For kolona = 1 To UBound(matrica, 1)
  43.             Debug.Print Cells(red + 1, 1) & "(" & red & "," & kolona & ")" & matrica(red, kolona)
  44.         Next kolona
  45.     Next red
  46. End Sub

ispis u immediate:
ivo(1,1)kruska
ivo(1,2)sljiva
ivo(1,3)tresnja
ivo(1,4)visnja
luka(2,1)sljiva
luka(2,2)tresnja
luka(2,3)visnja
luka(2,4)jagoda
mirko(3,1)tresnja
mirko(3,2)visnja
mirko(3,3)jagoda
mirko(3,4)lubenica
slavko(4,1)visnja
slavko(4,2)jagoda
slavko(4,3)lubenica
slavko(4,4)krumpir
noću je hladnije nego vani
↑  ↓

#8 14.06.2015-11:29
zxz Offline
Administrator
Registrovan/a od: 03.02.2009-16:22
Komentari: 8,949


Subject: Re: vba excel dim redim preserve matrica
Citat:
"kod redimenzioniranja vise dimenzionalne matrice, mozete redimenzionirati, povecati samo posljednju dimenziju matrice"
DownloadIzvorni kod (Visual Basic):
  1. Option Explicit
  2.  
  3. Function Matrica()
  4. Dim a()
  5. Dim I, N As Integer
  6.  
  7. For I = 1 To 5
  8.    For N = 1 To 5
  9.    
  10.    ReDim a(I, N)
  11.    Next N
  12. Next I
  13. End Function

Mozda si mislio na preserve.
ako njega koristis nemozes mijenjati sirinu matrice ili u praksi obicno kolone sto nama i netreba nego samo broj redova ili duzinu matrice.
Pozdrav
↑  ↓

#9 14.06.2015-12:09
Avko Offline
Super Moderator
Registrovan/a od: 28.05.2014-09:21
Komentari: 2,048


Subject: Re: vba excel dim redim preserve matrica
da mislio sam na preserve, pamcenje matrice te prosirivanje redova i kolona zato sam napisao ono gore da pokazem kako sam to rijesio uz pomoc transponse .
arr=transponse(arr)
noću je hladnije nego vani
↑  ↓

Stranice (1): 1


All times are GMT +01:00. Current time: 20.02.2017-05:04.