< návrat zpět
MS Excel
Téma: Databanka
Zaslal/a Dejavu 14.9.2012 21:45
Zdravím všechny místní Guru,
5eším nyní tento problém a bohužel si nevím rady..
Jedná se o to, že mé dva stejné sešity umístěné na 2 PC používají poznámky typu (1. kus, 1. kus opeace 10, 1. kus operace 20 atp..) dále obsahují jména pracovníků a jejich čísla razítek. Dat může být max. na 200-300 řádků, více neočekávám..
Chci se vyvarovat toho, aby se poznámky psaly pokaždé jinak, proto ten seznam... a aby byly stejné, musím mít jejich databázi, ale vždy se může objevit nějaká nová poznámka, proto bych potřeboval, aby se přidávaly poznámky z obou sešitů do stejného souboru, který bude na síťovém disku a odtud si pak zpětně budou tato data tahat..
Bude to fungovat tak, že na každém z oněch 2 PC bude vzorová evidence, která se bude kopírovat, když bych tedy přidal poznámku normálně, uložila by se mi jen do té jedné dané evidence, ale vzorový sešit by tuto změnu již nezaznamenal...
Zatím jsem z internetu vytlačil toto, ale jsem začátečník ve VBA a makro nemohu rozběhnout, tak snad s tím něco zmůžete vy...
Dim CestaSouborDatabanka As String
Sub NacistData()
'cesta k sešitu se zdroji dat
CestaSouborDatabanka = ThisWorkbook.Path & "\databanka.xls"
PoleData = ZiskejDataTyp0("List Data")
PoleDataPrvniZaznam = Split(ZiskejDataTyp0("List Data")(0), ";")
PoleJmena = ZiskejDataTyp1("List Data", "JMENO")
End Sub
Function ZiskejDataTyp0(List As String)
'Tools / References / Microsoft ActiveX Data Objects Library x.x
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim str As String
Dim Dotaz As String
Dim Pole
'navázání spojení
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & CestaSouborDatabanka & ";" & _
"Extended Properties=""Excel 8.0;"""
'sestavení SQL dotazu
'vyber veškerá data
Dotaz = "SELECT * FROM [" & List & "$];"
Debug.Print Dotaz
rs.Open Dotaz, _
cn, adOpenKeyset, adLockOptimistic
rs.MoveFirst
str = rs.GetString(adClipString, , ";", vbCrLf)
str = Left(str, Len(str) - 2)
Pole = Split(str, vbCrLf)
ZiskejDataTyp0 = Pole
'ukončení spojení a uvolnění z paměti
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
End Function
Function ZiskejDataTyp1(List As String, Sloupec As String)
'Tools / References / Microsoft ActiveX Data Objects Library x.x
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim str As String
Dim Dotaz As String
Dim Pole
'navázání spojení
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & CestaSouborDatabanka & ";" & _
"Extended Properties=""Excel 8.0;"""
'sestavení SQL dotazu
'vyber neprázdné, neduplicitní,
'vzestupně seřazené položky daného sloupce
Dotaz = "SELECT DISTINCT " & Sloupec & _
" FROM [" & List & "$] WHERE " & _
Sloupec & "<>'' ORDER BY " & Sloupec & ";"
Debug.Print Dotaz
rs.Open Dotaz, _
cn, adOpenKeyset, adLockOptimistic
rs.MoveFirst
str = rs.GetString(adClipString, , ";", vbCrLf)
str = Left(str, Len(str) - 2)
Pole = Split(str, vbCrLf)
ZiskejDataTyp1 = Pole
'ukončení spojení a uvolnění z paměti
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
End Function
Kód se mi vždy zastaví v tomto místě :
rs.Open Dotaz, _
cn, adOpenKeyset, adLockOptimistic
Předem děkuji za jakoukoliv radu.
Uzamčeno - nelze přidávat nové příspěvky.
kp57(15.9.2012 22:26)#009510 Už jsi rozhodnutý, že databanka bude XLS?
Nebo se pak rozmyslíš a bude CSV?
A co záznamník maker. Ten ti nenapoví?
citovat
Dejavu(16.9.2012 8:19)#009512 No, rozhodnutý nejsem, ale takto by to mělo také fungovat... bohužel to neběží a nevím kde je háček...
Co se záznamníku týká, tak s ním nevím, jak bych si pomohl vzhledem k tomu, že nechci daný sešit popřípadě CSV otevírat...
citovat
Jeza.m(17.9.2012 20:27)#009519 jen jestli to dobře chápu.
Síťový soubor sloužící jako zdroj unikátních údajů
Soubor na jiném pc, který se vyplňuje, a jistá data si na základě nějaké zadané hodnoty doplní ze zdrojového souboru, pokud ale neexistují, tak se zadají ručně při čemž by se měly zapsat automaticky do toho zdrojového soubory, aby příště již byly doplněny automaticky? To samé pro další soubor na jiném pc.
Bylo by možné přiložit ty soubory?
Případně znění toho Dotazu.
M@
citovat
Dejavu(17.9.2012 21:46)#009520 Přesně tak, chápeš správně :)
Soubory přiložit mohu, ale nejsem si jist, zda by to k něčemu bylo, zkrátka :
Mám poznámky v souboru na síťovém disku, na dalších dvou PC mám na disku "C" další soubor, kde se vyplňuje evidence. Jsou tam poznámky, které operátor vyplňuje, pokud již poznámka existuje, operátor ji jen vybere ze seznamu. Pokud neexistuje, operátor ji přez dialog přidá a poznámka se do sešitu uloží (je umístěna na jiném listu). Neuloží se však do onoho síťového souboru, který funguje jako jakási databanka. Takže když se pak onen soubor druhý den zkopíruje, nejsou zde nové poznámky a musí se opět přidat a takto každý den...
Snad to takto pomohlo, kdyby to ani tak nebylo jasné, přiložím tedy soubor.
Díky Dejavu
citovat
Jeza.m(18.9.2012 7:08)#009521 Lepší to bude s těmi soubory.
Podle posledního popisu to vypadá že se nová poznámka na síť nemá ukládat, nebo? Uloží se jen v daném souboru na jiný list pro další použití pouze do přepsání souboru, což se děje z nějakého vzoru a tento si načítá vždy původní seznam z databanky.
Ten seznam poznámek je jen seznam, nebo se v něm dle nějakých kritérií vyhledává.
Pokud jde jen o statický seznam, tak pak by se dalo použít vestavěného načtení dat přes ms query přímo v excelu, což by se načítalo na jiný list vždy při spuštění. Ale chce to přesně pochopit o co jde.
M@
citovat
Dejavu(18.9.2012 10:21)#009522 Dobrá tedy, v příloze zasílám soubor.
Je jen jeden, protože tento soubor se právě bude kopírovat. Bude to tedy ten vzorový, který si bude načítat data z oné databanky. Možná sem to špatně vyjádřil za což se omlouvám...
Takže ano, síťový soubor (databanka) slouží jako zdroj unikátních údajů.
Soubor (viz. příloha) má na databanku data (před uzavřením sešitu asi...) ukládat, ovšem duplicitní hodnoty eliminovat. A při každém spuštění souboru tyto data zároveň porovnat a případně stáhnout z databanky. Nebo bude možná lepší jen upravit makro pro přidání poznámky, aby se poznámka, či jméno a číslo operátora přidali do sešitu i do databanky...
list s hodnotami najdeš tak, že klikneš pravým tlačítkem v tabulce , vybereš seznam, poté only admin, heslo je zatím admin...
Pak už uvidíš data, která potřebuji v databance.
Takže jednoduše, tato data se musí po přidání makrem uložit v tomto listu( to běží) a zároveň se musí uložit v databance a při otevření sešitu se tato data musí porovnat s databankou a případně se z databanky musí chybějící přidat sem. ( bez duplicit)
Díky Dejavu
Příloha: 9522_evidence-kontroly.rar (70kB, staženo 25x) citovat
Jeza.m(18.9.2012 21:22)#009529 Tak to zkus.
Udělal jsem vlastní "databanku" ke které se v pracovním souboru adresa uvádí na listu DB v buňce G1.
V pracovním souboru je modul s makrem pro načtení dat z databanky a pro přidání do databanky, což si můžeš upravit dle potřeby. Přidání do databanky proběhne ihned po zadání a to tak, že si nejprve stáhne aktuální data, porovná je s novou hodnotou a pokud neexistuje, tak přidá do databanky a hned na to si opět stáhne data.
Seznam na zadávacím listu jsem udělal jen v těch prvních 3 řádcích a to pomocí pojmenovaných oblastí odkazujících se na oblasti kam se načítají data z databáze.
Co jsem neudělal je volání načítacího makra po spuštění, ale to věřím, že zvládneš.
A možná tě pojmenované oblasti na jiném listu inspirují tak, že na tom zadávacím listu zruším ty skryté sloupce :-)
M@
M@
Příloha: 9529_databanka.zip (79kB, staženo 25x) citovat
kp57(18.9.2012 23:32)#009530 Taky jsem ti napsal něco pro inspiraci.
Příloha: 9530_evidence.rar (91kB, staženo 27x) citovat
Dejavu(19.9.2012 9:44)#009531 Perfektní, děkuji oběma za snahu pomoci, prošel jsem obě řešení a nakonec jsem se rozhodl pro řešení od KP57, protože vyhovovalo plně mým potřebám,tak doufám, že se Jeza.M nebude zlobit...
Jen bych se ještě rád zeptal, čím mám nahradit řádek:
NameCSV = ThisWorkbook.Path & "\cesta k souboru\soubor.csv"
Když je daný soubor umístěn jinde, nežli daná složka..
Sice možná hloupý dotaz, ale jakožto VBA téměř nepolíbený se až tak moc nestydím :)
Jinak ještě jednou velké díky oběma, toto bych asi nikdy nedal dohromady...
Dejavu
citovat
Jeza.m(19.9.2012 10:55)#009532 Zlobit se nebude :-).
relativní adresu
NameCSV = ThisWorkbook.Path & "\cesta k souboru\soubor.csv"
změníš na absolutní
NameCSV = "\\SERVER\SLOŽKA\SOUBOR.CSV"
M@
citovat