Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

geschlossene Arbeitsmappen ansprechen

Forumthread: geschlossene Arbeitsmappen ansprechen

geschlossene Arbeitsmappen ansprechen
Joachim
Hallo,
ich habe von einigen Wochen die Frage angesprochen, wie ich geschlossene Arbeitsmappen ansprechen kann. Hajo hat mir dazu ein VBA-Code zur Verfügung gestellt.
Siehe hier:
Option Explicit
Public Function GetDataClosedWB(SourcePath As String, _
SourceFile As String, sourceSheet As String, _
SourceRange As String, TargetRange As Range) As Boolean
'Holt einen Bereich aus einer _geschlossenen_ Arbeitsmappe
'Nur in VBA zu verwenden; nicht aus einer Tabellenzelle heraus
'© t.ramel@mvps.org
' wird durch die HoleDaten aufgerufen
Dim strQuelle       As String
Dim Zeilen          As Long
Dim Spalten         As Byte
On Error GoTo InvalidInput
strQuelle = "'" & SourcePath & "[" & SourceFile & "]" & sourceSheet & "'!" & Range( _
SourceRange).Cells(1, 1).Address(0, 0)
Zeilen = Range(SourceRange).Rows.Count
Spalten = Range(SourceRange).Columns.Count
With TargetRange.Cells(1, 1).Resize(Zeilen, Spalten)
.Formula = "=IF(" & strQuelle & "="""",""""," & strQuelle & ")"
.Value = .Value
End With
GetDataClosedWB = True
Exit Function
InvalidInput:
MsgBox "Die Quelldatei oder der Quellbereich ist ungültig!", vbExclamation, "Get data from   _
_
_
closed Workbook"
GetDataClosedWB = False
End Function
Public Sub HoleDaten()
' Die Funktion arbeitet mit der obrigen GetDataClosedWB zusammen
Dim Pfad            As String
Dim Dateiname       As String
Dim Blatt           As String
Dim Bereich         As String
Dim Ziel            As Range
Pfad = "L:\Eigene Dateien\Hajo\Internet\Test\2009\"
Dateiname = "Beispiel Forum 30.xlsm" ' aus welcher Datei soll er holen?
Blatt = "Tabelle1"  ' von welcher Tabelle soll er holen?
Bereich = "A1:B9"   ' aus welchem Bereich soll er holen?
Set Ziel = ActiveSheet.Range("A1")  ' in welchen Bereich soll er kopieren? Genauer gesagt:   _
_
_
Bei welcher Zelle soll er anfangen, Datein reinzukopieren? Bsp: ActiveCell geht auch
If GetDataClosedWB(Pfad, Dateiname, Blatt, Bereich, Ziel) Then
MsgBox "Daten importiert"
End If
End Sub

Dieser Code funktioniert sehr gut. Nur habe ich damit trotzdem ein Problem.
Ich will keine Bereiche kopieren im Format "A1:B9" sondern ich will benannte Bereiche kopieren.
Und in dem Fall bekomme ich die Fehlermeldung beim Kompilieren: Argumenttyp ByRef unverträglich.
Kann mir jemand sagen, wie ich den Code abändern muß, damit ich benannte Bereiche kopieren kann.
Vielen Dank.
Gruß
Joachim
Anzeige

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: geschlossene Arbeitsmappen ansprechen
12.08.2011 15:16:29
Josef

Hallo Joachim,
das könnte man so lösen.
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Public Sub getDataADO()
  Dim objADO As Object
  Dim strFile As String, strRef As String
  
  strFile = "E:\Forum\indirekt_test.xlsx"
  
  strRef = "_Test1" 'Bereichsname Globale Gültigkeit
  
  Set objADO = ExcelTable(strFile, strRef)
  Range("A2").CopyFromRecordset objADO 'Zielbereich anpassen!
  objADO.Close
  
  strRef = "Tabelle2$_Test4" 'Bereichsname mit Lokaler Gültigkeit $ beachten!
  
  Set objADO = ExcelTable(strFile, strRef)
  Range("A12").CopyFromRecordset objADO
  objADO.Close
  
  strRef = "Tabelle1$D6:L15" 'normale Bereichsangabe unbedingt MIT Tabellenname & $-Zeichen
  
  Set objADO = ExcelTable(strFile, strRef)
  Range("A22").CopyFromRecordset objADO
  objADO.Close
  
End Sub




Public Function ExcelTable(ByRef Path As String, ByRef SourceRange As String) As Object
  Dim SQL As String
  Dim Con As String
  
  SQL = "select * from [" & SourceRange & "]"
  
  If Mid(Path, InStrRev(Path, ".") + 1) = "xls" Then
    Con = "Provider=Microsoft.Jet.OLEDB.4.0;" _
      & "Extended Properties=Excel 8.0;" _
      & "Data Source=" & Path & ";"
  ElseIf Mid(Path, InStrRev(Path, ".") + 1) Like "xls?" Then
    Con = "Provider=Microsoft.ACE.OLEDB.12.0;" _
      & "Extended Properties=""Excel 12.0;HDR=YES"";" _
      & "Data Source=" & Path & ";"
  Else
    Exit Function
  End If
  Set ExcelTable = CreateObject("ADODB.Recordset")
  ExcelTable.Open SQL, Con, 3, 1
End Function



« Gruß Sepp »

Anzeige
AW: geschlossene Arbeitsmappen ansprechen
12.08.2011 15:57:26
fcs
Hallo Joachim,
die folgende Anpassung funktioniert für Bereichsnamen, die sich auf Namen beziehen, die für die gesamte Arbeitsmappe definiert sind.
Namen, die lokal für ein bestimmtes Tabellenblatt festgelegt sind benötigen eine andere Syntax für strQuelle.
Dann muss der Mappenname in eckige Klammern gesetzt werden und der Tabellenname vor dem Ausrufzeichen stehen. Ähnlich wie im Code für "normale" Zellbereiche.
Gruß
Franz
Public Sub HoleDatenName()
' Die Funktion arbeitet mit der obrigen GetDataClosedWB_Name zusammen
Dim Pfad            As String
Dim Dateiname       As String
Dim BereichName     As String
Dim Ziel            As Range
Pfad = "L:\Eigene Dateien\Hajo\Internet\Test\2009\"
Dateiname = "Beispiel Forum 30.xlsm" ' aus welcher Datei soll er holen?
BereichName = "MyData"               ' aus welchem Bereich soll er holen?
Set Ziel = ActiveSheet.Range("A1")  ' in welchen Bereich soll er kopieren? Genauer gesagt:  _
_
Bei welcher Zelle soll er anfangen, Datein reinzukopieren? Bsp: ActiveCell geht auch
If GetDataClosedWB_Name(Pfad, Dateiname, BereichName, Ziel) Then
MsgBox "Daten importiert"
End If
End Sub
Public Function GetDataClosedWB_Name(SourcePath As String, _
SourceFile As String, SourceRange As String, TargetRange As Range) As Boolean
'Holt einen Bereich aus einer _geschlossenen_ Arbeitsmappe
'Nur in VBA zu verwenden; nicht aus einer Tabellenzelle heraus
'© t.ramel@mvps.org - modified by f.sielck
' wird durch die HoleDaten aufgerufen
Dim strQuelle       As String, strFormel As String
Dim Zeilen          As Long
Dim Spalten         As Byte
On Error GoTo InvalidInput
strQuelle = "'" & SourcePath & SourceFile & "'!" & SourceRange
With TargetRange
strFormel = "=Rows(" & strQuelle & ")"
.Formula = strFormel
.Calculate
Zeilen = .Value
strFormel = "=COLUMNS(" & strQuelle & ")"
.Formula = strFormel
.Calculate
Spalten = .Value
.ClearContents
End With
With TargetRange.Cells(1, 1).Resize(Zeilen, Spalten)
.FormulaArray = "=IF(" & strQuelle & "="""",""""," & strQuelle & ")"
.Calculate
.Value = .Value
End With
GetDataClosedWB_Name = True
Exit Function
InvalidInput:
MsgBox "Die Quelldatei oder der Quellbereich ist ungültig!", vbExclamation, _
"Get data from closed Workbook"
GetDataClosedWB_Name = False
End Function

Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Geschlossene Arbeitsmappen in Excel ansprechen


Schritt-für-Schritt-Anleitung

Um geschlossene Excel-Arbeitsmappen anzusprechen, kannst Du VBA verwenden. Hier ist eine Schritt-für-Schritt-Anleitung:

  1. Öffne den VBA-Editor:

    • Drücke ALT + F11 in Excel, um den VBA-Editor zu öffnen.
  2. Neues Modul erstellen:

    • Klicke mit der rechten Maustaste auf "VBAProject (deine_datei.xlsm)" und wähle "Einfügen" > "Modul".
  3. Code einfügen:

    • Füge den folgenden Code in das Modul ein, um Daten aus einer geschlossenen Arbeitsmappe zu importieren:
    Public Function GetDataClosedWB(SourcePath As String, _
    SourceFile As String, sourceSheet As String, _
    SourceRange As String, TargetRange As Range) As Boolean
       Dim strQuelle As String
       Dim Zeilen As Long
       Dim Spalten As Byte
       On Error GoTo InvalidInput
       strQuelle = "'" & SourcePath & "[" & SourceFile & "]" & sourceSheet & "'!" & Range(SourceRange).Cells(1, 1).Address(0, 0)
       Zeilen = Range(SourceRange).Rows.Count
       Spalten = Range(SourceRange).Columns.Count
       With TargetRange.Cells(1, 1).Resize(Zeilen, Spalten)
           .Formula = "=IF(" & strQuelle & "="""",""""," & strQuelle & ")"
           .Value = .Value
       End With
       GetDataClosedWB = True
       Exit Function
    InvalidInput:
       MsgBox "Die Quelldatei oder der Quellbereich ist ungültig!", vbExclamation, "Get data from closed Workbook"
       GetDataClosedWB = False
    End Function
  4. Daten holen:

    • Verwende die HoleDaten Subroutine, um den Import zu starten:
    Public Sub HoleDaten()
       Dim Pfad As String
       Dim Dateiname As String
       Dim Blatt As String
       Dim Bereich As String
       Dim Ziel As Range
       Pfad = "L:\Eigene Dateien\Hajo\Internet\Test\2009\"
       Dateiname = "Beispiel Forum 30.xlsm"
       Blatt = "Tabelle1"
       Bereich = "A1:B9"
       Set Ziel = ActiveSheet.Range("A1")
       If GetDataClosedWB(Pfad, Dateiname, Blatt, Bereich, Ziel) Then
           MsgBox "Daten importiert"
       End If
    End Sub

Häufige Fehler und Lösungen

  • Fehler: Argumenttyp ByRef unverträglich:

    • Wenn Du benannte Bereiche ansprechen möchtest, stelle sicher, dass die Syntax für strQuelle korrekt ist. Du musst die Mappen- und Blattnamen anpassen.
  • Fehler: Ungültige Quelldatei oder Bereich:

    • Überprüfe den Pfad und die Dateinamen, um sicherzustellen, dass sie korrekt sind und die Datei existiert.

Alternative Methoden

Neben der Verwendung von VBA kannst Du auch die Power Query-Funktion in Excel nutzen, um Daten aus geschlossenen Arbeitsmappen zu importieren. Diese Methode ist benutzerfreundlicher und erfordert keine Programmierkenntnisse.

  1. Power Query öffnen:

    • Gehe zu Daten > Daten abrufen > Aus Datei > Aus Arbeitsmappe.
  2. Datei auswählen:

    • Suche die geschlossene Excel-Datei und wähle sie aus.
  3. Daten importieren:

    • Wähle die gewünschten Daten aus und lade sie in Deine Arbeitsmappe.

Praktische Beispiele

Beispiel 1: Importiere Daten aus einer benannten Range.

Public Sub HoleDatenName()
   Dim Pfad As String
   Dim Dateiname As String
   Dim BereichName As String
   Dim Ziel As Range
   Pfad = "L:\Eigene Dateien\Hajo\Internet\Test\2009\"
   Dateiname = "Beispiel Forum 30.xlsm"
   BereichName = "MyData"
   Set Ziel = ActiveSheet.Range("A1")
   If GetDataClosedWB_Name(Pfad, Dateiname, BereichName, Ziel) Then
       MsgBox "Daten importiert"
   End If
End Sub

Beispiel 2: Arbeiten mit lokalen Namen in Excel.

Public Function GetDataClosedWB_Name(SourcePath As String, _
SourceFile As String, SourceRange As String, TargetRange As Range) As Boolean
   ' Hier die angepasste Funktion für benannte Bereiche
End Function

Tipps für Profis

  • Nutze Option Explicit am Anfang jedes Moduls, um sicherzustellen, dass alle Variablen deklariert werden. Das hilft, Fehler zu vermeiden.
  • Wenn Du mit großen Datenmengen arbeitest, achte darauf, die Berechnungen während des Imports zu deaktivieren, um die Leistung zu verbessern:
Application.Calculation = xlCalculationManual
' ... Daten importieren ...
Application.Calculation = xlCalculationAutomatic

FAQ: Häufige Fragen

1. Wie kann ich geschlossene Excel-Dateien wiederherstellen? Du kannst geschlossene Excel-Dateien wiederherstellen, indem Du die letzten Autospeicherungen oder Backup-Dateien verwendest, die Excel automatisch erstellt.

2. Was ist der Vorteil von VBA gegenüber Power Query? VBA bietet mehr Flexibilität und Anpassungsmöglichkeiten, während Power Query einfacher zu bedienen und intuitiver ist, besonders für Benutzer ohne Programmierkenntnisse.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige