Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1380to1384
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Datei bereits geöffnet - VBA

Datei bereits geöffnet - VBA
24.09.2014 10:07:40
Marek
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

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Datei bereits geöffnet - VBA
24.09.2014 10:22:36
Jack_d
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

AW: Datei bereits geöffnet - VBA
24.09.2014 10:37:28
Marek
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

Anzeige
AW: Datei bereits geöffnet - VBA
24.09.2014 10:40:56
Marek
.

AW: Datei bereits geöffnet - VBA
24.09.2014 10:48:47
Jack_d
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

Anzeige
AW: Datei bereits geöffnet - VBA
24.09.2014 11:14:02
Marek
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

Anzeige
AW: Datei bereits geöffnet - VBA
24.09.2014 11:39:16
Jack_d
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

Anzeige
AW: Datei bereits geöffnet - VBA
24.09.2014 11:53:23
Marek
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

Wenn´s läuft, ist es mir egal
24.09.2014 13:56:46
Rudi
hallo,
mit der Einstellung lernst du es nie.
Gruß
Rudi

AW: Wenn´s läuft, ist es mir egal
24.09.2014 14:27:28
Marek
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

AW: Datei bereits geöffnet - VBA
24.09.2014 14:31:29
Marek
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

Anzeige
AW: Datei bereits geöffnet - VBA
24.09.2014 14:32:06
Marek
.

AW: Datei bereits geöffnet - VBA
24.09.2014 15:24:05
Marek
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. :-)

AW: Datei bereits geöffnet - VBA
24.09.2014 15:27:45
Jack_d
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
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige