Myslim, ze pokud nahradis ten zbytecny udalostni kod na liste1 obycejnym podminenym formatovanim, tak to bude fachcit. Ale nepochopil jsem, jestli chces odeslat maily za kazdou zakazku >24 dnu (tedy zde bude muset byt kodova smyckla pres vsechny aktivni radky ve sloupci "D") anebo nerozumim cos myslel tim, ze ve sloupci E ti to funguje?
pokud chces znat nazvy pojmenovanych oblasti, tak takhle:
ActiveWorkbook.Names(i).NameLocal
Ale klidne se konkretni oblast muzes odkazovat i pomoci Names i pomoci NameLocal:
Range(ActiveWorkbook.Names(i))
Range(ActiveWorkbook.Names(i).NameLocal)
Tak fajn.
Ale vidim drobny rozpor: ve zdrojovem souboru pises, ze je 35 radku, ale v priloze je tech radku min. Pak tam mas taky ve sloupci A nazev zdrojoveho souboru a vubec ta data zacinaji az ve tretim sloupci. Tedy potreboval bych vedet, jak ma vypadat vysledek po stazeni ze dvou ruznych zdrojaku. Ma ten nazev souboru byt v kazdem radku (abys mohl odlisit/filtrovat), hodilo by se i zahlavi, ma byt mezi jednotlivymi dny volny radek, podle ktereho sloupce jednoznacne zjistim posledni radek (abych vedel kam pripisovat dalsi data)... Tedy zkus poslat poradnou prilohu, ja fakt nedokazu vsechno uhodnout
No asi se ti podarilo vylit s vanickou i dite, nebot ten zminovany kod casovace v modulu chybi.
Pokud by sis chtel ten sesit zalohovat, tak dej do ThisWorkbook nasledovny kod. Ten pri otevirani sesitu vytvori jeho zalohu na libovolnem miste, pricem na tomto miste bude 5 zaloh, ktere se budou postupne prepisovat, pokud od posledni zalohy uplynula urcita doba (zde jeden den). Je to pro stary excel, takze pokud budes ve formatu .xlsm, budes muset ten kod lehce upravit. Tech zaloh muzes mit kolik chces, ale musis je poprve na zalohovacim fleku vytvorit rucne, teprve pak se zacnou dokolecka prepisovat.
Private Sub Workbook_Open()
Dim Jmeno As String, Jmeno1 As String, Cesta As String
Dim Datum1 As Date, Max_Datum As Date, Min_Datum As Date
Dim Nejstarsi As Integer, Nejmladsi As Integer
Dim Cas, i%, Rozdil As Double
'kdyby ho mìl už nìkdo otevøený
If ActiveWorkbook.ReadOnly = True Then
MsgBox "Pozor, nìkdo už má tento soubor otevøený"
Exit Sub
End If
'když se to otevírá na PC doma, a se nic nedìje
If Application.UserName = "MD_doma" Then Exit Sub
'kdybychom otevírali záložný soubor, a se nic nedìje
If Left(Jmeno1, 4) = "Zal_" Then Exit Sub
Jmeno1 = ThisWorkbook.Name
Max_Datum = 100000
Min_Datum = 0
'musíme ze jména odstranit ".xls"
i = Len(Jmeno1)
Jmeno = Left(Jmeno1, i - 4)
'pøed to vložíme "Zal_" jako záloha
Jmeno = "Zal_" & Jmeno
'zadáme cestu, kam ukládáme zálohu
Cesta = "\\Server01\work_level\Zaloha\"
'tento cyklus projede všechny oèíslované záložné soubory a zjistí _
který je nejstarší a nejmladší
i = 1
Do
Jmeno1 = Cesta & Jmeno & i & ".xls"
'On Error Resume Next
If Dir(Jmeno1) = "" Then Exit Do
'On Error GoTo 0
Datum1 = FileDateTime(Jmeno1) * 1
If Datum1 < Max_Datum Then
If Datum1 > Min_Datum Then
Min_Datum = Datum1
Nejmladsi = i
End If
Max_Datum = Datum1
Nejstarsi = i
Else
If Min_Datum < Datum1 Then
Min_Datum = Datum1
Nejmladsi = i
End If
End If
i = i + 1
Loop
'kdyby nebyl nalezen žádný takový soubor, dej hlášku
If i = 1 Then
MsgBox "na místì " & Cesta & vbCr _
& " nebyly nalezeny záložné soubory" & vbCr & _
"Kontaktuj programátora"
Exit Sub
End If
'Nastavení minimálního intervalu zálohování 1 = 1 den
'porovnáme èas uložení nejmladšího a nynìjší èas
Cas = CDbl(FileDateTime(Cesta & Jmeno & Nejmladsi & ".xls"))
'zjisti rozdíl èasù
Rozdil = CDbl(Now) - Cas
'nápis ve stavovém øádku
Application.DisplayStatusBar = True
Application.StatusBar = "Poslední záloha byla uložena pøed " & Format(24 * Rozdil, "#0,0") & " hod"
If Rozdil > 1.5 Then
'pøepiš nejstarší zálohu
ActiveWorkbook.SaveCopyAs Cesta & Jmeno & Nejstarsi & ".xls"
End If
'vrátime excelu kontrolu nad stavovým rádkem
Application.StatusBar = False
Application.ScreenUpdating = True
End Sub
Pridal jsem do tveho souboru jedno makro. Rad bych, kdybys zkusil jestli to funguje - tedy zdali to vrati data z externiho souboru. Jestli ano, tak ti poslu cele makro, tak jak jsi ho popsal
To je strasne malo informaci. Posli nejakou ukazku vcetne toho kodu
Aha sorry, nedbale jsem precetl prispevek. Jasne, ale nevim jakou mas verzi excelu. V mych 2010 US verzi to je Options - Advanced - fajfka Enable AutoComplete for cell values
Data - overeni bunek - tam v karte nastavis vse potrebne
Prvnim krokem bude otestovat, jestli ti funguje makro v prilozenem souboru. Zdrojovy sesit bohuzel nema databazovou strukturu, takze ty sumy v SQL neudelame, ale recordset byl schopen pojmout i takhle rozsypane data, kupodivu skousl i ty sloucene bunky a nazev listu s mezerou a diakritikou (coz drive delavalo paseku). Pokud by ti to hazelo chybu, zkus tyto dve veci zmenit.
Idea je takova, ze bys v sumarnim sesite nemel vzorce s odkazy na jednotlive soubory, ale aktualizovane hodnoty z tech zdrojovych souboru. Tedy makro by si postupne sahlo na kazdy externi soubor pomoci ADODB techniky, vlozilo recordset se zdrojovymi hodnotami na pomocny list (ten klidne muze byt skryty) a spocitalo by co je potreba...
Ale zakladem je odladit to spojeni, pokud tedy bys souhlasil s navrzenym scenarem. I kdyby ne, napis, jestli se to spojeni na externi file podarilo.
No neni od veci, kdyz vime jakou ma zdrojovy sesit strukturu, ale spis bych uvital spominany sumarni sesit s temi odkazy, ktere je potreba aktualizovat a s vyplnenymi bunkami, ze kterych se da vycist nova cesta.
No nevim, jestli pro tento pripad to reseni, co jsem mel na mysli, bude idealni. Jestli ty zdrojove soubory maji databazovou povahu, tedy prvni radek tabulky = nadpis a ostatni radky tabulky jsou data, tak ano. Ale spis naznacujes, ze si chces ve zdrojovem sesitu sahnout pouze na nejakou konkretni bunku/y kde jsou nejake sumarizace. Btw. maji ty bunky ve vsech sesitech stejnou adresu anebo alespon definovany nazev bunky?
kdybys dal do sloupce A vzorec:
=COUNTIF(B2:M2,"x"), tak zjistis pocet "x" v danem radku.
Roztahni ten vzorec dolu a podle nejvyssiho cisla (muzes pouzit filtr) se rychle zorientujes.
Tezko radit konkretne bez vzoroveho souboru, ale zde se partne jedna o doplneni dane moznosti do zdroje onoho vybiraciho prvku. Ale nevim jestli to je delane pres overeni dat anebo je to listbox na liste ci ActiveX listbox. U kazdeho je to jinak
Tak urcite :)
Udalosti listu se vztahuji pouze na dany list.
Pokud myslis udalosti na urovni sesitu, tak bych ty listy vyjmenoval asi takhle:
IF Instr(1,"Leden, Brezen, Prosinec", ActiveSheet.Name)=0 then Exit Sub
Na toto pouzivam funkci COUNTIF(oblast;"D")
Dokonce pocitam i puldny dovolenky, kde mam ale zaruceno, ze se to pise vzdy stejne, v mem pripade takhle: "D/2"
A pokud se to dejme tomu ta data na soucet nachazeji v oblasti B3:B34, tak souctovy vzorec za dny dovolenky bude:
=COUNTIF(B3:B34;"D")+COUNTIF(B3:B34;"D/2")/2
Pokud to chces na hodiny, tak to jeste vynasob *7,5
Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.
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.