Office: (Office 365) Makro/VBA Daten aus andere Mappe importiren und Formel anwenden

Helfe beim Thema Makro/VBA Daten aus andere Mappe importiren und Formel anwenden in Microsoft Excel Hilfe um das Problem gemeinsam zu lösen; Hallo, als erstes: ich habe keine Ahnung von Makros bzw deren Programmierung. Habe mir bisher beholfen mir Fragmente aus anderen Makros zu kopieren und... Dieses Thema im Forum "Microsoft Excel Hilfe" wurde erstellt von Mr.L, 30. Oktober 2022.

  1. Mr.L Neuer User

    Makro/VBA Daten aus andere Mappe importiren und Formel anwenden


    Hallo,
    als erstes: ich habe keine Ahnung von Makros bzw deren Programmierung. Habe mir bisher beholfen mir Fragmente aus anderen Makros zu kopieren und mich versucht in letzten 48 Stunden ein wenig einzulesen.
    Sollte es den Profis unter Euch zu sehr schmerzen mein Machwerk zu lesen bitte ich dies zu entschuldigen ;)


    Ziel ist es aus der Quell-Datei eine Auswahl an spalten zu übertragen und bei bestimmten Spalten den Wert -1 zu Subtrahieren

    Für die Datenübernahme habe ich Folgendes Makro. Hier ein wenig eingekürzt mit nur 3 Spalten:
    Code:
    Sub Daten_uebertragen()
    With ThisWorkbook
        With ActiveSheet.Range("A2:A15000")
        .Value = DoIt("aufb Daten", "A2:A15000", .Value)
        End With
        With ActiveSheet.Range("G2:G15000")
        .Value = DoIt("aufb Daten", "C2:C15000", .Value)
        End With
        With ActiveSheet.Range("H2:H15000")
        .Value = DoIt("aufb Daten", "G2:G15000", .Value)
        End With
    End With
    End Sub
    Private Function DoIt(sSheet As Variant, sAddr As String, V As Variant) As Variant
    Dim w As Long, i As Long
    Dim strInp As String
    Dim oWb As Workbook
    On Error GoTo fail
    DoIt = V
    w = Workbooks.Count
    If w > 2 Then
    For i = 1 To w
    If Workbooks(i).Name <> ThisWorkbook.Name Then
    strInp = strInp & CStr(i) & " = " & Workbooks(i).Name & vbNaewLine
    End If
    Next i
    strInp = InputBox(strInp, "Mehrfachauswahl mit Ziffer treffen")
    Set oWb = Workbooks(CInt(strInp))
    Else
    Set oWb = Workbooks(1)
    If oWb.Name = ThisWorkbook.Name Then Set oWb = Workbooks(2)
    End If
    DoIt = oWb.Sheets(sSheet).Range(sAddr).Value
    fail:
    End Function
    
    Das Funktioniert soweit Super.
    Hat nur den kleinen Schönheitsfehler das er im Falle das mehr als 2 Excel Mappen auf sind für jede spalte nach der Quelle fragt. Hier wäre es schöner wenn er nur einmal für den gesamten Import nachfragt.

    Probleme hab ich mit der Subtraktion.
    Hierfür hatte ich folgenden Code angedacht:
    Code:
    Sub Subtrahtion()
    Dim c As Range   ' c fuer Zelle
    For Each c In Range("K2:K15000")
    c = c - 1
    Next
    End Sub
    
    Das macht er bis er zu einer Zelle mit Text kommt. Dann bricht er mit Fehlermeldung ab.
    Hab es schon mit ein paar "If" Parameter versucht ohne Erfolg.
    Auch das Ignorieren der Fehler brachte keinen erfolg. Abgesehen davon das er dann für eine Spalte ca 15 Minuten brauchte.

    Der Text in der Zelle ist: "#ZAHL!". in der Quell-Datei steht in diesen Zellen "INVALID".


    Hat wer von Euch eine Idee, ein Tipp oder sonstige nützliche Hinweise für mich?
    Danke

    Gruß
    Markus
     
  2. Hajo_Zi
    Hajo_Zi Erfahrener User
    warum schleife über alle Dateien?
    For i = 1 To w
    If Workbooks(i).Name <> ThisWorkbook.Name Then
    strInp = strInp & CStr(i) & " = " & Workbooks(i).Name & vbNaewLine
    End If
    Next i
    weise strlnp nur Deinen Namen zu.

    Makro/VBA Daten aus andere Mappe importiren und Formel anwenden GrußformelMakro/VBA Daten aus andere Mappe importiren und Formel anwenden Homepage
     
    Hajo_Zi, 30. Oktober 2022
    #2
  3. Mr.L Neuer User
    Hallo,

    erstmal Danke für deine schnelle Reaktion / Antwort.

    Aber welchen Namen meinst du den?
    Das Problem ist ja das die Excel Dateien immer andere Namen haben.

    So als allgemeine info.
    Ich bekomme Wöchentlich bis zu 350 excel Dateien/Arbeitsmappen über einen Zeitraum von ca 6-8 Monaten.
    Deren Namen ist wie folgt aufgebaut: Datum.Name.Uhrzeit
    Diese Dateien werden von einen Datenlogger automatisch generiert.
    Leider weilt die eigentlich dafür vorgesehene Person, unser Excel Guru, nicht mehr unter uns.

    Gruß
    Markus
     
  4. Hajo_Zi
    Hajo_Zi Erfahrener User

    Makro/VBA Daten aus andere Mappe importiren und Formel anwenden

    Hallo Markus,

    ich habne es wohl falsch gesehen das Du den Namen kennst für die Datei.
    Es soll also Excel entrscheiden welche Datei.
    Dafür habe ich keine Lösung und bin darum rausa.
    Viel Erfolg.

     
    Hajo_Zi, 31. Oktober 2022
    #4
  5. Mr.L Neuer User
    Hallo,

    kein Ding. Solange man nur die Ziel- und Quell-Datei auf hat nervt die Abfrage ja nicht. Denn Fehler mehrere Excel Dateien auf zu haben macht man nur einmal, am Tag Makro/VBA Daten aus andere Mappe importiren und Formel anwenden *;)*

    Aber evtl hat du einen Tipp für mich wie ich Ihn dazu bei der Subtraktion die Zellen mit Text, in dem fall #ZAHL!, zu ignorieren oder zu überspringen..

    Danke.

    Gruß
    Markus
     
  6. Exl121150 Erfahrener User
    Hallo,
    das glaube ich sicher nicht, denn dein Code enthält einen Syntaxfehler! (--> vbNaewLine)
    Diesen Syntaxfehler hättest du entdeckt, wenn du, wie es sich normalerweise gehört, als 1. Codezeile "Option Explicit" noch vor der Zeile "Sub Daten_uebertragen()" eingefügt hättest.

    Das habe ich gemacht, indem ich die Workbook-Auswahl in eine eigene Funktion gelegt habe, separat vom Spaltenkopieren.
    Viel Erfolg dabei für den Fall, dass mehr als 2 Dateien vorliegen.

    Du meinst hier wohl ein paar "IF"-Anweisungen - unter Parameter versteht man in der Mathematik und auch beim Programmieren etwas ganz anderes.
    Ich habe dir dazu eine kleine Sub gebaut. Diese Sub "Subtraktion" benötigt als Parameter einen Zellbereich. Dieser Zellbereich wird durchlaufen und jeweils geprüft, ob der jeweilige Zellinhalt numerisch ist - erst dann wird subtrahiert. Ich habe sie dir für alle 3 Spaltenbereiche eingefügt.

    Code:
    Option Explicit
    
    Sub Daten_uebertragen()
       Dim QuellMappe As Workbook
       Dim QuellBlatt As Worksheet
       Dim ZielBereich As Range
     
       Set QuellMappe = QuellMappenAuswahl()
       Set QuellBlatt = QuellMappe.Worksheets("aufb Daten")
     
       Set ZielBereich = ActiveSheet.Range("A2:A15000")
       ZielBereich.Value = ImportSpalte(QuellBlatt, "A2:A15000")
       Subtraktion ZielBereich
     
       Set ZielBereich = ActiveSheet.Range("G2:G15000")
       ZielBereich.Value = ImportSpalte(QuellBlatt, "C2:C15000")
       Subtraktion ZielBereich
     
       Set ZielBereich = ActiveSheet.Range("H2:H15000")
       ZielBereich.Value = ImportSpalte(QuellBlatt, "G2:G15000")
       Subtraktion ZielBereich
       
    End Sub
    
    Private Function QuellMappenAuswahl() As Workbook
       Dim wbCt As Long, i As Long
       Dim Wb As Workbook
       Dim strInp As String
     
       wbCt = Workbooks.Count
       If wbCt > 2 Then
          For i = 1 To wbCt
             If Workbooks(i).Name <> ThisWorkbook.Name Then
                strInp = strInp & CStr(i) & " = " & Workbooks(i).Name & vbNewLine
             End If
          Next i
          strInp = InputBox(strInp, "Mehrfachauswahl mit Ziffer treffen")
          Set Wb = Workbooks(CInt(strInp))
       Else
          Set Wb = Workbooks(1)
          If Wb.Name = ThisWorkbook.Name Then Set Wb = Workbooks(2)
       End If
       Set QuellMappenAuswahl = Wb
    End Function
    
    Private Function ImportSpalte(wksQuelle As Worksheet, sAddr As String) As Variant
     
       ImportSpalte = wksQuelle.Range(sAddr).Value
    
    End Function
    
    Private Sub Subtraktion(Bereich As Range)
       Dim Zelle As Range
       For Each Zelle In Bereich.Cells
          If IsNumeric(Zelle.Value) Then
             Zelle.Value = Zelle.Value - 1
          End If
       Next Zelle
    End Sub
    
     
    Exl121150, 31. Oktober 2022
    #6
  7. Mr.L Neuer User
    Also wenn ich Dich richtig verstanden habe sollte das Ursprungs Makro keine Daten Importieren bzw übertragen da ein Syntaxfehler vorliegt. Richtig?
    Hätte bzw sollte da nicht eine Fehlermeldung kommen?
    Ich möchte garnicht in Abrede stellen das ich da einen Fehler drin habe. Nicht nach nur ein wenig einlesen in Foren usw. Aber ich versuche zu verstehen warum es dennoch Funktionierte.
    Meine Aussage das es "Super Funktioniert" habe ich nach ca 8-10 Versuchen getroffen.
    Da habe ich in jeder spalte, 27, die ersten und letzen 20 Zellen geprüft so wie Stichproben.
    Eine Fehlermeldung kam auch nicht.


    Touché

    Dein Makro Funktioniert.
    Danke erstmal dafür.
    Was mich irritiert ist das es ewig braucht.
    Ich hab es erstmal 1zu1 verwendet also nur mit den 3 Spalten.
    Das Importieren ging, wie auch schon davor mit allen 27 Spalten, in Sekunden.
    Aber als dann die Berechnung los ging sprang die CPU last auf ca 70%. Davor lag sie bei 5-10%. Nach ca 20 Minuten war er dann Fertig.
    Also wesentlich komplizierte Formeln direkt in excel bei ca gleichen Anzahl an zu berechneten Zellen geht in Sekunden. Aber bei einer Subtraktion von -1 braucht er 20 Minuten?
    Sind Makros einfach so langsam?
    Gibt es andere Gründe?



    Danke für Eure Hilfe.
     
  8. Exl121150 Erfahrener User

    Makro/VBA Daten aus andere Mappe importiren und Formel anwenden

    Hallo,
    Nicht unbedingt. Da du den Variablen-Deklarationszwang nicht eingeschaltet hattest, hat der VBA-Compiler als er die nicht deklarierte Variable "vbNaewLine" entdeckte, dieser zuallererst den Datentyp "Variant" verpasst und dann vermutlich den Variant-Wert "Empty". Dieser Variablenwert wird dann je nach Programmumgebung entweder als numerische 0 oder als Zeichenkettenwert "" oder was immer was gerade benötigt wird und möglich ist, ausgewertet.

    Genau diese geschilderte Situation stellt aus Sicht eines Programmierers eine (enorme) Heimtücke dar. Das Programm kann sich einige Zeit ganz "vernünftig" verhalten und dann kann plötzlich unter Umständen ein unerklärbares Verhalten eintreten. Solche Fehler sind meist (sehr) schwer zu finden, weil man als menschlicher Programmleser einfach darüber hinweg zu lesen geneigt ist.

    Man kann das Problem mit den Flüchtigkeitsfehlern sehr leicht beheben, eben indem man die Compiler-Option "Option Explicit" an den Anfang eines jeden Programmmoduls stellt. Das hat zur Folge, dass man jede verwendete Variable zuerst deklarieren muss. Flüchtigkeitsfehler werden andererseits damit sofort entdeckt, sobald man den Befehl zum Kompilieren gibt.

    Leider hat Microsoft diese voreinstellbare Option standardmäßig ausgeschaltet, damit so spontane "Kraut-und-Rüben"-Programme ermöglicht werden.
    Bei je 15000 Zellen pro Spalte, wobei in jeder Zelle überprüft werden muss, ob nicht-numerischer Müll enthalten ist - das braucht eben seine Zeit. Die Subtraktion, auch wenn es eine Variant-Zahl ist, wird in Summe nur einen Bruchteil an Zeit davon brauchen.
    Eine weitere Möglichkeit wäre, in der SUB die Fehlerbehandlung abzuschalten und am Ende wieder einzuschalten:
    Code:
    Private Sub Subtraktion(Bereich As Range)
       Dim Zelle As Range
       On Error Resume Next
       For Each Zelle In Bereich.Cells
            Zelle.Value = Zelle.Value - 1
       Next Zelle
       On Error GoTo 0
    End Sub
    
     
    Zuletzt bearbeitet: 1. November 2022
    Exl121150, 1. November 2022
    #8
  9. Mr.L Neuer User
    Ah. ok.

    Hab ich gleich mal Aktiviert.

    Werd morgen mal testen was bzw ob die Fehlerbehandlung ausstellen an zeit einbringt.

    Danke.

    Gruß
    Markus
     
  10. Mr.L Neuer User
    Kann man sich eigentlich irgendwo anzeigen lassen wie lange ein Makro gebraucht hat?
    Oder sowas wie ein Protokoll?
     
  11. Exl121150 Erfahrener User
    Hallo,

    für Testzwecke kann man eine Ausgabe tätigen zB. ins Direktbereichfenster des VBA-Editors durch folgende Anweisung:
    debug.print Now()
    Man erhält dann in diesem Fenster eine Datenausgabe wie zB.
    02.11.2022 10:36:14
    Man kann den Wert der Now()-Funktion genauso gut in eine Zelle ausgeben, zB. in die aktive Zelle:
    Activecell.Value = Now()
    oder in die Statuszeile von Excel:
    Application.Statusbar = Now()

    Das sind die einfachsten Möglichkeiten. Weitere Möglichkeiten benötigen leider etwas Detailwissen. Das Einfachste davon ist zB. die Variable Timer. Sie zählt die Sekunden seit Mitternacht - auch Bruchteile von Sekunden.
    Vor Aufruf des Makros, dessen Zeidauer man ermitteln möchte, führt man folgende Wertzuweisung aus:
    Dim StartZeit As Single, EndeZeit As Single
    StartZeit = Timer

    Dann führt man das betreffende Makro aus, das eine gewisse Dauer hat.
    Hinterdrein führt man die folgende Wertzuweisung aus:
    EndeZeit = Timer
    Mit dem Ausdruck EndeZeit-StartZeit erhält man die Dauer in Sekunden (und Sekundenbruchteilen).
     
    Exl121150, 2. November 2022
    #11
