< návrat zpět

MS Excel


Téma: VBA Excel - Pomalé načítání dat do Listboxu rss

Zaslal/a 28.8.2015 9:48

Potřeboval bych poradit s kódem pro inicializaci Userformu, konkrétně se jedná o načítání dat do Listboxu, na mém počítači to načítá v řádu sekund, ale na jiném v řádu minut a to je už nepoužitelné pro praxi. Problém je asi v tom, že načítám data z jiného zavřeného sešitu. Poradí někdo kde by mohl být zakopaný pes? Díky


Private Sub UserForm_Initialize()
Application.ScreenUpdating = False
Application.DisplayAlerts = False

ListBox1.ColumnCount = 7
ListBox1.ColumnWidths = "60;60;30;130;40;40;130"

Dim path As String
Dim workbookName As String
Dim worksheetName As String
Dim cell As String
Dim returnedValue As String
r = 5
c = 1
x = 0
path = "P:\Slozka\"
workbookName = "Soubor.xlsm"
worksheetName = "List"
cell = Cells(r, c).Address

returnedValue = "'" & path & "[" & workbookName & "]" & worksheetName & "'!" & Range(cell).Address(True, True, xlR1C1)
hodnota = ExecuteExcel4Macro(returnedValue)
Do While hodnota <> 0
ListBox1.AddItem
For y = 0 To 6
returnedValue = "'" & path & "[" & workbookName & "]" & worksheetName & "'!" & Range(cell).Offset(x, 0).Address(True, True, xlR1C1)
returnedValue1 = "'" & path & "[" & workbookName & "]" & worksheetName & "'!" & Range(cell).Offset(x, y).Address(True, True, xlR1C1)
hodnota1 = ExecuteExcel4Macro(returnedValue1)
If hodnota1 = 0 Then hodnota1 = ""

ListBox1.List(x, y) = hodnota1
Next y
hodnota = ExecuteExcel4Macro(returnedValue)
x = x + 1
Loop

Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub

Zaslat odpověď >

Strana:  1 2 3   další »
icon #026475
eLCHa
Mno - načítáte data ze zavřeného souboru a navíc po jednom. To zákonitě musí být pomalé.
Pokud bych něco takového řešil, tak bych asi do sešitu vložil skrytý list, který by ta data načetl (pomocí odkazů) a z tohoto listu čerpal data pro listbox.citovat
#026476
avatar
No to jsem zkoušel, ale jde o to jak data načítat, pokud stejným principem např. při otevření souboru tak to stále trvá dlouho. Pokud bych načítal data odkazem na buňku z jiného sešitu tak to je celkem nepraktické vzhledem k tomu že původní sešit se bude dynamicky měnit a rád bych se vyhnul použití Excel funkcí a řešil to nějak makrem...aby se nestalo že mi do těch funkcí někdo hrábne a pak to nebude fungovat.citovat
#026477
avatar
Podle mých testů mi vychází jako nejrychlejší naplnění ListBoxu z dvourozměrného pole, např.
Dim Pole(1 To 20, 1 To 15)
' naplnění Pole hodnotami
With UserForm1
ListBox1.ColumnCount = 15
ListBox1.List = Pole
End With

Tohle není z mé hlavy, tak to mabízí Walkenbach. Pokud nedefinuji ColumnWidths, vzniknou sloupce 1 palec široké. Opět ne z mé hlavy, tentokrát z excelského helpu.citovat
#026478
avatar
V příkladu chybí úvodní tečky před LisBox. A ještě něco: pokud se sloupce nevejdou na šířku, prvek se sám doplní o vodorovný posuvník; to samé platí pro výšku ListBoxu se svislým posuvníkem.citovat
#026479
avatar
No to mě taky napadlo, ale pole nemám obecně moc rád, navíc bych potřeboval pole / listbox o sedmi sloupcích a to se úplně běžně nepoužívá co jsem si všimnul. Zatím jsem to vyřešil tím že do skrytého listu jsem vytvořil propojení na zdrojový sešit a aktualizaci při otevření dokumentu, ale moc se mi tohle řešení nezamlouvá, i když zatím funguje. Problém vidím v tom že zatím pracuju s jedním zdrojovým sešitem a dvěma listy, ale časem jich bude určitě mnohem víc a budou se vždy používat jenom některé z nich. Takže budu při spuštění souboru když se budu chtít jenom podívat na data muset aktualizovat x zdrojů úplně zbytečně...citovat
icon #026480
eLCHa
Ono je to všechno jenom takové teoretikování... Teď to dělám tak, jednou určitě budu dělat tak...

Nemusíte vytvářet propojení na x souborů a všechny je aktualizovat.
Například můžete ta data načíst "jedním krokem" při spuštění formuláře - do skrytého listu vložíte odkazyRange("A1:A50").FormulaR1C1 = "='Cesta\[Nazev]List'!R[10]C15"Tímto jsem celkem rychle načetl 50 řádků zavřeného souboru - bez cyklu. Po načtení dat do formuláře mohu vzorce zase smazat a pak mne to nebude brzdit při spouštění.citovat
#026481
avatar
Já myslel na to, aby to rychle počítalo, ne na to, co nemáte rád. Pokud vám zrychlení práce nestojí za to, abyste použil pole, pak je to vaše volba...citovat
icon #026482
eLCHa
Další možnost, která mne v rychlosti napadá je využití SQL - pojmenujte oblast a tu pak načtete. Nechce se mi zkoušet. Zkuste pohledat - možná je něco i tady http://wall.cz/index.php?m=topic&id=22223&page=5citovat
#026483
avatar
Range("A1:A50").FormulaR1C1 = "='Cesta\[Nazev]List'!R[10]C15"

Diky tohle řešení mě nenapadlo, zatím jsem R1C1 zápis asi na nic nepoužil, ale vypadá to celkem dobře, zkusím zapracovat jak se to bude chovat.

To Vovka: Pole jsem nechtěl použít hlavně proto, že do něj budu muset data dostat stejně cyklem s využitím stejných funkcí, takže rychlosti by to nepomohlo, nebo jsem to alespoň nepředpokládal.

Jinak co se týče "teoretizování" ;-) tak ta situace bude v praxi taková jak jsem ji popisoval, x zdrojových sešitů a z nich budu vybírat podmínkou který se použije, tzn. nechci načítat všechny abych se pak rozhodnul která data použít. potřebuji nejdřív rozhodnout ze kterých sešitů se bude načítat a pak načíst data ze kterých vybere uživatel a vloží je. Pak ta data ale už nepotřebuji a tím pádem nechci je uchovávat v sešitu s makrem už kvůli velikosti souboru a rychlosti otevírání/zavírání atd.citovat
#026531
avatar
Zkousel jsem to, ale asi moc nechapu zapis R1C1, resp. proc je ve vasem prikladu R[10]C15?citovat

Strana:  1 2 3   další »

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