Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1792to1796
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

Import aus Excel-File bis Zeile leer ist

Import aus Excel-File bis Zeile leer ist
24.11.2020 17:28:54
Zuger
Hallo zusammen
Ich stufe meine VBA Kenntnisse noch als recht bescheiden ein. Ich konnte aber bereits mit Hilfe diesem Forum und Google erste VBA Makros programmieren.
Aktuell beschäftige ich mich mit einem Mako, welches von einem geschlossenen Excel File eines bestimmten Tab die Daten importiert/einfügt, welches jeweils im gleichen Ordner abgelegt ist, wie das Excel-File mit dem Makro. Dies klappt auch alles so wie es soll.
Das Problem ist nun jedoch, dass die zu einzufügenden Daten manchmal wenige Zeilen haben und manchmal hunderte von Zeilen. Gerne würde ich das VBA so anpassen, dass es jeweils nur solange die Daten einfügt bis eine Zeile des geschlossenen Tabs leer ist. Damit würde das Makro einiges flüssiger werden.
Ich hatte selber zwei Ideen. Die eine Idee wäre, die letzte leere Zeile des zu importierenden Tab auszulesen und diese im Range einzufügen . Die andere Variante wäre, den For Each so anzupassen, dass es nur solange ausgeführt wird, bis die Zeile nach dem Einfügen leer ist. Leider bin ich bei beiden Lösungsansätzen gescheitert.
Hier der aktuelle VBA Code, welcher aktuell nur die ersten 10 Zeilen importiert. Dies Werte ahbe ich nur zu Testzwecke, dass das Makro schnell fertig ist ;-)
Sub Bereich_auslesen()
'** Dimensionierung der Variablen
Dim pfad As String
Dim datei As String
Dim blatt As String
Dim bereich As Range
Dim zelle As Object
'** Angaben zur auszulesenden Zelle
pfad = ThisWorkbook.Path
datei = "ImportFile for Outlook by Manager.xlsx"
blatt = Range("G2")
Set bereich = Range("A2:C10")
'** Bereich auslesen
For Each zelle In bereich
'** Zellen umwandeln
zelle = zelle.Address(False, False)
'** Eintragen in Bereich
ActiveSheet.Cells(zelle.Row, zelle.Column).Value = GetValue(pfad, datei, blatt, zelle)
Next zelle
ActiveSheet.Range("A2", "A6").NumberFormat = "dd.mmm"
End Sub
Private Function GetValue(pfad, datei, blatt, zelle)
'** Daten aus geschlossener Arbeitsmappe auslesen
'*** Dimensionierung der Variablen
Dim arg As String
'Sicherstellen, dass das datei vorhanden ist
If Right(pfad, 1)  "\" Then pfad = pfad & "\"
If Dir(pfad & datei) = "" Then
GetValue = "datei Not Found"
Exit Function
End If
'** Das Argument erstellen
arg = "'" & pfad & "[" & datei & "]" & blatt & "'!" & Range(zelle).Range("A1").Address(, ,  _
xlR1C1)
'** Auslesen über Excel4Macro
GetValue = ExecuteExcel4Macro(arg)
End Function
Vielen Dank im Voraus für eure Hilfe!
Liebe Grüsse aus der Zentralschweiz

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Import aus Excel-File bis Zeile leer ist
24.11.2020 18:47:19
ChrisL
Hi Zuger
Vom Prinzip her:
Dim x As Variant
x = GetValue(pfad, datei, blatt, zelle)
If x = 0 Then Exit Sub
ActiveSheet.Cells(zelle.Row, zelle.Column).Value = x
Aber was hindert dich daran, die Datei kurz zu öffnen, Copy/Paste und wieder zu schliessen. Mit Application.DisplayAlersts=False bekommt der Benutzer nichts davon mit und ab einer handvoll Werten ist die Methode m.E. schneller.
Noch viel sympathischer wäre mir eine Lösung mittels Power-Query. Datenabfrage auf die externe Datei und schwupp sind die Daten da. Die einzige Hürde besteht darin, den Dateipfad variabel aus Zelle G2 zu beziehen. Leider spontan nur eine englische Anleitung gefunden:
https://accessanalytic.com.au/powerquery_namedcells_parameters/
(schau bei Bedarf auch mal bei den Youtube Tutorials rein, mal 5 min. PQ Intro gucken schadet nicht)
cu
Chris
Anzeige
AW: Import aus Excel-File bis Zeile leer ist
25.11.2020 14:15:40
Zuger
Hi Chris
Vielen Dank für deine Antwort und Inputs.
Also wenn ich dich richtig verstehe, meinst du, dass das VBA das andere Excel kurz öffnet und dann wieder schliesst, oder? Falls ja, spricht nix dagegen. Ich versuchte dies bereits mal umzusetzen in dieser Art.
Sub bereich_kopieren()
Dim Pfad As String
Dim wsZiel As Worksheet
Dim wsQuelle As Worksheet
Dim Sheet As String
Pfad = ThisWorkbook.Path & "\ImportFile for Outlook by Manager.xlsx"
Sheet = Range("G2")
'Zielblatt = aktive Datei, aktives Blatt
Set wsZiel = ActiveWorkbook.ActiveSheet
'Quellblatt = Datei, Blatt 1
Set wsQuelle = Workbooks.Open(Pfad).Sheet
wsQuelle.Cells.Copy Destination:=wsZiel.Cells
'Quelle schließen
wsQuelle.Parent.Close
Set wsQuelle = Nothing
Set wsZiel = Nothing
End Sub
Leider erscheint jeweils eine Fehlermeldung in der Zeile "Set wsQuelle = Workbooks.Open(Pfad).Sheet" und ich komme nicht drauf was ich falsch gemacht habe.
Ich wollte das ganze eigentlich mit VBA machen, da ich dieses VBA dann mit einem VBA verknüpfen kann, welches im Anschluss Kalendereinträge in Outlook erstellt. Dieses VBA funktioniert zum Glück einwandfrei.
Power Querry wäre in der Tat auch eine gute oder gar sehr gute Alternative. Dann wäre es eigentlich im einen weiteren Schritt möglich, das Set Up so aufzusetzen, dass andere User auf das File der zu importierenden Daten online z.B. wie Sharepoint zugreifen können. In diesem Szenario wäre der Pfad an sich fix, aber der Tab, welcher aus dem Excel-File kopiert werden muss ist variabel und wenn ich es richtig sehe, muss bei einem dynamischer Source in den Einstellungen von Power Query unter Privacy auf Always ignore Privacy Level settings gewechselt werden und dies finde ich suboptimal.
Gruss
Simon
Anzeige
AW: Import aus Excel-File bis Zeile leer ist
25.11.2020 14:50:34
ChrisL
Hi
ungetestet...
Sub bereich_kopieren()
Dim Pfad As String
Dim wsZiel As Worksheet
Dim wbQuelle As Workbook
Dim wsQuelle As Worksheet
Dim Sheet As String
Pfad = ThisWorkbook.Path & "\ImportFile for Outlook by Manager.xlsx"
Sheet = Range("G2")
'Zielblatt = aktive Datei, aktives Blatt
Set wsZiel = ActiveWorkbook.ActiveSheet
'Quellblatt = Datei, Blatt 1
Set wbQuelle = Workbooks.Open(Pfad)
Set wsQuelle = wbQuelle.Worksheets(".......")
wsQuelle.Cells.Copy Destination:=wsZiel.Cells
'Quelle schließen
wbQuelle.Close False
Set wsQuelle = Nothing
Set wsZiel = Nothing
End Sub

Mit PQ in Zusammenhang mit Sharepoint kenne ich mich zu wenig aus. Prinzipiell kann auch das anzusprechende Blatt als PQ Parameter definiert werden.
Mit dem Security Level hatte ich bisher keine Probleme, weil ich mich i.d.R. auf "sicheren Pfaden" bewege. Ich denke es müsste dem Admin auch möglich sein, einen Sharepoint-Pfad als sicher zu definieren, aber es handelt sich um eine Annahme meinerseits resp. stellt sich die Frage, ob der Pfad auch tatsächlich sicher wäre.
cu
Chris
Anzeige
AW: Import aus Excel-File bis Zeile leer ist
25.11.2020 19:11:27
Zuger
Hi Chris
Ich habe deinen Code getestet und an sich funktioniert er auch. Vielen Dank hierfür! Der Code überträgt nun jedoch das ganze Blatt und eigentlich möchte ich, dass nur die Spalten A bis C und ab Zeile 2 übertragen wird. Geht das mit dieser Variante? Denn das gaze wird ja als Worksheet definiert.
Nun das Problem bei PQ ist, dass dies im Zusammenhang mit den dynamischen Pfad ist. Siehe Auszug aus deiner verlinkten englischen Anleitung:
"For this to work you will need to change your privacy settings to “Ignore”, via Query Options, Privacy, Always ignore Privacy Level settings"
Und ich glaube es ist nicht schlau, wenn dies bei allen Mitarbeiter angepasst wird.
Schönen Abend wünsch ich dir!
Anzeige
AW: Import aus Excel-File bis Zeile leer ist
25.11.2020 19:22:59
ChrisL
Hi
Mit dem PQ Thema muss ich mich mal in Ruhe auseinander setzen.
Sub bereich_kopieren()
Dim strPfad As String, strBlatt As String
Dim wsZiel As Worksheet
Dim wbQuelle As Workbook
Dim wsQuelle As Worksheet
Application.ScreenUpdating = False
strPfad = ThisWorkbook.Path & "\ImportFile for Outlook by Manager.xlsx"
strBlatt = Range("G2")
'Zielblatt = aktive Datei, aktives Blatt
Set wsZiel = ActiveWorkbook.ActiveSheet
'Quellblatt = Datei, Blatt 1
Set wbQuelle = Workbooks.Open(strPfad)
Set wsQuelle = wbQuelle.Worksheets(strBlatt)
wsQuelle.Range("A2:C" & wsQuelle.Cells(Rows.Count, 1).End(xlUp).Row).Copy _
Destination:=wsZiel.Range("A1")
'Quelle schließen
wbQuelle.Close False
Set wsQuelle = Nothing
Set wsZiel = Nothing
End Sub

Anzeige
AW: Import aus Excel-File bis Zeile leer ist
27.11.2020 17:09:36
ChrisL
Hi
Also ich habe jetzt mal getestet.
Dummy-Datei auf Desktop mit Tabelle1, Tabelle2, Tabelle3.
Neue Datei mit Parameterfeld, Wert Tabelle1. Wie im Link meines ersten Beitrages beschrieben, Zelle benannt "BlattName", Zelle markiert, Abfrage aus Tabelle, Drilldown.
Danach die Hauptabfrage und im erweiterten Editor die fixe Angabe von Tabelle1 durch den Parameter ersetzt:
Quelle = Excel.Workbook(File.Contents("C:\Pfad\Desktop\PQTestInput.xlsx"), null, true),
Tabelle1_Sheet = Quelle{[Item=BlattName,Kind="Sheet"]}[Data],
#"Höher gestufte Header" = Table.PromoteHeaders(Tabelle1_Sheet, [PromoteAllScalars=true]),
Ging ratzfatz und hat ohne Sicherheitswarnung funktioniert. Ich musste auch keine Privacy Level auf Ignorieren setzen.
Ob es auch auf Sharepoint ginge, kann ich nicht testen. Aber probiere doch einfach mal, das Ganze hat mich nicht mehr als 5-10 Minuten Zeit gekostet. Es kann tatsächlich sein, dass eine externe Quelle eine Änderung der Datenschutzeinstellung erfordert.
Die Datenschutzeinstellung hat nichts mit Sicherheit (z.B. Viren o.ä.) zu tun, sondern mit der Geheimhaltung der Daten, welche du von extern beziehen willst. Machst du z.B. eine Webabfrage, wo die Daten sowieso öffentlich sind, dann spielt es m.E. auch keine Rolle, wenn jemand die Daten abfangen würde. Es wäre somit nur ein Problem, wenn in der externen Datei vertrauliche Daten vorhanden wären.
Security Note: Enabling Fast Combine by selecting Ignore the Privacy levels and potentially improve performance in the Workbook Settings dialog could expose sensitive or confidential data to an unauthorized person. Do not enable Fast Combine unless you are confident that the data source does not contain sensitive or confidential data.
https://support.microsoft.com/en-us/office/privacy-levels-power-query-cc3ede4d-359e-4b28-bc72-9bee7900b540
cu
Chris
Anzeige
AW: Import aus Excel-File bis Zeile leer ist
25.11.2020 19:18:41
ChrisL
ups...
Ich meinte natürlich ScreenUpdating und nicht DisplayAlerts. Die Variable Sheet würde ich umbenennen, weil es auch Sheet-Objekte gibt.
Sub bereich_kopieren()
Dim strPfad As String, strBlatt As String
Dim wsZiel As Worksheet
Dim wbQuelle As Workbook
Dim wsQuelle As Worksheet
Application.ScreenUpdating = False
strPfad = ThisWorkbook.Path & "\ImportFile for Outlook by Manager.xlsx"
strBlatt = Range("G2")
'Zielblatt = aktive Datei, aktives Blatt
Set wsZiel = ActiveWorkbook.ActiveSheet
'Quellblatt = Datei, Blatt 1
Set wbQuelle = Workbooks.Open(strPfad)
Set wsQuelle = wbQuelle.Worksheets(strBlatt)
wsQuelle.Cells.Copy Destination:=wsZiel.Cells
'Quelle schließen
wbQuelle.Close False
Set wsQuelle = Nothing
Set wsZiel = Nothing
End Sub

Anzeige
AW: Import aus Excel-File bis Zeile leer ist
26.11.2020 18:21:19
Zuger
Hi Chris
Vielen Dank für deine Hilfe, das Makro funktioniert nun genau so wie ich will. Danke!
Ich habe nur noch eine Kleinigkeit angepasst, dass er die Daten ab A2 einfügt.
Das mit PQ wäre dann die ultimative Lösung. Aber diese passt für mich auch schon sehr gut. Man kann ja nicht immer alles haben ;-)
Gruss aus der Zentralschweiz

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige