shranjevanje dokumentov - vba

Pomoč pri izdelavi makrov
Odgovori
borut_p
Prispevkov: 3
Pridružen: Po Avg 15, 2011 10:30 pm

shranjevanje dokumentov - vba

Odgovor Napisal/-a borut_p »

Spoštovani.

Tudi sam se ljubiteljsko ukvarjam z ustvarjanjem macrojev v excelu. Trenutno sem se ustavil pri shranjevanju word dokumenta, ki ga ustvarimo preko excela. Ustvarijen makro, preko vnešenih podatkov v excel, samodejno s funkcijo 'saveas' avtomatsko shrani datoteko v "Filename:=ThisWorkbook.Path & "\" & ime". Slednje je z error handlingom možno tudi, če datoteka z istim imenom že obstaja. Naletel sem pa na težavo, če datoteka že obstaja in je tudi že odprta. Tu se makro sesuje. Iskal sem možnosti kot so zapri wordov dokument, če ima isto ime ter nato saveas funkcijo, ki povozi obstoječ dokument, vendar mi ni uspelo.
Zanima me, ali vi veste kako bi to lahko izpeljal.
Druga možnost je enostavna fukcija 'save', ki bi v odprtem pogovornem oknu za shranjevanje (default windows okno), direktorij shranjevanja že nastavil na želenega, prav tako ime datoteke. Samo stisniti bi bilo potrebno še tipko "Save".

Hvala in lep pozdrav
Borut
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Re: shranjevanje dokumentov - vba

Odgovor Napisal/-a admin »

Pozdravljeni,

Moram priznati, da ne zadnjega dela vašega vprašanje nisem natančno razumel, a kolikor razumem, želite samo shraniti neko datoteko pod določenim imenom in imate problem, če datoteka že obstaja oz. še hujši problem, če je konkretna datoteka tudi že odprta. Ne vem sicer kakšno zvezo ima z vsem tem Word... a povrniva se k vprašanju:

Torej vi morate izvesti sledeče:
  1. Vprašati se če datoteka na disku obstaja.
  2. Če obstaja pogledati ali je odprta
  3. Če je odprta jo zapreti
  4. Če je obstajala jo zbrisati
  5. (V tem trenutku torej datoteke ni na disku) in zato jo lahko posmanete.
Torej:

Koda: Izberi vse

  If (datoteka_obstaja) then
    if (je_odprta) then Zapri_datoteko
    pobriši_datoteko
  end if
  Shrani_datoteko
Če torej to prevedemo v VBA kodo pa dobimo sledeče (same kode nisem preizkušal, temveč jo pišem iz glave in lahko da je kakšna napakica!):

Koda: Izberi vse

Sub shrani(potDoDatoteke As String, imeDatoteke As String)
  If (Dir(potDoDatoteke & "\" & imeDatoteke) <> "") Then
    On Error Resume Next
    Set zvezek = Workbooks(imeDatoteke)
    If Not zvezek Is Nothing Then zvezek.Close
  End If
  
  ActiveWorkbook.SaveAs Filename:=potDoDatoteke & "\" & imeDatoteke
End Sub
lp,
Matjaž Prtenjak
Administrator
borut_p
Prispevkov: 3
Pridružen: Po Avg 15, 2011 10:30 pm

Re: shranjevanje dokumentov - vba

Odgovor Napisal/-a borut_p »

Spoštovani.

Hvala za odgovor, bom pa poskušal bolje razložiti.
Cilj mojega makroja je ustvariti word dokument, vanj prepisati neke podatke iz excela ter potem tisti word dokument tudi shraniti. Do sedaj mi vse dela, vendar želim izvesti čim več varnostnih zank, saj programa ne bom uporabljal jaz ampak oče in ne želim, da se mu makro sesuva.
Se strinjam s kodo, ki ste jo podali
Set zvezek = Workbooks(imeDatoteke)
If Not zvezek Is Nothing Then zvezek.Close
, slednja bi verjetno delala za excel datoteko. Kako bi se ta del predelal v to, da bi zaprl odprti wordov dokument

Hvala in lep pozdrav
Borut
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Re: shranjevanje dokumentov - vba

Odgovor Napisal/-a admin »

Pozdravljeni,

Na žalost pa to za zapiranje, kontrolo ipd. Word-ovega dokumenta seveda ne bo delovalo! Za kontrolo Word-ovega dokumenta iz Excela je potrebno uporabljati objekt Word.Application, kar makro zelo zakomplicira. Koda bi recimo bila takšna:

Koda: Izberi vse

Sub test()
  Dim objWord As Object
  
  Set objWord = CreateObject("Word.Application")
  
  Dim dokument: Set dokument = objWord.Documents("test.doc")
  
End Sub
In po pričakovanju bi ta koda delovala, če bi bil v Wordu odprt dokument test.doc, sicer pa bi javila napako. Vendar pa se to ne zgodi, ker vrstica CreateObject(...) ustvari nov Wordov objekt in v njem te datoteke zagotovo ni odprte, četudi jo je uporabnik v Word-u odprl, saj uporabnikov Word ni tisti, ki ga kontrolirate vi...

V glavnem tu se makro v tolikor zakomplicira, de vam ne morem ponuditi rešitve temveč je slednja odvisna od konkretnega problema oz. od konkretnega postopka, ki ga rešujete oz. programirate...
lp,
Matjaž Prtenjak
Administrator
borut_p
Prispevkov: 3
Pridružen: Po Avg 15, 2011 10:30 pm

Re: shranjevanje dokumentov - vba

Odgovor Napisal/-a borut_p »

Spoštovani.

Za odpiranje dokumenta uporabljam podoben ukaz kot ste ga predlagali:

Koda: Izberi vse

dim wdDoc As Word.Document, wdapp As Word.Application
Set wdapp = CreateObject("Word.Application")
Set wdDoc = wdapp.Documents.Add(ThisWorkbook.Path & "\racun.dot")
Sem poiskusil s predlagano kodo, nekoliko modificirano, vendar excel očitno ne more kontrolirati odprte datoteke, vsaj ne z enostavnimi ukazi kot je wdapp.quit ali wddoc("....").close.

Tako mi namesto wddoc.saveas funkcije preostane le še wddoc.save funkcija. Ali mogoče veste, kako bi word aplikaciji predlagal v .save obrazcu ime datoteke ter direktorij shranjevanja. Word po osnovi predvidi prvo besedo dokumenta ter za direktorij \my documents.

Hvala in lep pozdrav
Borut
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Re: shranjevanje dokumentov - vba

Odgovor Napisal/-a admin »

Ravno to je tisto, kar sem vam želel sporočiti v prejšnjem odgovoru. Vendar pa situacija ni ravno takšna, kot jo vi opisujete. Gre preprosto za to, da neko datoteko, ki jo odprtete preko vaše VBA kode lahko zapirate, shranjujete... pač delate z njo karkoli želite

Ne morete pa (no seveda se da, vendar pa slednje zahteva že napredno znanje programiranja!) preko vaše VBA kode v Excelu kontrolirati odprtih dokumentov v Wordu, ki ga je uporabnik odprl ročno oz. ga ne kontrolirate vi.

No vaše vprašanje je bilo ali lahko v Save ukazu Wordu predložite tudi ime in pot. Odgovor je na žalost NE. To lahko določite samo v ukazu SaveAs in zato tudi ne razumem natančno, kaj vam pri Ukazu SaveAs ne ustreza.

A glede na vaša vprašanja in dosedanji potek pogovora vam preprosto predlagam, da naredite sledeče:
  1. Preverite ali datoteka že obstaja
  2. Če obstaja jo poskusite izbrisati
  3. Če se izbrisati ne da, javite napako in sporočite uporabniku, da ima datoteko odprto in naj jo zapre!
  4. Če ni bila odprta ste jo pač izbrisali
  5. Shranite datoteko
Spet vam prilagam nepreizkušeno VBA kodo, saj sem na dopustu in nimam vseh orodij...

Koda: Izberi vse

Sub shrani(celotnoImeDatoteke As String)
  If (Dir(celotnoImeDatoteke) <> "") Then
    On Error Resume Next
    Kill celotnoImeDatoteke
    If Err.Number <> 0 then
      MsgBox "Datoteka " & celotnoImeDatoteke & " je odprta! Prosim, zaprito jo in poskusite znova!"
      Exit sub
    end if
  End If
  
  ' na tem mestu lahko datoteko shranite z SaveAs saj ni razloga, da bi ob tem prišlo do napake
  ......
End Sub
lp,
Matjaž Prtenjak
Administrator
sdfpo
Prispevkov: 31
Pridružen: To Feb 02, 2010 9:06 pm

Re: shranjevanje dokumentov - vba

Odgovor Napisal/-a sdfpo »

Zdravo!
Pridruzil bi se z enim kratkim vprasanjem
Ali lahko uporabim SaveAs ukaz in ne definiram poti, imena datoteke in drugih podrobnosti, ampak bi se odprlo okno "Save As" in bi uporabnik to sam izbral kje in kako. (kot če bi v Excel 2010 kliknil gumb File -> Save As ...ostalo pa bi bilo prepuščeno uporabniku)
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Re: shranjevanje dokumentov - vba

Odgovor Napisal/-a admin »

Da; takole:

Koda: Izberi vse

  Sub test()
    Dim ime
    ime = Application.GetSaveAsFilename(FileFilter:="Excelove datoteke,*.xls*,Vse Datoteke, *.*", _
                                  Title:="Shrani datoteko")
 
  End Sub
lp,
Matjaž Prtenjak
Administrator
sdfpo
Prispevkov: 31
Pridružen: To Feb 02, 2010 9:06 pm

Re: shranjevanje dokumentov - vba

Odgovor Napisal/-a sdfpo »

Aha,... no ce prav razumem s tem jaz od uporabnika zahtevam da pove kje in kako hoče shranit in potem s tem lahko grem v ukaz SaveAs?
Imel sem idejo da bi samo napisal ukaz npr:Workbook.SaveAs in bi vse ostalo naredil excel sam, brez dodatne VBA kode.

Ampak nič zato, sem spet nekaj novega zvedel in se mi je postavilo eno bolj splošno vprašanje
Enako kot zgoraj bi lahko naredil z ukazom Application.FileDialog(msoFileDialogSaveAs), in me zanima v čem je razlika med tema načinoma? Vbistvu mi je vaš način bolj razumljuv, ko pa kaj iščen na internetu (tudi v kjnigah) pa večinoma najdem v tem drugem načinu

Je možno kje dobiti spisek vseh ukazov (in podrobnostih) ki so na voljo? mogoče celo z opisi zraven?

Hvala

marko
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Re: shranjevanje dokumentov - vba

Odgovor Napisal/-a admin »

Da, tako kot ste opisali vi, bi tudi šlo, a niste bili natančni. poklicati bi morali takole:

Koda: Izberi vse

Sub test()
  Application.FileDialog(msoFileDialogSaveAs).Show
End Sub
Razlika med načinom, ki sem vam ga povedal jaz in te p aje preprosta. V prvem primeru imate popolno kontrolo nad uporabnikom v drugem pa ne :)...

Kar pa se tiče ukazov pa si na žalost to predstavljate preveč preprosto. "Problem" je namreč v tem, da to niso ukazi v klasičnem pomenu besede, temveč so to objekti in teh objektov je VELIKOOOO - je p avsa dokumentacija na internetu. Do seznama objektov, ki so v samem Excelu pa najlažje dostopite tako, da pritisnete tipko VBA Editorju pritisnete tipko F2... in odpre se pandorina skrinjica ;)
lp,
Matjaž Prtenjak
Administrator
Odgovori