zapiranje okna

Pomoč pri izdelavi makrov
Odgovori
matjaz
Prispevkov: 32
Pridružen: So Jan 27, 2007 11:19 pm

zapiranje okna

Odgovor Napisal/-a matjaz »

pozdravljeni

imam malo težavico,upam pa ,da za vas ne bo prehudo.
z makrom kličem naslednje:

Workbooks.Open Filename:=Application.GetOpenFilename

no, včasih to okno izklopim na krizcu,nakar mi makro javi napako.
torej,kaj storiti,da se okno zapre brez javljanja napake.(še bolj elegantno bi bilo, če bi se mi ob tem dejanju zaprl kar cel delovni zvezek
za odgovor se vam najlepše zahvaljujem.
lp
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

Ha, kaj pa funkcija GetOpenFileName vrne, če zaprete okno...? Vrne false in to ni Excelova datoteka, zato jo slednji pač ne more odpreti in javi napako. Bo potrebno najprej prebrati ime v neko spremenljivko in nato če je vse OK šele odpreti datoteko, če pa datoteka ni izbrana pa vseskupaj pač zapreti (takšnaje vaša želja):

Koda: Izberi vse

    Dim IzbranaDatoteka
    
    IzbranaDatoteka = Application.GetOpenFilename
    If (IzbranaDatoteka <> False) Then
        Workbooks.Open Filename:=IzbranaDatoteka
    Else
        ThisWorkbook.Close
    End If
lp,
Matjaž Prtenjak
Administrator
matjaz
Prispevkov: 32
Pridružen: So Jan 27, 2007 11:19 pm

Odgovor Napisal/-a matjaz »

pozdravljen Matjaž

hvala za vašo razlago in rešitev,ki mi je precej logična ,le kot kodo tega nisem znal napisat.ko mi zmanjka idej , je vaš forum res dobra rešitev.
s spoštovanjem
lp
matjaz
Prispevkov: 32
Pridružen: So Jan 27, 2007 11:19 pm

Odgovor Napisal/-a matjaz »

pozdravljen Matjaž

že spet ne gre.... :roll:
rad bi nadaljeval z vprašanjem,katerega sam ne znam rešiti.
v programu imam uporabljeno eno od vaših kod,ki ste jo nekoč napisali in se glasi takole:
Dim PotDoDatotek As Variant
Dim ImeNoveDatoteke As String
Dim i As Byte
PotDoDatotek = Application.GetOpenFilename(MultiSelect:=True)
If IsArray(PotDoDatotek) = True Then
'Workbooks.Add
ImeNoveDatoteke = ActiveWorkbook.Name
For i = LBound(PotDoDatotek) To UBound(PotDoDatotek)
Workbooks.OpenText Filename:=PotDoDatotek(i), _
Origin:=xlWindows, _
StartRow:=1, _
DataType:=xlDelimited, _
TextQualifier:= _
xlDoubleQuote, _
ConsecutiveDelimiter:=True, _
Tab:=True, _
Semicolon:=False, _
Comma:=False, _
Space:=True, _
Other:=False, _
FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1))
ActiveWorkbook.Sheets(1).Move Before:=Workbooks(ImeNoveDatoteke).Sheets(1)
Next i
End If
v to kodo pa bi rad vklučil še:
-v kolikor ne izberem datoteke in pritisnem gumb odpri,potem naj se okno
in program zapre
in drugo:
-v kolikor pritisnem na križec,potem naj se okno in program zapre(torej enako,kot v prvem primeru)
(sodelavci kiksajo in tudi jaz)
kot sem že rekel,sem zadevo skušal spremeniti in vključiti vašo včerajšno
rešitev,toda joj... :? naredil sem pravo zbrko.
prepričan sem ,da gre vam bolje od rok.
za pomoč se zahvaljujem
lp
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

:( Sem iskal neko tematiko in videl, sa sem tole vprašanje spregledal....

No tukaj je odgovor:

Koda: Izberi vse

    Dim PotDoDatotek As Variant
    
    PotDoDatotek = Application.GetOpenFilename(MultiSelect:=True)
    If Not (IzbranaDatoteka <> False) Then
        ThisWorkbook.Close
        Exit Sub
    End If
    
    Dim ImeNoveDatoteke As String
    Dim i As Byte
    
    If IsArray(PotDoDatotek) = True Then
PS: Če odgovora ne dobite par dni, dopišite kaj v tematiko in tako bo "splavala" na vrh, kjer jo bomo hitreje opazili.
lp,
Matjaž Prtenjak
Administrator
matjaz
Prispevkov: 32
Pridružen: So Jan 27, 2007 11:19 pm

Odgovor Napisal/-a matjaz »

pozdravljen Matjaž

nebi rad bil preveč siten,vendar,če se še tako trudim,nikakor ne znam
vključiti vaše zadnje kode v primer,ki sem ga zgoraj navedel.koda ki sem jo navedel(in je vaša),mi deluje ok,vendar tega vašega primera ne znam
uporabiti.
napisali ste

Koda: Izberi vse

Dim PotDoDatotek As Variant 
    
    PotDoDatotek = Application.GetOpenFilename(MultiSelect:=True) 
    If Not (IzbranaDatoteka <> False) Then 
        ThisWorkbook.Close 
        Exit Sub 
    End If 
    
    Dim ImeNoveDatoteke As String 
    Dim i As Byte 
    
    If IsArray(PotDoDatotek) = True Then
kaj pomeni:
If IsArray(PotDoDatotek) = True Then
kaj sledi nato :?:
za znoret..
upam,da se me boste usmilili.
za odgovor se zahvaljujem.
lp
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

:cry: :cry: Oh, dajte no, malo se pa tudi lahko potrudite. Kaj mislite kam morate dati to kodo??? Ja v vaš makro, kam pa drugam? Gre pač za to, da nisem pošiljal celotnega makra, če se spremeni samo majehn del :?

Torej (vaša poslana koda):

Koda: Izberi vse

Dim PotDoDatotek As Variant
Dim ImeNoveDatoteke As String
Dim i As Byte
PotDoDatotek = Application.GetOpenFilename(MultiSelect:=True)
If IsArray(PotDoDatotek) = True Then
'Workbooks.Add
ImeNoveDatoteke = ActiveWorkbook.Name
For i = LBound(PotDoDatotek) To UBound(PotDoDatotek)
Workbooks.OpenText Filename:=PotDoDatotek(i), _
Origin:=xlWindows, _
StartRow:=1, _
DataType:=xlDelimited, _
TextQualifier:= _
xlDoubleQuote, _
ConsecutiveDelimiter:=True, _
Tab:=True, _
Semicolon:=False, _
Comma:=False, _
Space:=True, _
Other:=False, _
FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1))
ActiveWorkbook.Sheets(1).Move Before:=Workbooks(ImeNoveDatoteke).Sheets(1)
Next i
End If
Moja poslana koda:

Koda: Izberi vse

    Dim PotDoDatotek As Variant
   
    PotDoDatotek = Application.GetOpenFilename(MultiSelect:=True)
    If Not (IzbranaDatoteka <> False) Then
        ThisWorkbook.Close
        Exit Sub
    End If
   
    Dim ImeNoveDatoteke As String
    Dim i As Byte
   
    If IsArray(PotDoDatotek) = True Then 
In skupaj (zamikov nisem popravljal, čeravno si ne predstavljam kako ste iz kakeršnekoli moje kode dobili skrpucalo brez presledkov in brez repa in glave) - Spremenjenih je prvih 5 vrstic!:

Koda: Izberi vse

   Dim PotDoDatotek As Variant
   
    PotDoDatotek = Application.GetOpenFilename(MultiSelect:=True)
    If Not (IzbranaDatoteka <> False) Then
        ThisWorkbook.Close
        Exit Sub
    End If
   
    Dim ImeNoveDatoteke As String
    Dim i As Byte
   
    If IsArray(PotDoDatotek) = True Then ' tu se pač nadaljuje vaša koda
'Workbooks.Add
ImeNoveDatoteke = ActiveWorkbook.Name
For i = LBound(PotDoDatotek) To UBound(PotDoDatotek)
Workbooks.OpenText Filename:=PotDoDatotek(i), _
Origin:=xlWindows, _
StartRow:=1, _
DataType:=xlDelimited, _
TextQualifier:= _
xlDoubleQuote, _
ConsecutiveDelimiter:=True, _
Tab:=True, _
Semicolon:=False, _
Comma:=False, _
Space:=True, _
Other:=False, _
FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1))
ActiveWorkbook.Sheets(1).Move Before:=Workbooks(ImeNoveDatoteke).Sheets(1)
Next i
End If
lp,
Matjaž Prtenjak
Administrator
matjaz
Prispevkov: 32
Pridružen: So Jan 27, 2007 11:19 pm

Odgovor Napisal/-a matjaz »

pozdravljen

hja,Matjaž,saj,saj .... sem točno to počel,kar ste sedaj tudi vi napisali,vendar ker mi ni pravilno delovalo, sem mislil,da delam narobe.
namreč,ko izberem datoteko,mi v trenutku zapre okno.to je problem.
torej:
-če ugasnem na križec-se zvezek zapre(pravilno)
-če ne izberem datoteke in kliknem odpri,potem se zvezek zapre(zopet pravilno)
-če izberem datoteko,potem se zvezek zapre(to je nepravilno).

no,tu pa sem res prekratek. :(
zanima me ,kje je napaka?
za odgovor se zahvaljujem.
lp
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

Ja, napačen je IF stavek, saj se sprašuje na nekaj, kar ni nikjer defirano (posledica tega, da kode ne testiram, temveč jo pišem kar v forum). If stavek:

Koda: Izberi vse

    If Not (IzbranaDatoteka <> False) Then 
Zamenjajte z sledečim if stavkom:

Koda: Izberi vse

    If Not (PotDoDatotek <> False) Then 
Spremenljivka IzbranaDatoteka ni nikjer inicializirana (v kodi se je znašla, ker sem popravljal kar mojo prvo posredovano kodo, ki pa je polnila spremenljivko IzbranaDatoteka....)
lp,
Matjaž Prtenjak
Administrator
matjaz
Prispevkov: 32
Pridružen: So Jan 27, 2007 11:19 pm

Odgovor Napisal/-a matjaz »

pozdravljen Matjaž

naj povem,da sem to napako v kodi tudi sam opazil,vendar raje molčim,ker pač nisem preveč siguren vase,toda glej ga zlomka,tudi ko sem zamenjal IF stavek,mi javi:
Run-time error '13':
type mismatch
in se ustavi na :

Koda: Izberi vse

If Not (PotDoDatotek <> False) Then 
ne znam kaj dosti z makri,toda res mi ni jasno,zakaj se ustavlja,saj je vendar sedaj vse pravilno definirano.koda mi je celo logična,toda navkljub vsemu, sem ostal brez idej :( .
kje mislite,da grešim?
(sedaj pravilno deluje le,ko ugasnem na križcu)
za odgovor se zahvaljujem.
lp
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

:) Sem moral dati kodo v Excel in pač resnično poizkusiti, kaj sploh dela. Ja, problem je v možnosti izbire več datotek hkrati... No spodaj imate kodo, ki pa sedaj zagotovo dela, saj sem jo prizkusil:

Koda: Izberi vse

  Dim PotDoDatotek As Variant
  
  PotDoDatotek = Application.GetOpenFilename(MultiSelect:=True)
  If IsArray(PotDoDatotek) Then
    Dim datoteka
    For Each datoteka In PotDoDatotek
      ' sem gre vaša koda, ki obdela posamezno datoteko
    Next
  Else
    ThisWorkbook.Close
  End If
lp,
Matjaž Prtenjak
Administrator
matjaz
Prispevkov: 32
Pridružen: So Jan 27, 2007 11:19 pm

Odgovor Napisal/-a matjaz »

no,pa smo uspeli :D

hvala,Matjaž
kar se mene tiče,je blo kar komplicirano.gremo novim zmagam
na proti.
lp
Odgovori