[excel-vba] excel weigert file te openen?

Pagina: 1
Acties:
  • 435 views sinds 30-01-2008
  • Reageer

  • Kapoen
  • Registratie: Mei 2002
  • Laatst online: 09:12
Eerst even een situatie schets: het is de bedoeling dat de inhoud/opmaak van een cel gekopieerd wordt van 1 workbook/sheet naar een andere. Als de doel file reeds open is moet deze alleen maar aangepast worden, is de file toe dan moet deze eerst geopend worden natuurlijk en achteraf weer gesloten.

Het kopieren en plaatsen van de gevraagde cel lukt goed. Als er een file moet geopend worden dan gaat het echter mis: dit gebeurt gewoonweg niet.

Eerst kijk ik na of de file al open staat:
code:
1
2
3
4
5
6
7
'Nakijken of het doel bestand al open staat
   On Error Resume Next
   Set wkb = Workbooks("t2.xls")
   If Err = 0 And Not wkb Is Nothing Then
    WorkbookExists = True
    Else: WorkbookExists = False
   End If

Om vervolgens de gepaste actie te starten:
code:
1
2
3
4
5
6
7
8
If WorkbookExists Then 
   ' verwerkingscode even weggelaten
  Else: 'werkboek openen, aanpassen en sluiten
   'Workbooks.Open ("t2.xls")  <-- werkt niet
   Workbooks.Open Filename:="t2.xls", ReadOnly:=False '<-- werkt ook niet
   ' doe verwerking
   Workbooks("t2.xls").Close True 'werkblad sluiten en veranderingen opslaan
End If


Zoals je ziet heb ik 2 verschillende manieren (syntactisch gezien) gebruikt om de doel file te openen, geen enkel van de twee wordt ook effectief uitgevoerd blijkbaar. (Ik heb de bovenstaande boolean check uit het 1e code blok ook eens toegepast als controle en deze was altijd negatief). Verder heb ik ook al geprobeerd om te werken via het Excel.Application object, maar ook deze syntax wordt genegeerd.

Wat doe ik hier mis?

[ Voor 9% gewijzigd door Kapoen op 11-09-2003 12:06 ]

Clowns to the left of me, Jokers to the right


  • cowgirl
  • Registratie: November 2000
  • Laatst online: 20-08 12:45
Staat het bestand wat je probeert te openen in een directory die is opgenomen in je pad? Of heb je al geprobeerd bij de filenaam het volledige pad op te nemen?

  • Kapoen
  • Registratie: Mei 2002
  • Laatst online: 09:12
Ja het bron- en het doel bestand staan naast elkaar in dezelfde directory.
Ook een pad vermelding opnemen werkt niet...

Overigens: het feit dat ik geen padvermelding gebruik komt door dat ik
eens gelezen heb in een GoT thread dat je dat beter neit doet (ben wel de link kwijt spijtig genoeg)

[ Voor 43% gewijzigd door Kapoen op 11-09-2003 12:12 ]

Clowns to the left of me, Jokers to the right


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Inderdaad, een padvermelding doe je liever niet, omdat je het bestand dan niet kunt of mag verplaatsen zonder in de problemen te komen. Overigens moet ik zeggen dat ik je manier van checken of het bestand bestaat wel een beetje krom vindt. Ook wijs je een waarde aan een variabale toe binnen een if statement en vervolgens gebruik je die variabele direct in een volgend if statement. Is het dan niet veel makkelijker het tweede ifje op te nemen in de eerste en je variabele de deur uit te doen.

Dus niet:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
  if i = 0 then
    IZero = true
  else
    IZero = false
  end if

  if iZero then
    msgbox "i is nul"
  end if
Maar:
Visual Basic .NET:
1
2
3
  if i = 0 then
    msgbox "i is nul"
  end if


Ontopic:
Probeer eens te controleren of je bestand bestaat met een functie als FileExists. Als je die niet kunt vinden zijn er diverse VB-uitvoeringen op Google te vinden. Ik heb namelijk het gevoel dat je ergens op een rare manier die check uitvoert en dat 'ie dat niet tof vindt.

Overigens kan het volgens mij ook zo zijn dat err nog verwijst naar een 'oude' error uit jouw code. Zeker als je, zoals jij doet, je err nergens op nul stelt na de errorhandling.

My personal website


  • KingRichard
  • Registratie: September 2002
  • Laatst online: 17-08 19:31

KingRichard

former Duke of Gloucester

Je kunt controleren of een bestand bestaat door proberen het te openen. Makkelijker nog is:
Visual Basic:
1
2
3
4
5
If Dir("t2.xls") <> Empty Then
   MsgBox "Gevonden!"
Else
   MsgBox "Die bestaat helemaal niet, gek!"
End If

Maar, in je openingspost staat dat je wilt weten of het bestand geopend is.
De methode in je openingspost (het misbruiken van Set) werkt hiervoor niet. Als t2.xls niet bestaat, zal er een error gegenereerd worden. Als t2.xls wel bestaat zal er geen error gegenereerd worden, ook al is t2.xls 100 keer geopend en staat het bestand in 200 variabelen.
Controleren of het bestand geopend is zou kunnen door de Workbookscollectie te doorlopen. Maar waarom zou je dat willen? Als een bestand per ongeluk al open is, gebeurt er niks als je Workbooks.Open "t2.xls" doet.
offtopic:
Nog even over die padvermeldingen: het pad waarin gezocht wordt als je niks invult, is het pad waar het laatste bestand geopend is. Dus als een gebruiker nog een ander Excel-bestand heeft geopend na deze, wordt in je Sub dat pad gebruikt.
Als je zeker weet dat de bestanden die je wilt gebruiken in dezelfde map staan als het bestand van waaruit de Sub gestart wordt, kun je het zo doen:
Workbooks.Open ActiveWorkbook.Path & "\" & "t2.xls"

[ Voor 26% gewijzigd door KingRichard op 11-09-2003 15:32 . Reden: Offtopic-geleuter ]

a horse! a horse! my kingdom for a horse! (exeunt)
[got.profile] | [t.net.profile] | [specs]


  • Kapoen
  • Registratie: Mei 2002
  • Laatst online: 09:12
Bedankt voor de tips, ik zal het even nakijken. Overigens moet ik wel vermelden dat ik nog maar slechts een paar dagen bezig ben met VBA (does it show? :)). Ik probeer me wat te behelpen met google en de GoT search... daarom dat mijn VBA programmeer stijl absoluut nog niet is wat het moet zijn.

Clowns to the left of me, Jokers to the right


  • Kapoen
  • Registratie: Mei 2002
  • Laatst online: 09:12
Even kleine update: ik heb een totaal andere manier genomen om die controle uit te voeren zoals jullie aanraadden. Dit geeft volgend stukje code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Sub isopen()

Dim wBook As Workbook
Dim wPath As String

'wPath = ActiveWorkbook.Path & "\"

On Error Resume Next

Set wBook = Workbooks("t2.xls")

    If wBook Is Nothing Then
        MsgBox ("is gesloten!!!")
        Set wBook = Nothing
        On Error GoTo 0
    Else
        MsgBox ("is open!!!")
        Set wBook = Nothing
        On Error GoTo 0
    End If
End Sub


Dit lijkt goed te werken, op de pad aanduiding na. Als ik gewoon de bestandsnaam ingeef zoals in de code dan werkt het goed... geef ik ActiveWorkbook.Path & \ mee dan loopt het mis. Nochtans worden er geen syntax errors of zo gegeven.

[ Voor 6% gewijzigd door Kapoen op 12-09-2003 08:59 ]

Clowns to the left of me, Jokers to the right


Verwijderd

Ik zou het zo doen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Public Function IsBookOpen(inName As String, inPath As String) As Boolean
    Dim i As Integer
    Dim wBook As Workbook
    Dim found As Boolean
    
    found = False
    
    For i = 1 To Workbooks.Count
        Set wBook = Workbooks.Item(i)
        If wBook.Name = inName And wBook.Path = StripPath(inPath) Then
            found = True
            Exit For
        End If
    Next i

    IsBookOpen = found
End Function


Private Function StripPath(inPath As String) As String
    'Stripe off ending "\"
    If Right(inPath, 1) = "\" Then
        StripPath = Left(inPath, Len(inPath) - 1)
    Else
        StripPath = inPath
    End If
End Function


Public Sub MainTest()
    Dim isopen As Boolean
    isopen = IsBookOpen("standaard_titratie.xls", "C:\somewhere\somehow\whatever")
End Sub

[ Voor 5% gewijzigd door Verwijderd op 12-09-2003 08:44 ]


  • Kapoen
  • Registratie: Mei 2002
  • Laatst online: 09:12
Mja, maar met dat stuk code moet je nog altijd een absoluut pad meegeven en dat is eigenlijk niet de bedoeling (het excel projectje waar ik nu aan werk moet kunnen werken op een gedeelde netwerk schijf met een vrij complexe directory structuur).

[edit]
Als ik mijn bestandje op volgende manier open dan werkt het zo te zien wel:
code:
1
Workbooks.Open Filename:=ActiveWorkbook.Path & "\" & "t2.xls", ReadOnly:=False

[edit2] Workbooks(ActiveWorkbook.Path & "\" & ''t2.xls'') werkt nog altijd niet, ik blijf verder zoeken :)

[ Voor 52% gewijzigd door Kapoen op 12-09-2003 09:24 ]

Clowns to the left of me, Jokers to the right


Verwijderd

Je kan in mijn code toch invullen wat je maar wilt?

code:
1
2
3
4
Public Sub MainTest()
    Dim isopen As Boolean
    isopen = IsBookOpen("standaard_titratie.xls", ActiveWorkbook.Path)
End Sub

  • Kapoen
  • Registratie: Mei 2002
  • Laatst online: 09:12
Inderdaad (dank je voor die code trouwens :)), maar is er echt zoveel code nodig alleen om een stomme pad-aanduiding te verwerken? :)

[ Voor 16% gewijzigd door Kapoen op 12-09-2003 10:15 ]

Clowns to the left of me, Jokers to the right


Verwijderd

Kapoen schreef op 12 September 2003 @ 10:02:
Inderdaad (dank je voor die code trouwens :)), maar is er echt zoveel code nodig alleen om een stomme pad-aanduiding te verwerken? :)
Ik vind het redelijk recht-toe-recht-aan, je hebt eigenlijk alleen de functie 'IsBookOpen' nodig. Functie 'StripePath' is extra veiligheidje maar niet noodzakelijk. Het jammere is dat de items van collectie Workbooks enkel met index zijn op te halen en je er dus doorheen moet enumeren om ze te testen. Maar goed het werkt :)

  • Kapoen
  • Registratie: Mei 2002
  • Laatst online: 09:12
idd, nogmaals bedankt ;)

Clowns to the left of me, Jokers to the right


  • KingRichard
  • Registratie: September 2002
  • Laatst online: 17-08 19:31

KingRichard

former Duke of Gloucester

Kapoen schreef op 12 September 2003 @ 08:25:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Sub isopen()

Dim wBook As Workbook
Dim wPath As String

'wPath = ActiveWorkbook.Path & "\"

On Error Resume Next

Set wBook = Workbooks("t2.xls")

    If wBook Is Nothing Then
        MsgBox ("is gesloten!!!")
        Set wBook = Nothing
        On Error GoTo 0
    Else
        MsgBox ("is open!!!")
        Set wBook = Nothing
        On Error GoTo 0
    End If
End Sub


Dit lijkt goed te werken, op de pad aanduiding na. Als ik gewoon de bestandsnaam ingeef zoals in de code dan werkt het goed... geef ik ActiveWorkbook.Path & \ mee dan loopt het mis. Nochtans worden er geen syntax errors of zo gegeven.
Je definiëert wPath, maar je doet er daarna niets mee :? . En ik vraag me nog steeds af wat het nou uitmaakt of een bestand open is of niet. Gewoon laten openen. Als 'ie niet geopend is, wordt 'ie geopend; als 'ie al wel geopend is, krijgt 'ie de focus.

a horse! a horse! my kingdom for a horse! (exeunt)
[got.profile] | [t.net.profile] | [specs]

Pagina: 1