Příspěvky uživatele


< návrat zpět

No vidíte "eLCHa" a kdybyste mi tohle napsal rovnou místo "dělejte to radši ručně" apod. tak jsme si mohli ušetřit spoustu času. Já ten původní příspěvek psal s vědomím že tady prostě nesedí někdo dobrovolně 24h denně aby opravoval kódy nováčkům, proto jsem chtěl první nasměrovat od zkušenějších, kde by asi mohl být problém abych se v tom pohrabal sám. tím se zároveň i něco naučím, nenárokoval jsem si tady žádný služby zdarma abych někomu předhodil co mám a co chci a on to za mě napsal. Ale chápu že někdy je to i pro toho kdo radí jednodušší a rychlejší postup než vypisovat všechny varianty apod.

Nicméně děkuji všem kteří přispěli k tématu, děkuji uživateli "elninoslov" za upravený kód, popravdě, budu se tím muset trochu prokousat, na ostrých datech to pořád nefunguje jak má, nicméně RAM to nežere a je to rychlejší, takže snad ten zbytek zvládnu už sám, případně se na vás ještě obrátím.

Jo pravda, to už jsem vlastně zkoušel. Proto jsem pak použil tu funkci s ExecuteExcel4Macro. Zkusím jestli se mi povede rozchodit to ADO.

Jo super díky, to ExecuteExcel4Macro pravděpodobně způsobuje to načítání paměti i když jsem si to původně nemyslel, zkusím to obejít podle vaší rady.

Jinak můžete trochu rozvést co znamená "neuvoľňovanie 4 objektov v rekurzii"? tomu nerozumím.
Ani co je špatně na volání listů a buněk, jak jinak to udělat? Myslel jste načíst to celé do pole a pak odkazovat na položky z pole? To bych měl zvládnout, první se potřebuju zbavit toho hromadění RAM, pak budu řešit rychlost. Ten kód je samozřejmě plný balastu jak jsem zkoušel různé varianty, optimalizovat to mám samozřejmě v plánu.

Já s vámi souhlasím, nicméně trocha pokory by neškodila ani zdejším "mistrum".
Dal jsem si tedy s tím práci a testovací soubory přikládám.

Já obecně nemám problém s kritikou, ale když si pořádně přečtete první post, tak já se prostě jenom ptám na radu, abych zjistil jestli je někdo schopen mi pomoci, jestli má někdo podobnou zkušenost. Nevím jací "Mistři" sem chodí ani jak ochotní jsou poradit, zkrátka jsem se zeptal a proč nedávám příklad hned jsem taky napsal. Já nikoho nenutím aby mi pomáhal, ale na několika fórech taky působím (ne ohledně programování) a s takovým přístupem jako tady jsem se snad ještě nesetkal. Takhle zadupat nováčka do země jenom proto že nepoložil dotaz tak jak se místním líbí, promiňte mi, ale i kdyby měli zmínění pánové titul mistra světa v excelu tak pro mě jsou to neandrtálci neschopní porozumět psanému textu, popřípadě internetoví trollové...ať si to dotyční přeberou.
Nikdo učený z nebe nespadl a zatím se tu neobjevila jediná smysluplná odpoveď nebo jakákoli rada ať už se přímo týká problému nebo ne.

Ano svět se v prdel obrací, díky lidem jako vy. Pokud na můj dotaz nelze odpovědět proč je tady tolik příspěvků? Stačilo by napsat že bez příkladu nelze a hotovo. Stačil by jeden. Místo toho tady dokola X lidí plýtvá časem a já se ptám proč? Fajn, možná dotaz nebyl položen správně, možná se ptám blbě, možná je můj kód mizernej...proč na to proboha ale reagujete když vám to podle všeho za to nestojí? Já si nějak odpovědi nárokuju? Vy víte co já čekám za odpovědi? Píšu někde že chci zadarmo řešení všech problémů světa? Ne. Nejste povinní sem cokoli psát a tak to nerobte.

Nechápu že se tolik lidí nechá vytočit "špatně" položeným dotazem na fóru... 2

xlnc napsal/a:

Zadavatel tu zaměstnává několik lidí, reaguje jak idiot kecama okolo, ale my si tu honíme ego? Jako chlap možná chlapovi - sbalte si ty svoje dobré kódy a běžte do prdele :-)


Nikoho tu nezaměstnávám, reagujete dobrovolně, ovšem oba dva mimo téma a tím pádem zbytečně. Pokud neumíte/nechcete poradit proč pořád reagujete?

eLCHa napsal/a:

Ještě vám věnuji jeden příspěvek.

Vložil jste tady kód, o kterém tvrdíte, že je funkční. Ten kód neprojde ani kompilací, takže v tu chvíli se tím přestávám zabývat.
Když už ale toto přeskočím, tak je tam funkce GetInfoFromClosedFile, o které se můžu jen domýšlet, co dělá.

Nezlobte se, ale chcete po nás poradit, sám tomu věnujete 10 minut času a my to máme zkoumat?

Tady vám bez přílohy poradí opravdu jen kouzelník. Výmluva o firemních datech a externích souborech neobstojí. Vy chcete poradit a vy byste měl připravit nějakou funkční alternativu (pro ukázku stačí i 5 souborů). Když už tady dáte pouze kód, tak by měl být alespoň detailně okomentovaný.

Ten kód je strašný, ale žádný učený z nebe nespadl. Nicméně makro, které jede několik hodin zahoďte a dělejte to raději ručně. Když už se vám to podaří zprovoznit, tak vypadne proud nebo se vám spustí aktualizace windows.
Cyklus 9000*2500 musí dojet max do 10 minut a to přeháním.

Ta úloha by mohla být zajímavá, kdyby byl lepší váš přístup.


Prosím Vás, pokud nechcete radit nebo kritizovat alespoň věcně tak se nevyjadřujte vůbec, ušetříte si čas i nervy. Kdybyste přesto chtěl nějak pomoci, tak mi napište kde konkrétně vidíte v mém kódu nedostatky nebo chyby.

Můj dotaz byl obecného rázu, jak zajistit aby Excel nežral systémové prostředky, případně jak upravit "ukázkový" kód. Jak jsem už psal, podobných cyklů mám spoustu a všechny fungují jak mají, jen tenhle ne. Co se týče toho okolo, všechno funguje jak má do chvíle kdy to doleze k tomu cyklu a tam to začne načítat data, stejně tak když ten cyklus promažu/zakomentuju a nechám to jenom běžet dokola, tak to zase načítá nesmyslně do paměti, tzn. co dělá funkce GetInfoFromClosedFile() je pro tenhle problém irelevantní...

A ano, příklad sem dát by bylo velice komplikované, protože se jedná o velké množství souborů a dat, která bych musel ručně anonymizovat, navíc přepsat všechny cesty apod. S realitou by to pak mělo pramálo společného a na malém vzorku dat by to jistě fungovalo bez problémů. Proto příklad nedávám...

eLCHa napsal/a:

Nemůže fungovat.
Na začátku máte end if bez if.


Psal jsem že ten kód je upravený, smazal jsem tam jednu nepodstatnou podmínku, důležitý je ten cyklus, od toho tam začíná naskakovat RAM do tý doby je to OK, na začátku byl ještě jeden cyklus kterej prochází cca 15000 řádků a nepotřebný maže, ten je taky OK, RAM se ani nehne.

marjankaj napsal/a:

Ani som sa nesnažil ten kód čítať.
Ale keď píšeš,že to funguje, tak v čom je potom problém?


Možná by stačilo přečíst ten první příspěvek, funguje, ale jen do doby než se zaplní paměť a pak "spadne", resp. vyhodí hlášku že došla volná RAM a musí se natvrdo ukončit.

Anonym napsal/a:

No pokud tady předhodíš vykuchaný kód, nemůžeš očekávat, že si někdo bude chybějíci řádky domýšlet.
Problém může být zrovna v nich.
A jen má doměnka:
GetInfoFromClosedFile() předpokládám, že ExecuteExcel4Macro()
No 9000 * 2500 * 2 ???
Do toho bych nešel.


Jo touhle funkcí zjišťuju jestli soubor obsahuje sheet který potřebuju, nicméně ani po promazání toho kódu uvnitř cyklu se nic nezmění a pořád to něco načítá do RAM. Takže to asi problém nebude...

A proč 9000 * 2500 * 2 ?
Nebo jak jinak to udělat? Prostě počet záznamů je daný, nějaký tip jak to obejít?

xlnc napsal/a:

Koule moje křišťálová, zjev mi to zlo v kódu VBA...

No prej v tom kódu hrajete něco jako slovní fotbal. Přehazujete si texty, názvy a kdo ví, co ještě jako horký brambor. Asi dobrej koncept. Jo a nakonec se mi zjevila kapitola, jak Pejsek s kočičkou vařili dort. Pak koule potemněla a víc jsem z ní nedostal. Teda než zhasla, tak byla sprostá a viděl jsem sám sebe, jak si ťukám na čelo.

Ale je podstatné vědět, že paměť se zaplnila z 1,6 GB. Víte co, dejte ruce od Excelu a běžte pryč. Nejde o to, jak zčuněný je kód, ale že nepřemýšlíte hlavou, a jste schopen sem předhodit tenhle chuchvalec kódu a čekat zázrak. Padá hvězda, něco si přejte.


Tak tohle je nejhodnotnější příspěvek vůbec! Ne fakt, hrozně mi to pomohlo a život je hned lepší! 5

Tyhle kecy si nechte příště od cesty a věnujte čas něčemu užitečnějšímu, když už kritice, tak věcné a konkrétní, to co jste napsal ničemu/nikomu nepomůže...

To makro funguje jak jsem popsal, akorát jsem ho upravil abych ho sem mohl vložit.

Sub test()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False

Dim sPath As String
sPath = "\\cesta\"

Dim lastrow As Long

On Error Resume Next

lastrow = ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Row - 1
y = 0
yy = 0
'ulozeno = 0

y = Worksheets("Data").Cells(Rows.Count, "A").End(xlUp).Row
End If

Dim i As Long
Dim test_cesta As String

For x = 2 To lastrow

For i = 1 To y
If Mid(Worksheets(jmeno2).Cells(x, 3), InStr(1, Worksheets(jmeno2).Cells(x, 3), "+") + 1, 1) = "H" Then
test_str = Left(Worksheets(jmeno2).Cells(x, 3), InStr(1, Worksheets(jmeno2).Cells(x, 3), "+") - 1)
Else
test_str = Worksheets(jmeno2).Cells(x, 3)
End If
If InStr(1, Worksheets("Data").Cells(i, 1), test_str) <> 0 Then
' test_cesta = Worksheets("Data").Cells(i, 2).Text
test_cesta = Worksheets("Data").Cells(i, 2).Text
test1 = GetInfoFromClosedFile(Replace(Worksheets("Data").Cells(i, 2), Worksheets("Data").Cells(i, 1), ""), Worksheets("Data").Cells(i, 1), "Summary", "A1")
If IsError(test1) Then
test3 = GetInfoFromClosedFile(Replace(Worksheets("Data").Cells(i, 2), Worksheets("Data").Cells(i, 1), ""), Worksheets("Data").Cells(i, 1), "List1", "A1")
If IsError(test3) Then
Worksheets(jmeno2).Cells(x, 15) = "xxx"
Else
jmeno_listu = "List1'!$Z$7"
Worksheets(jmeno2).Cells(x, 16).FormulaLocal = "=" & "'" & _
Left(test_cesta, InStrRev(test_cesta, "\")) & "[" & _
Right(test_cesta, Len(test_cesta) - InStrRev(test_cesta, "\")) _
& "]" & jmeno_listu
Worksheets(jmeno2).Cells(x, 16).Value = Worksheets(jmeno2).Cells(x, 16).Value * 3600
If Round(Val(Worksheets(jmeno2).Cells(x, 16)), 2) <> Round(Val(Worksheets(jmeno2).Cells(x, 13)), 2) Then
Worksheets(jmeno2).Cells(x, 16).Font.Color = RGB(255, 0, 0)
Else
Worksheets(jmeno2).Cells(x, 16).Font.Color = RGB(0, 255, 0)
End If
End If
Else
jmeno_listu = "Summary'!$J$13"
jmeno_listu2 = "Summary'!$O$12"
Worksheets(jmeno2).Cells(x, 15).FormulaLocal = "=" & "'" & _
Left(test_cesta, InStrRev(test_cesta, "\")) & "[" & _
Right(test_cesta, Len(test_cesta) - InStrRev(test_cesta, "\")) _
& "]" & jmeno_listu
Worksheets(jmeno2).Cells(x, 15).Value = Worksheets(jmeno2).Cells(x, 15).Value
Worksheets(jmeno2).Cells(x, 16).FormulaLocal = "=" & "'" & _
Left(test_cesta, InStrRev(test_cesta, "\")) & "[" & _
Right(test_cesta, Len(test_cesta) - InStrRev(test_cesta, "\")) _
& "]" & jmeno_listu2
Worksheets(jmeno2).Cells(x, 16).Value = Worksheets(jmeno2).Cells(x, 16).Value
' If Worksheets(jmeno2).Cells(x, 15).Value = "" Then
' Worksheets(jmeno2).Cells(x, 15).Value = 1
' Else
' Worksheets(jmeno2).Cells(x, 15).Value = Worksheets(jmeno2).Cells(x, 15).Value
' End If
If Round(Val(Worksheets(jmeno2).Cells(x, 16)) * Val(Worksheets(jmeno2).Cells(x, 15)), 2) <> Round(Val(Worksheets(jmeno2).Cells(x, 13)), 2) Then
Worksheets(jmeno2).Cells(x, 16).Font.Color = RGB(255, 0, 0)
Else
Worksheets(jmeno2).Cells(x, 16).Font.Color = RGB(0, 255, 0)
End If
End If
DoEvents
Exit For
End If
Application.StatusBar = "3. (Checking of data) Progress: " & x - 1 & " of " & lastrow - 1 & ": " & Format((x - 1) / (lastrow - 1), "0%") & " | "
' Application.StatusBar = "Progress: " & Format((x - 1) / (lastrow - 1), "0%")
DoEvents
test_str = Nothing
test1 = Nothing
test3 = Nothing
Next i
' End If
DoEvents
Application.CutCopyMode = False
ThisWorkbook.Save
Next x

x = Empty
y = Empty
yy = Empty
lastrow = Empty

Application.StatusBar = False
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True

ThisWorkbook.Save
End Sub


soubor dát nemůžu, obsahuje firemní data a linky na externí soubory, tzn. stejně by to nefungovalo.

Dokázal by někdo poradit jak upravit makro tak aby využívalo méně systémových prostředků? Mám 64bit Win7 ale 32bit Excel. Makro jsou 2 cykly, jeden prochází cca 9000 řádků a na každém spustí cyklus který prochází dalších cca 2500 řádků v jiném listu. Porovnávají se záznamy a vkládají se odkazy na jiné soubory pomocí vzorců. Makro běží několik hodin ale nikdy nedoběhne protože se zaplní paměť (cca 1,6GB) a Excel zkolabuje, výsledek nelze uložit, nic.


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