Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

Datei bereits geöffnet - VBA

Betrifft: Datei bereits geöffnet - VBA von: Marek
Geschrieben am: 24.09.2014 10:07:40

Hallo zusammen,

in meinem Makro kann ich den Fehler (Datei2 bereits geöffnet) nicht finden. Vielleicht sieht ihn jemand von euch.

Sub Aktualisieren()

Application.ScreenUpdating = False

Dim j%, k%, m%, strDateiname$
Dim wkbOld As Workbook (Berichtsdatei, aus der das Makro gestartet wird und in die Werte eingespielt werden)
Dim ISTUV& …
[…]
Dim strNachricht$

j = Year(CDate(Range("A1")))
k = Range("Y1")
m = Month(CDate(Range("A1")))

Set wkbOld = ActiveWorkbook

'Datei1 öffnen
strDateiname = "PFAD " & j & "\" & m & "\Details\" & k & "_Detail_" & m & ".xls"
If WkbExists(strDateiname) Then Workbooks.Open Filename:=strDateiname Else GoTo Fehler

Sheets("Tabelle1").Select
On Error Resume Next

'IST-Werte auslesen
ISTUV = -(Columns("B:B").Find(What:="Suchbegriff1").Offset(0, 2)) / 1000
[…]
Sheets("Tabelle2").Select
'IST-Kennzahlen auslesen
ISTAWT = -Columns("B:B").Find(What:="Suchbegriff2").Offset(0, 2)
[…]

wkbOld.Activate

'Werte in Berichtsdatei einfügen
Cells(6, m + 1).Value = ISTUV
Cells(49, m + 1).Value = ISTAWT

'Formeln kopieren
Dim S&

Range("B6").End(xlToRight).Offset(0, 0).Activate
If m = 1 Then GoTo Weiter Else
If m = 12 Then S = 13 Else S = ActiveCell.Column

Range("B9").Copy
ActiveSheet.Range(Cells(9, 3), Cells(9, S)).PasteSpecial Paste:=xlPasteFormulas
[…]

Weiter:
'Datei1 schließen
Dim wkb As Workbook

Set wkb = Workbooks.Open(strDateiname)
wkb.Close savechanges:=False
Set wkb = Nothing
Dim AUS_CHARGED_MON& …

Set wkbOld = ActiveWorkbook

'Datei2 öffnen
strDateiname = "PFAD\" & j & "\" & "Datei " & m & "_" & j & ".xlsx"
If WkbExists(strDateiname) Then Workbooks.Open Filename:=strDateiname Else GoTo Fehler

Sheets("Tabelle1").Select

'Daten auslesen
AUS_CHARGED_MON = (Columns("A:A").Find(What:=k).Offset(0, 15)) * 1000
[…]

wkbOld.Activate

'Werte in Berichtsdatei einfügen
Cells(70, m + 1).Value = AUS_CHARGED_MON / 10

'Datei2 schließen
Dim wkbU As Workbook

Set wkbU = Workbooks.Open(strDateiname)
wkbU.Close savechanges:=False
Set wkbU = Nothing

Calculate
Application.ScreenUpdating = True
Exit Sub

Fehler:
strNachricht = "Datei " & Chr(13) & strDateiname & Chr(13) & "existiert nicht!"
MsgBox strNachricht, vbExclamation
Application.ScreenUpdating = True

End Sub

Private Function WkbExists(strDateiname As String) As Boolean
Dim wkb As Workbooks
If Dir(strDateiname) = "" Then
WkbExists = False
Else
WkbExists = True
End If
End Function

  

Betrifft: AW: Datei bereits geöffnet - VBA von: Jack_d
Geschrieben am: 24.09.2014 10:22:36

Hallo Marek

ICh würd sagen dass hier dein Fehler liegt. In der Routine Schliessen, öffnest du es.. macht aus meiner Sicht keinen Sinn.

'Datei2 schließen
Dim wkbU As Workbook

Set wkbU = Workbooks.Open(strDateiname)
wkbU.Close savechanges:=False
Set wkbU = Nothing
Zudem, solltest du dein Makro bissl aufräumen.

Dim an den Anfang,
select und activate raus, soweit möglich
Vielleicht noch Codeoptimierung durch With.

Usw.

Grüße


  

Betrifft: AW: Datei bereits geöffnet - VBA von: Marek
Geschrieben am: 24.09.2014 10:37:28

Hallo Jack,

danke für deine Antwort. Möglicherweise würde ich ohne Select und Activate auskommen; soweit ich weiß, habe ich es beim Programmieren versucht zu vermeiden. Hat nicht geklappt, so habe ich es belassen. Ob es mit "With" kürzer wird?

Zum Thema: Datei1 schließen funktioniert mit demselben Code, ohne extra Rückmeldung (Datei bereits geöffnet). Für mich sagt "Set wkbU = Workbooks.Open(strDateiname)", dass zu der Datei2 gewechselt werden soll, um sie zu schließen. Habe ich da ein Verständnisproblem?

Gruß
Marek


  

Betrifft: AW: Datei bereits geöffnet - VBA von: Marek
Geschrieben am: 24.09.2014 10:40:56

.


  

Betrifft: AW: Datei bereits geöffnet - VBA von: Jack_d
Geschrieben am: 24.09.2014 10:48:47

Hallo MArek

also mit With wird es häufig kürer, in deinem Fall aber vorallem Übersichtlicher.

Ich würde grundsätzlich so rangehen (kein Code nur ein Ansatz)

'öffnen
Mappe1 öffnen
Mappe2 öffnen 
Mappe3 öffnen

'auslesen
With Mappe1
  variable1 =.zelle(A1)
  variable2 =.Zelle(A2)
end with

with Mappe2
  variable3 =.zelle(A1)
  variable4 =.Zelle(A2)
end with

'eintragen
with Mappe3
  .zelle(A1)=Variable1
  .zelle(A2)=Variable2
  .zelle(A3)=Variable3
  .zelle(A4)=Variable4
end with

Mappe1 schliessen
Mappe2 schliessen
So und du hast ein Verständnisfehler
"Set wkbU = Workbooks.Open(strDateiname)"

Set wkbU
weisst der variable wkbU einen Wert (eine Mappe zu)
Workbooks.Open(strDateiname)"
definiert diesen Wert (sagt dir welche Mappe
Open(strDateiname)
öffnet dir eine Mappe

du hast also eine 2 geteilte Anweisung
öffnen und zuweisen, daher dein Verständnisproblem

Da du die Mappe1 ja schon zugewiesen hast (ich glaub wbOld) brauchst du sie auch nicht neu "setten"
sondern direkt über die Variable wbOld.close schliessen
Grüße


  

Betrifft: AW: Datei bereits geöffnet - VBA von: Marek
Geschrieben am: 24.09.2014 11:14:02

Hallo Jack,

wenn ich Zeit und Lust habe, baue ich´s vielleicht mal um. :-)

Das

Open(strDateiname)
in

Set wkbU = Workbooks.Open(strDateiname)
öffnet eine Datei? Jetzt bin ich draußen ...

Ich beschreibe mal kurz, was der Code tun soll:

In die Berichtsdatei (wkbOld) aus Datei 1 (wkb) und aus Datei 2 (wkbU) Daten eintragen. Datei 1 (wkb) schließen funktioniert; Datei 2 (wkbU) mit demselben Code schließen bringt ´ne extra Meldung.

Ich bin ratlos.

Gruß
Marek


  

Betrifft: AW: Datei bereits geöffnet - VBA von: Jack_d
Geschrieben am: 24.09.2014 11:39:16

Das ist ja grausig

"wenn ich Lust habe"

Anbei mal ein teilsoptimnierter Code. Ich kenn deinen Ganzen ja nicht (geschweige denn was du machen willst) Ist demzufolge auch ungetestet.
Bei manchen Tabellenreferenzen haben ich nur geraten, weil sie nicht eindeutig angegeben sind.

Und, natürlich öffnet open die Datei (was vermutest du was sich hinter "open" verbirgt?

Sub Aktualisieren()

Dim j%, k%, m%, strDateiname$
Dim wkbOld As Workbook '(Berichtsdatei, aus der das Makro gestartet wird und in die Werte  _
eingespielt werden)
Dim ISTUV&
Dim S&
Dim AUS_CHARGED_MON&

Application.ScreenUpdating = False
On Error Resume Next

'Werte zur Pfadbestimmung
Set wkbOld = ActiveWorkbook
With wkbOld.Sheets("Tabelle1")
    j = Year(CDate(.Range("A1")))
    k = .Range("Y1")
    m = Month(CDate(.Range("A1")))
End With


'Datei1 öffnen und "setten"
strDateiname1 = "PFAD " & j & "\" & m & "\Details\" & k & "_Detail_" & m & ".xls"
If WkbExists(strDateiname) Then Set WK1 = Workbooks.Open(Filename:=strDateiname1) Else GoTo  _
Fehler

'Datei2 öffnen und "setten"
strDateiname2 = "PFAD\" & j & "\" & "Datei " & m & "_" & j & ".xlsx"
If WkbExists(strDateiname) Then Set WK2 = Workbooks.Open(Filename:=strDateiname2) Else GoTo  _
Fehler

'IST-Werte auslesen (Mappe 1)
With wks1.Sheets("Tabelle1")
    ISTUV = -(.Columns("B:B").Find(What:="Suchbegriff1").Offset(0, 2)) / 1000
End With

'IST-Kennzahlen auslesen
With wks1.Sheets("Tabelle2")
    ISTAWT = -.Columns("B:B").Find(What:="Suchbegriff2").Offset(0, 2)
End With

'Daten auslesen (Mappe 2)
With wks2.Sheets("Tabelle1")
    AUS_CHARGED_MON = (Columns("A:A").Find(What:=k).Offset(0, 15)) * 1000
End With


With wkbOld.Sheets("Tabelle1")
    'Werte in Berichtsdatei einfügen
    .Cells(6, m + 1).Value = ISTUV
    .Cells(49, m + 1).Value = ISTAWT
    .Cells(70, m + 1).Value = AUS_CHARGED_MON / 10

    'Formeln kopieren
    If m = 1 Then GoTo weiter Else
    If m = 12 Then S = 13 Else S = ActiveCell.Column
    
weiter:

    .Range("B9").Copy
    .Range(Cells(9, 3), Cells(9, S)).PasteSpecial Paste:=xlPasteFormulas

End With

'Datei schließen
WK1.Close savechanges:=False
WK2.Close savechanges:=False



Calculate
Application.ScreenUpdating = True
Exit Sub

Fehler:
strNachricht = "Datei " & Chr(13) & strDateiname & Chr(13) & "existiert nicht!"
MsgBox strNachricht, vbExclamation
Application.ScreenUpdating = True

End Sub



  

Betrifft: AW: Datei bereits geöffnet - VBA von: Marek
Geschrieben am: 24.09.2014 11:53:23

Hallo Jack,

sieht wirklich gut aus; werde es nachher mal umbauen, danke. Wenn´s läuft, ist es mir egal, warum der alte Code nicht lief.

Gruß
Marek


  

Betrifft: Wenn´s läuft, ist es mir egal von: Rudi Maintaire
Geschrieben am: 24.09.2014 13:56:46

hallo,
mit der Einstellung lernst du es nie.

Gruß
Rudi


  

Betrifft: AW: Wenn´s läuft, ist es mir egal von: Marek
Geschrieben am: 24.09.2014 14:27:28

Hallo Rudi,

schon klar. Eventuell hast du ´ne Idee für die nervige Meldung? Open heißt öffnen - natürlich, nur steht das oben bei der ersten Datei auch, und da kommt keine Meldung.

Gruß
Marek


  

Betrifft: AW: Datei bereits geöffnet - VBA von: Marek
Geschrieben am: 24.09.2014 14:31:29

Hallo Jack,

habe es umgebaut, nun werden Dateien ohne Meldung geöffnet und geschlossen, nur werden keine Daten mehr ausgelesen und eingetragen. Für WK1 und WK2 kommt die Variable nothing.

Gruß
Marek


  

Betrifft: AW: Datei bereits geöffnet - VBA von: Marek
Geschrieben am: 24.09.2014 14:32:06

.


  

Betrifft: AW: Datei bereits geöffnet - VBA von: Marek
Geschrieben am: 24.09.2014 15:24:05

Ich hab´s jetzt hinbekommen.
Allerdings öffne ich nicht alle Mappen gleichzeitig, sondern nacheinander. Hat den Vorteil, dass ich nur einen Dateinamen dimensionieren muss, ergo auch nur einen Fehler und eine WkbExists-Funktion habe.

Andererseits komme ich manchmal um das Select nicht herum; immer dann, wenn ich aus einem anderen Register Daten auslesen will. Select hat ohnehin weniger Buchstaben als With / End with. :-)


  

Betrifft: AW: Datei bereits geöffnet - VBA von: Jack_d
Geschrieben am: 24.09.2014 15:27:45

Code lernen und verstehen.
Erklärungen lesen !

Hallo Marek

wie du vielleicht überlesen hast, habe ich bereits erwähnt das manche Referenzen nicht eindeutig waren.
Daher
Natürlich kannst du es mit select lösen, was aber eigentlich "fürn Arsch" ist :-D

mit with wks1.sheets("Tabelle_andererReiter") sprichst ander Register an.

Wie auch immer. mach was du willst, wenn es dich langfristig glücklich macht.

Grüße


 

Beiträge aus den Excel-Beispielen zum Thema "Datei bereits geöffnet - VBA"