< návrat zpět

MS Excel


Téma: Vložení celého pole do oblasti rss

Zaslal/a 20.1.2015 9:29

Zdravím odborníky,
mám myslím jednoduchý problém, který se mi nicméně nějak nedaří rozlousknout. 1 Když si vytvořím pole a naplním ho oblastí buněk s hodnotami ( pole = range(X:Y).value ) a potom toto pole vložím zpět např. do jiné oblasti ( range(X:Y+1).value = pole ), tak vše funguje jak má. Nicméně když naplním pole cyklem For a poté vložím toto pole do oblasti, tak se mi celá oblast vyplní pouze první hodnoutou pole. Příklad s makrem je v příloze. Nevíte někdo, proč se mi nevloží do oblasti všechny hodnoty? Děkuji moc za rady

Příloha: zip23208_pokuspole.zip (15kB, staženo 36x)
Zaslat odpověď >

#023209
avatar
akoze netusim preco to tak je ale musi to byt presne nadefinovane ako je napr. keby ste napisali:
test = Range("A1:A5").Value

takze staci to napisat takto:
Sub PokusPole()
Dim pole() As Variant
Dim KonecPole As Integer

KonecPole = Range("A1").CurrentRegion.Rows.Count
ReDim pole(1 To 5, 1 To 1)
For i = 1 To KonecPole
pole(i, 1) = Cells(i, 1)
Next i
Range(Cells(1, 2), Cells(5, 2)) = pole
End Sub


a pojde to

dolpnok: Ale mozno ze uz tusim preco to tak je :) ale to je len dohad .... sheet je tvoreny z riadkou a stlpcou .... a podla vasho pola mal len jeden udaj nemal druhu suradnicu .... tj. jedine to pojde vlozit tak ked pole ma suradnice X a Ycitovat
#023210
avatar
Děkuji moc, funguje to přesně tak jak jsem si představoval. Myslel jsem, že stačí jednorozměrné pole, ale jestli to dobře chápu, tak je zapotřebí vytvořit dvourozměrné. No... abych pravdu řekl, úplně 100% z toho moudrej nejsem, nicméně si to prostě zafixuju, že to tak je.. 1 Ještě jednou moc díkycitovat
#023211
avatar
Potvrzuji Paloovy dohady, souhlasí to i s mými poznatky.
Jinak pokud není vyloženě důvod použít smyčku pro načítání pole, tak se dá načíst jedním příkazem:
Sub PokusPole()

Dim pole() As Variant
Dim KonecPole As Integer
Dim rgData As Range

KonecPole = Range("A1").CurrentRegion.Rows.Count
Set rgData = Range(Cells(1, 1), Cells(KonecPole, 1))
pole = rgData
Range(Cells(1, 2), Cells(KonecPole, 2)) = pole
End Sub


Když pak koukneš na to pole přes Locals Window, tak vidíš, že to pole je opravdu dvourozměrnécitovat
#023212
avatar
Díky, já načítám do pole upravené hodnoty funkcí MID, tak jsem přemýšlel o dvou varintách. Buď vložit do daného rozsahu vzorec, který mi vytvoří danou úpravu a pak celý rozsah vložit do pole a z pole zpět, abych dostal hodnoty, a nebo ten můj příklad, kdy načítám rovnou do pole upravené hodnoty a poté vložím pole do rozsahu. Nejsem si jistej, který způsob by byl rychlejší, ale ten s cyklem FOR v tom rozsahu co budu používat zatím vyhovuje. Nicméně moc díky za pomoc a dobrou raducitovat
icon #023213
eLCHa
jednorozměrné pole do oblasti dostanete pomocí Application.Transpose
VyzkoušejteSub test()
Dim iArray(20) As Integer
Dim i As Long
For i = 0 To 20
iArray(i) = i
Next i
Cells(1, 1).Resize(UBound(iArray) + 1).Value = Application.Transpose(iArray)
Cells(1, 3).Resize(1, UBound(iArray) + 1).Value = Application.Transpose(Application.Transpose(iArray))
End Sub
a pochopítecitovat
#023214
avatar
Pole musí být dvourozměrné, (transpoze z jednoho rozměru udělá rozměry dva)

Je ještě druhá podmínka: cílová oblast nesmí být skryta pomocí filtru.citovat
#023215
avatar
Ještě doplnění. Pokud se vkládá jednorozměrné pole, je to interpretováno jako řádek.

Tj. původní verze vyplnila první řádek oblasti hodntou, která odpovídala prvnímu sloupci.citovat
#023216
avatar
K chování transpoze:

zvládne max. 64k sloupců/řádků

Pokud takto chcet vyplnit celý sloupec, tak neuspějetě.citovat
#023218
avatar
Pro transpozici pole pomocí VBA (bez pomocí excelu) používám následovnou funkci. Švihá neuvěřitelně rychle a 100.000 záznamů jí nedělá problém:

Sub Transponuj2DPole(Pole As Variant)
Dim tmpPole As Variant
Dim lb1 As Long, lb2 As Long, ub1 As Long, ub2 As Long
Dim r As Long, s As Long

lb1 = LBound(Pole, 1)
lb2 = LBound(Pole, 2)
ub1 = UBound(Pole, 1)
ub2 = UBound(Pole, 2)

ReDim tmpPole(lb2 To lb2 + ub2 - lb2, lb1 To lb1 + ub1 - lb1)

For r = LBound(Pole, 2) To UBound(Pole, 2)
For s = LBound(Pole, 1) To UBound(Pole, 1)
tmpPole(r, s) = Pole(s, r)
Next s
Next r

Erase Pole
Pole = tmpPole
End Sub
citovat

Uživatelské menu

Nejste přihlášen(a)
avatar\n

Menu

Formulář Faktura

Formulář Faktura IV

Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.

Helios iNuvio

Používáte podnikový systém Helios iNuvio? Potřebujete pomoci se správou nebo vyvinout SQL proceduru? Více informací naleznete na stránce Helios iNuvio.

On-line nástroje