Thema:

Makro/VBA Daten aus andere Mappe importiren und Formel anwenden

Die Seite wird geladen...
  1. Makro/VBA Daten aus andere Mappe importiren und Formel anwenden - Similar Threads - Makro VBA Daten

  2. VBA Makro Daten kopieren

    in Microsoft Excel Hilfe
    VBA Makro Daten kopieren: Hi zusammen, ich bräuchte eure Hilfe denn aktuell bin ich am verzweifeln: Ich brauche ein Makro für das deutsche Excel. Es gibt 2 verschiedene Arbeitsmappen mit jeweils einem aktiven...
  3. Excel VBA / Daten kopieren wenn Liste auf x steht.

    in Microsoft Excel Hilfe
    Excel VBA / Daten kopieren wenn Liste auf x steht.: Hallo zusammen, ich habe ein PowerQuery, welches ich ca. 2 mal im Monat aktualisiere. Aus dem Query möchte ich gerne die Daten per Makro in ein anderes Arbeitsblatt kopieren. Dabei möchte ich...
  4. CSV-Daten per Makro einbinden - manuelle Wahl der Quelldatei

    in Microsoft Excel Hilfe
    CSV-Daten per Makro einbinden - manuelle Wahl der Quelldatei: Liebe Excel-Gemeinde, ich möchte CSV-Daten in eine bereits geöffnete Arbeitsmappe laden. Sie sollen nach jedem Laden eines Datensatzes auf einem anderen Arbeitsblatt dargestellt werden, das den...
  5. Makro neu ausführen wenn Daten gefiltert werden

    in Microsoft Excel Hilfe
    Makro neu ausführen wenn Daten gefiltert werden: Hi zusammen, wenn ich auf meine Daten einen Filter anwende, soll ein bestimmtes Makro ausgeführt werden. [ATTACH] Also wenn ich bspw. bei Derivat "G70" rausnehme, soll ein Makro automatisch neu...
  6. Dateiname in Zellen abspeichern, automatisiert

    in Microsoft Excel Hilfe
    Dateiname in Zellen abspeichern, automatisiert: Schönen guten Tag, ich habe aus einer Messreihe mehrere CSV-Dateien erzeugt, die folgende Struktur besitzen, siehe Ausschnitt: [ATTACH] Die ersten vier Spalten sind jeweils mit Werten gefüllt...
  7. Über Makro Daten aus Dateien auslesen

    in Microsoft Excel Hilfe
    Über Makro Daten aus Dateien auslesen: Hallo zusammen! Wer kann helfen? Ich möchte ein Makro erstellen, das aus dem aktuellsten Excel-Files in einem Ordner (z.B. d:\Daten\) die Werte B7 bis B26 in meine aktuelle Excel-Datei holt und...
  8. Excel 2010 Externe Daten Quellen über VBA Makro aktualisieren

    in Microsoft Excel Hilfe
    Excel 2010 Externe Daten Quellen über VBA Makro aktualisieren: Hallo zusammen, ich habe ein kleines Problem mit dem importieren von Daten aus einer .csv Datei. Mit dem Marko: Sub Daten_importieren() ' ' Daten_importieren Makro '...
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden