Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Daten von anderem Workbook kopieren
#1
Question 
hi,

Daten innerhalb eines Workbooks zu kopieren geht ja einfach so:
Code:
Worksheets("Tabelle1").Range("A6:A40").Value = Worksheets("Tabelle2").Range("A6:A40").Value
Dabei wird von Tabelle2 in Tabelle1 kopiert, wenn der Code ausgeführt wird.

Jetzt möchte ich jedoch von dem Workbook, welchesn in Tabelle2 in Feld D109 steht, Daten kopieren in Tabelle1. Dort auch wie zuvor aus Tabelle2. (Der Workbookname in Feld D109 lautet: [Wb1.xlsm]

Code:
Worksheets("Tabelle1").Range("A6:A40").Value = Workbook("Tabelle2!D109").Worksheets("Tabelle2").Range("A6:A40").Value
Jedoch funktioniert der Code nicht: "Fehler beim Kompilieren: Sub oder Function nicht definiert"

Wo steckt der Fehler?

lieben Dank

Julia :)
Antworten Top
#2
Hallo Julia


Zitat:
Code:
Worksheets("Tabelle1").Range("A6:A40").Value = Workbook("Tabelle2!D109").Worksheets("Tabelle2").Range("A6:A40").Value
Vorsicht Vorsicht wenn du zwischen Mappen kopiert, wegen der Gefahr von Datenverlust!!  Überschreiben der falschen Tabelle! 

Natürlich kann man problemlos aus Mappen kopieren, aber Excel ist sehr penibel -in den Details-!  Schauen wir uns deinen Code an.
Du kopierst in Tabelle1, sagst aber nicht um welches Workbook es sich handelt, ob es die Quelle oder die Ziel iMappe st!  Dann wird in die Tabelle1 der Mappe kopiert, die im Bildschirm aktiv ist. Und Excel fragt dich nicht, ob dir das gefaellt!  So habe ich mir schon mehrfach Dateien zerschossen!

Du solltest den Namen der Ziel-Tabelle mit angeben, oder wenn das Makro in dier Ziel-Mappe ist  "ThisWorkbbok.Worksheets("Tabelle")" davorstellen

2. Fehler ist hier, den hier sieht Excel den eingefügten Text als Datei Namen an    Workbook("Tabelle2!D109")
Du solltest dir angewöhnen diese Namen vorher in eine Variable zu laden, und diese Varaible einsetzen: z.B. so:   (externe Mappe, Wbook extern)
ExMappe oder WbEx oder Datei = ThisWorkbook.Worksheets("Tabelle2").Range("D109").Value  

Dann sieht der fertige Code so aus:
ExMappe = ThisWorkbook.Worksheets("Tabelle2").Range("D109").Value
ThisWorkbook.Worksheets("Tabelle1").Range("A6:A40").Value = _ 
Workbook(ExMappe).Worksheets("Tabelle2").Range("A6:A40").Value 

mfg  Gast 123
[-] Folgende(r) 1 Nutzer sagt Danke an Gast 123 für diesen Beitrag:
  • o0Julia0o
Antworten Top
#3
Hallo Julia,

ist die andere Datei offen?
Gruß Stefan
Win 10 / Office 2016
[-] Folgende(r) 1 Nutzer sagt Danke an Steffl für diesen Beitrag:
  • o0Julia0o
Antworten Top
#4
Nein, die andere Datei ist geschlossen. Könnte aber offen sein, evlt. auch. Aber im Normalfall geschlossen. Und danke euch beiden!

(13.03.2017, 18:40)Gast 123 schrieb: Vorsicht Vorsicht wenn du zwischen Mappen kopiert, wegen der Gefahr von Datenverlust!!  Überschreiben der falschen Tabelle!

Natürlich kann man problemlos aus Mappen kopieren, aber Excel ist sehr penibel -in den Details-Schauen wir uns deinen Code an.
Du kopierst in Tabelle1, sagst aber nicht um welches Workbook es sich handelt, ob es die Quelle oder die Ziel iMappe st!  Dann wird in die Tabelle1 der Mappe kopiert, die im Bildschirm aktiv ist. Und Excel fragt dich nicht, ob dir das gefaellt!  So habe ich mir schon mehrfach Dateien zerschossen!
Hier ist das bereits bei mir der Fall, die Gefahr von Datenverlust?
Code:
Worksheets("Tabelle1").Range("A6:A40").Value = Worksheets("Tabelle2").Range("A6:A40").Value
Meines erachtens heißt der Code soviel wie:
Kopiere A6:A40 von Tabelle2 in Tabelle1 A6:A40. Und zwar immer. Egal, welche Worksheet ich gerade angewählt habe.
Antworten Top
#5
Hallo Julia,

versuche es mal mit der Hilfe einer Funktion von Thomas Ramel.

Code:
Sub prcHoleDaten()
   Dim Pfad            As String
   Dim Dateiname       As String
   Dim Blatt           As String
   Dim Bereich         As String
   Dim Ziel            As Range
   Pfad = "L:\Eigene Dateien\Benutzer\Test\" 'Pfad anpassen!!!!!
   Dateiname = Worksheets("Tabelle2").Range("D109").Text ' aus welcher Datei soll er holen?
   Blatt = "Tabelle2"  ' von welcher Tabelle soll er holen?
   Bereich = "A6:A40"   ' aus welchem Bereich soll er holen?
   Set Ziel = Worksheets("Tabelle1").Range("A6")  ' 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
   'Worksheets("Tabelle1").Range("A6:A40").Value = Workbook("Tabelle2!D109").Worksheets("Tabelle2").Range("A6:A40").Value
End Sub


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

    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
Gruß Stefan
Win 10 / Office 2016
[-] Folgende(r) 1 Nutzer sagt Danke an Steffl für diesen Beitrag:
  • o0Julia0o
Antworten Top
#6
Hallo

Zitat:Worksheets("Tabelle1").Range("A6:A40").Value = Worksheets("Tabelle2").Range("A6:A40").Value
 
Völlig korrekt, bei diesem Kopieren spielt es keine Rolle welches Blatt gerade aktiviert ist. Der Code funktioniert immer.
Bitte nur zu bedenken, er prüft nicht -in welcher Mappe dur gerade bist-, wenn mehrere Mappen geöffnet sind!

Auch damit, das ein Makro für Mappe A geschrieben war, aber Mappe B gerade aktiv geöffnet war, und es jetzt versehentlich in Mappe B ausgeführt wurde  habe ich mir schon Daten zerstört!  :Erfahrung ist halt die Summe aller dummen Fehler!

Macht nix solange man die Datei nicht speichert, flucht man im stillen, und  -schliesst sie ungespeichert- zum Datenretten!!

mfg  Gast 123
[-] Folgende(r) 1 Nutzer sagt Danke an Gast 123 für diesen Beitrag:
  • o0Julia0o
Antworten Top
#7
(14.03.2017, 12:46)Gast 123 schrieb: Auch damit, das ein Makro für Mappe A geschrieben war, aber Mappe B gerade aktiv geöffnet war, und es jetzt versehentlich in Mappe B ausgeführt wurde  habe ich mir schon Daten zerstört!

Ich führe das Makro ja in der MappeA aus, somit ist MappaA aktiv. Wenn dann eine MappeB noch geöffnet ist, führt er das Makro dann in beiden Arbeitsmappen aus? Wie kann ich das verhindern?
Antworten Top
#8
Hallo Julia,

versuche es mal mit ActiveWorkbook bzw. ThisWorkbook vor dem Worksheets. Wo was hingehört, darfst Du dir selber überlegen. Blush
Gruß Stefan
Win 10 / Office 2016
Antworten Top
#9
Hallo Julia

ein bisschen eigenes Nachdenken und probieren schadet bestimmtnicht.  Wenn du dann garnicht mehr weiter kommst benenne uns bitte die Datei Namen der Mappen, von wo nach wo du kopieren willst, welche Mappe/Tabelle Quelle ist, und welche Ziel ist, stelle den Code den du schon erarbeitetest hast ins Forum, dann können wir ihn prüfen, und ggf.korrigieren.

mfg  Gast 123
Antworten Top
#10
(13.03.2017, 18:40)Gast 123 schrieb: Dann sieht der fertige Code so aus:
Sub KopieVonExtern()
ExMappe = ThisWorkbook.Worksheets("T
abelle2").Range("D109").Value

ThisWorkbook.Worksheets("Tabelle1").Range("A6:A40").Value = _ 
Workbook(ExMappe).Worksheets("Tabelle2").Range("A6:A40").Value
End Sub
Egal, ob ich das Workbook offen habe, welches in Tabelle2 in D109 steht, oder nicht. Ich erhalte folgenden Fehler:
"Fehler beim Kompilieren: Sub or Function nicht definiert"  Dabei wird "Wokbook" markiert. Und "Sub KopieVonExtern()" wird gelb marktiert. Der Workbookname in Feld D109 lautet: [Wb1.xlsm]
Die Datei ist geöffnet(auch wenn sie geschlossen ist funktioniert es nicht) und es gibt dort Tabelle1, wo sich auch Zahlen in den Feldern A6:A40 befinden. Die Datei ist auch stets im gleichen Ordner wie die Hauptdatei.

(14.03.2017, 07:17)Steffl schrieb: versuche es mal mit der Hilfe einer Funktion von Thomas Ramel.
Code:
[...]
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

    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
So sieht mein Code dann aus:
Code:
Sub prcHoleDaten()
   Dim Pfad            As String
   Dim Dateiname       As String
   Dim Blatt           As String
   Dim Bereich         As String
   Dim Ziel            As Range
   Pfad = ThisWorkbook.Path 'Die von der zu kopierenden Datei liegt stets im gleichen Verzeichnis, wie die Hauptdatei
   Dateiname = Worksheets("Tabelle2").Range("D109").Text ' In D109 steht: [Wb1.xlsm]  Die Datei heißt: Wb1.xlsm. Auch mit D108 probiert, wo Wb1.xlsm als Zellinhalt steht.
   Blatt = "Tabelle2"  ' von welcher Tabelle soll er holen?
   Bereich = "A6:A40"   ' aus welchem Bereich soll er holen?
   Set Ziel = Worksheets("Tabelle1").Range("A6")  ' 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
   'Worksheets("Tabelle1").Range("A6:A40").Value = Workbook("Tabelle2!D109").Worksheets("Tabelle2").Range("A6:A40").Value
End Sub

Auch bei dieser Variante funktioniert es nicht. Egal, ob ich das Workbook offen habe, welches in Tabelle2 in D109 steht, oder nicht. Ich erhalte folgenden Fehler:
"Fehler beim Kompilieren: Sub or Function nicht definiert"  Dabei wird "GetDataClosedWB" markiert. Und "Sub KopieVonExtern()" wird gelb marktiert. Der Workbookname in Feld D109 lautet: [Wb1.xlsm]. Jedoch auch mal mit Wb1.xlsm probiert. Die Datei ist geöffnet(auch wenn sie geschlossen ist funktioniert es nicht) und es gibt dort Tabelle1, wo sich auch Zahlen in den Feldern A6:A40 befinden. Die Datei ist auch stets im gleichen Ordner wie die Hauptdatei.
Die Zeile:
Code:
Dateiname = Worksheets("Tabelle2").Range("D109").Text
Auch mal geändert in:
Code:
Dateiname = Worksheets("Tabelle2").Range("D109")
Hilft alles nichts. Quasi immer der gleiche Fehler wie auch bei Gast 123st Idee.

Julia :)
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste