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

Daten importieren und auflisten

Daten importieren und auflisten
11.07.2016 08:33:38
Rookie
Hallo liebe VBA'ler,
und wieder stehe ich vor einem Problem und verstehe nicht warum es nicht funktioniert:
Ich habe einen Code mit dem ich Daten aus anderen Excel-Dateien auslese und in bestimmte Zellen eintrage. Funktioniert super, aber nur dann, wenn ab der ersten Zeile mit dem Datenimport begonnen wird. Ich möchte aber, dass der Import ab der zweiten Zeile beginnt, da ich noch Überschriften einfügen möchte.
Der Datenimport läuft durch, aber hört nicht nach dem letzten Datensatz auf und bringt mir den Laufzeitfehler 13 - Typen unverträglich.
Hier der Code, vielleicht wisst ihr wo der Fehler liegt:

Sub Datensuche()
Dim vntRet As Variant, strTMP As String
Dim pfad As String, ausgabe$()
Dim i&, p&
'Ordner und Suchbegriff festlegen
pfad = "R:\bereich35000\2016"
If Right(pfad, 1)  "\" Then pfad = pfad & "\"
strTMP = CreateObject("wscript.shell").exec("cmd /c Dir """ _
& pfad & "Maßnahmenplan*.xlsm" & """ /s /b").stdout.readall
Call OemToCharA(strTMP, strTMP)
vntRet = Split(strTMP, vbCrLf)
'Zellen leeren, Zähler aktivieren und Links ausgeben
If UBound(vntRet) > 0 Then
Master.Range("A2:P50").ClearContents
ReDim ausgabe(1 To UBound(vntRet) + 1, 1 To 1)
For i = 0 To UBound(vntRet)
ausgabe(i + 1, 1) = vntRet(i)
Next
If ausgabe(UBound(ausgabe), 1) = "" Then p = 1 Else p = 0
Master.Range("B2").Resize(UBound(ausgabe) - p, 1) = ausgabe
ReDim vntRet(1 To UBound(ausgabe) - p, 0)
For i = 1 To UBound(vntRet): vntRet(i, 0) = i: Next
Master.Range("A2").Resize(UBound(ausgabe) - p, 1) = vntRet
End If
'Daten auslesen und eintragen
Dim datein As Variant, dIN As Variant, dOut As Variant
Dim aWB As Workbook
Dim mDL&, mD&, mImp&, v&, z&, dl&, fehler As Boolean
mDL = Master.Range("B" & Master.Rows.Count).End(xlUp).Row
mD = Master.Range("C" & Master.Rows.Count).End(xlUp).Row
Application.ScreenUpdating = False
If mD > 2 Then Master.Rows("3:" & mD).ClearContents
mD = 3
dOut = Master.Range("C2:P2")
datein = Master.Range("B2").Resize(mDL + 1)
For v = 1 To mDL
If Dir(datein(v, 1))  "" Then
fehler = False
On Error Resume Next
Workbooks.Open datein(v, 1), False, True
If Err  0 Then
Master.Range("C" & v) = Err.Description
fehler = True
End If
On Error GoTo 0
If Not fehler Then
Set aWB = ActiveWorkbook
dIN = aWB.Sheets(1).UsedRange
aWB.Close savechanges:=False
dOut(1, 1) = v           ' Laufende Nummer
dOut(1, 2) = dIN(5, 20)  ' Berichtnummer
dOut(1, 3) = dIN(3, 8)   ' LC
dOut(1, 4) = dIN(4, 8)   ' AEP
dOut(1, 5) = dIN(5, 8)   ' Kostenstelle
dOut(1, 6) = dIN(6, 8)   ' Produktgruppe
dOut(1, 8) = dIN(4, 16)  ' Maßnahmenkoordinator
dOut(1, 9) = dIN(6, 20)  ' Auditor
dOut(1, 10) = dIN(4, 20)  ' Rückmeldetermin
dOut(1, 12) = dIN(8, 20)  ' Audit Abschlusstermin
dOut(1, 7) = dIN(4, 28)  ' ABC-Einstufung
dOut(1, 14) = dIN(7, 31)  ' Wirksamkeit offen
dOut(1, 11) = dIN(3, 32)  ' Rückmeldung Maßnahmen
dOut(1, 13) = dIN(4, 32)  ' Rückmeldung Wirksamkeit
Master.Range("C" & v + 1).Resize(, 14) = dOut
End If
End If
Next
Set aWB = Nothing
Columns("D:D").Select
ActiveWorkbook.Worksheets("Tabelle1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Tabelle1").Sort.SortFields.Add Key:=Range("D1"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Tabelle1").Sort
.SetRange Range("A1:Y19")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'Text wird in Hyperlink umgewandelt
Dim x As Long
For x = 1 To i - 1
With Master
.Hyperlinks.Add Anchor:=.Range("B" & x), Address:=.Range("B" & x).Value, ScreenTip:=.Range("B"  _
_
_
_
& x).Value, TextToDisplay:="Maßnahmenplan öffnen"
End With
Next x
ActiveWorkbook.Worksheets("Tabelle1").Range("A1").Select
End Sub

Vielen Dank für eure Hilfe!!!
Mit besten Grüßen
Stefan

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
kommt mir bekannt vor
11.07.2016 11:02:31
Michael
Hi Stefan,
es wäre hilfreich, wenn Du uns sagst, in welcher Zeile der Fehler kommt.
Der Code stammt - zumindest teilweise - von mir: kannst Du mir den Thread angeben? Vielleicht habe ich noch einen Satz Beispieldatei zum Testen.
Schöne Grüße,
Michael

AW: Daten importieren und auflisten
11.07.2016 11:16:25
baschti007
Ja weil er beim zählen noch eine Spalte mehr hat ....
versuch mal so diese beiden zu ersetzen
For v = 2 To mDL - 1
For x = 2 To i
mir ist aufgefallen das bei mir die Hyperlinks nicht funktionieren der macht das ß immer zu á bei dir auch ?Liegt wohl an CreateObject("wscript.shell")
dann unten einfach
strTMP = CreateObject("wscript.shell").exec("cmd /c Dir """ _
& pfad & "Maßnahmenplan*.xlsm" & """ /s /b").stdout.readall
'Call OemToCharA(strTMP, strTMP)
strTMP = Replace(strTMP, "á", "ß")'--- á wird durch ? ersetzt
vntRet = Split(strTMP, vbCrLf)
Aber da passt irgendwas nicht so wirklich ein ziemliches durcheinander bei dir =D was auch immer du das vor hast viel glück ;)

Anzeige
OemToCharA
11.07.2016 12:00:14
Michael
Hi Baschti,
OemToCharA ist eine API-Funktion, deren Deklaration
Private Declare Function OemToChar Lib "user32" Alias "OemToCharA" _
(ByVal lpszSrc As String, ByVal lpszDst As String) As Long

im Code-Schnipsel nicht mit kopiert wurde: sie wandelt den Zeichensatz der Kommandozeile in den Win-Zeichensatz um. Siehe u.a. http://dbwiki.net/wiki/VBA_Tipp:_Umlaute_ersetzen
Bei 64-bit-Win muß noch das ptrsave mit rein.
Schöne Grüße,
Michael

AW: OemToCharA
11.07.2016 12:03:03
baschti007
Ah Ok Mein Fehler =)
Ich hatte diese Funktion nicht deshalb hab ich Sie ausgeblendet =)
Danke für die info ;)

Anzeige
AW: Daten importieren und auflisten
11.07.2016 12:03:37
Matthias
Hallo Rookie! Wie baschti schon schrieb, liegt es glaube ich an deiner Dimensionierung. Allerdings würde ich nicht v einkürzen. Damit würde dir wohl zumindest der erste Datensatz verloren gehen. Problem ist wohl, dass du mit
mDL = Master.Range("B" & Master.Rows.Count).End(xlUp).Row
die letzte beschrieben Zeile in Spalte B suchst. Hier
datein = Master.Range("B2").Resize(mDL + 1)
weist du dann aber datein beginnend von B2 und nochmal beim Rezise eins drauf Zeilen zu. Damit hast du 2 Zeilen mehr als beschrieben wurden in datein. Die sind aber definitiv leer. (Ergebnis erste Zählung). Habe eben mal mit der Dir() Funktion gespielt. Wenn du nix übergibst, kommt auch wie erwartet ein "" zurück. Übergibst du aber eine Variable die leer ist, findet er zumindest bei mir eine logfile. Deshalb bricht der COde hier
If Dir(datein(v, 1)) "" Then
nicht ab sonder macht weiter und rennt dann beim öffnen in einen Fehler (wobei dann eine andere Fehlernummer kommen sollte), da du ja was leeres als Pfad übergeben hast. Könnte man beheben, wenn du bei der Prüfung noch abfragst, ob der INhalt leer ist (oder dein Array einkürzen bei resize mit -1 statt + 1) bspw. so
If datein(v, 1) "" and Dir(datein(v, 1)) "" Then
könnte es klappen.
Wo du genau die Zeile für die Übeschriften haben willst, habe ich nicht verstanden. Bei jedem einfügen oder nur einmal am Anfang. Wenn am Anfang, dann sollte es doch mit dem Range("C" & v + 1) von dir schon klappen. Wenn jede zweite Zeile, dann ggf. so Range("C" & v *2).
HAbe den Code von dir aber nicht getestet. Wären nur so die Gedanken beim Lesen.
VG Matthias

Anzeige
AW: Daten importieren und auflisten
11.07.2016 12:13:15
baschti007
Hast du keine Beispiel Datei und dann sagst du wo was hin soll das ist immer 1000 mal einfacher als selber sich was zusammen zu stricken ? Ich meine irgendwo hattest du schon mal eine aber besser ist es wenn ein neues Thema , neue Bsp Datei und auch eine von den Maßnahmenplänen
Gruß Basti

AW: Daten importieren und auflisten
11.07.2016 12:41:07
Matthias
Hallo! Ich glaub der Beitrag war an den falschen adressiert. Zumindest bin ich mir keiner Schuld bewußt. :-)

AW: Daten importieren und auflisten
11.07.2016 12:44:45
baschti007
Ups JA =D

AW: Daten importieren und auflisten
11.07.2016 15:45:18
Rookie
Hallo zusammen,
und erstmal Danke für euer Interesse an der ganzen Sache!
Hier ein paar Antworten auf eure Fragen:
@Michael:
Ja, das ist dein Code. Funktioniert echt super und nochmals vielen Dank dafür. Hier der Beitrag von damals:
https://www.herber.de/forum/archiv/1500to1504/t1500338.htm#1500338
Jetzt ist es so, ich möchte den Code in eine bestehende Arbeitsmappe einfügen und musste ihn dafür, wie du schon gesehen hast, etwas umbauen, damit alles in einem Tabellenblatt funktioniert. Tut es auch soweit.
Ich hätte gerne, dass die Links zu den jeweiligen Maßnahmenplänen sowie die Daten dieser Pläne in einem Tabellenblatt in jeweils einer Zeile dargestellt werden.
Damit das ganze auch für außenstehende Übersichtlich wird, brauche ich pro Spalte eine Überschrift damit man auch versteht um was es sich handelt. Das war damals in deinem Code auch schon so drinnen, konnte ich aber auf das eine Tabellenblatt nicht übertragen
Wie Matthias bereits herausgefunden hat, tritt der Fehler hier auf:
For v = 1 To mDL
If Dir(datein(v, 1)) "" Then
@ Matthias:
Ich habs so geändert wie du es beschrieben hast, hat aber leider nicht funktioniert.
Ich habe das ganze jetz mit meiner überdurchschnittlichen Bauernschläue auf maximalst unprofessionelle Art und Weise - so halb - gelöst:
Funktioniert leider auch nicht so ganz wie ich es gerne hätte, aber ich glaube ihr könnt euch ein Bild davon machen, was ich vor habe:
Hier die Datei mit deren Hilfe ich die Daten der Maßnahmenpläne zusammenführe:
https://www.herber.de/bbs/user/106917.xlsm
Und hier einer dieser Maßnahmenpläne:
https://www.herber.de/bbs/user/106918.xlsm
Ich habe zusätzlich noch eine Ampelfunktion für die Überschreitung/Einhaltung von Terminen eingefügt. Diese wird natürlich auch bei jedem durchlauf gelöscht. Für dieses Problem habe ich ebenfalls noch keine Lösung gefunden.
Nun ja, vielleicht habt ihr ja ne idee wie ich diese Liste endlich mal zu laufen kriege.
Ich Danke euch für eure Unterstützung und für eure Vorschläge. Vielleicht habt ihr auch bessere Ideen zur Darstellung und Umsetzung.
Mit besten Grüßen
Stefan

Anzeige
Zeichensatzproblem!
11.07.2016 16:12:59
Michael
Hi,
das ist ein Zeichensatzproblem, das zunächst in der Testumgebung nicht aufgetaucht ist...
Der Punkt ist, daß das "ß" aus "Maßnahmenplan" nicht richtig in die Shell übergeben wird; Abhilfe würde schaffen, das so zu machen:
strTMP = CreateObject("wscript.shell").exec("cmd /c Dir """ _
& pfad & "Ma?nahmenplan*.xlsm" & """ /s /b").stdout.readall

oder gar keine Umlaute in Dateinamen zu verwenden, die machen traditionell immer wieder Ärger, sei es zwischen verschiedenen Betriebssystemen in einer Netzwerkumgebung oder schon schlicht beim Hochladen ins Forum.
Außerdem (zu meiner Ehrenrettung): ich frage ab, ob überhaupt was eingelesen wurde, das ist im Prinzip die Zeile
If UBound(vntRet) > 0 Then

ubound(vntRet) hat nämlich den Wert -1, wenn nix da ist.
DESHALB die Abfrage! Das End If dieser Abfrage muß ganz ans Ende des Makros, und in einem Else kannst Du eine MsgBox mit Fehler ausgeben, á la "Datei nicht gefunden".
Schöne Grüße,
Michael

Anzeige
Nachtrag
11.07.2016 16:18:03
Michael
Excel bietet nicht direkt einen "Zweizeiler" zum rekursiven Auslesen von Verzeichnissen (d.h. mit Unterverzeichnissen).
Es GIBT natürlich diverse Möglichkeiten, wenn Du z.B. recherchierst...
excel vba ordner mit unterordner auslesen
aber die Shell (die den "DOS"-Befehl dir aufruft) ist halt sehr kurz, wenn auch nicht ohne Tücken.

AW: Nachtrag
12.07.2016 07:51:42
Rookie
Guten Morgen alle zusammen,
ich hab jetzt mal das Wort "Maßnahmenplan" komplett weg gelassen und versucht nur nach der Dateiendung (.xlsm) zu suchen. Passiert aber genau das gleiche wie vorher - alle Pfade werden aufgelistet und es werden auch alle Daten übertragen.
Er hört dann aber nicht auf, sondern fängt wieder von vorne an.
Und hier:
For v = 1 To mDL
If datein(v, 1) "" And Dir(datein(v, 1)) "" Then
tritt der Fehler auf (Laufzeitfehler 13 - Typen unverträglich).
https://www.herber.de/bbs/user/106931.xlsm
Naja, das ganze is mir etwas zu hoch. Ich würd mich freuen falls jemand Lust hat was zu basteln, selber werd ich hier nicht viel weiterkommen.
Nun denn, ich geh jetzt in die Arbeit und mach was von dem ich auch Ahnung habe! :-)
Schönen Tag und liebe Grüße
Stefan

Anzeige
AW: Nachtrag
12.07.2016 09:43:42
Michael
Hi Stefan,
ich habe mal ein paar Änderungen vorgenommen (bitte passe den Pfad wieder an):
Sub ordner_auflisten_neu()
Dim vntRet As Variant, strTMP As String
Dim pfad As String, ausgabe$()
Dim i&, p&
Dim datein As Variant, dIN As Variant, dOut As Variant
Dim aWB As Workbook
Dim mDL&, mD&, mImp&, v&, z&, dl&, fehler As Boolean
Dim x As Long
'Ordner und Suchbegriff festlegen
'  pfad = "R:\kst128000\individual\Audits\IPS Stahl\2016"
pfad = "C:\A_Herber\"
If Right(pfad, 1)  "\" Then pfad = pfad & "\"
strTMP = CreateObject("wscript.shell").exec("cmd /c Dir """ _
& pfad & "Ma?na*.xlsm" & """ /s /b").stdout.readall
Call OemToCharA(strTMP, strTMP)
vntRet = Split(strTMP, vbCrLf)
'Zellen leeren, Zähler aktivieren und Links ausgeben
If UBound(vntRet) > 0 Then
dOut = Master.Range("A1:S1")
Master.Cells.ClearContents
Master.Range("A1:S1") = dOut
ReDim ausgabe(1 To UBound(vntRet) + 1, 1 To 1)
For i = 0 To UBound(vntRet)
ausgabe(i + 1, 1) = vntRet(i)
Next
If ausgabe(UBound(ausgabe), 1) = "" Then p = 1 Else p = 0
Master.Range("B2").Resize(UBound(ausgabe) - p, 1) = ausgabe
ReDim vntRet(1 To UBound(ausgabe) - p, 0)
For i = 1 To UBound(vntRet): vntRet(i, 0) = i: Next
Master.Range("A2").Resize(UBound(ausgabe) - p, 1) = vntRet
Else
MsgBox "Keine Daten vorhanden"
Exit Sub
End If
'Daten auslesen und eintragen
Stop
mDL = Master.Range("B" & Master.Rows.Count).End(xlUp).Row
Application.ScreenUpdating = False
dOut = Master.Range("C2:S2")
datein = Master.Range("B1").Resize(mDL)
For v = 2 To mDL
If datein(v, 1)  "" And Dir(datein(v, 1))  "" Then
fehler = False
On Error Resume Next
Workbooks.Open datein(v, 1), False, True
If Err  0 Then
Master.Range("C" & v) = Err.Description
fehler = True
End If
On Error GoTo 0
If Not fehler Then
Set aWB = ActiveWorkbook
dIN = aWB.Sheets(1).UsedRange
aWB.Close savechanges:=False
dOut(1, 1) = v           ' Laufende Nummer der Ausgelesenen Berichte (nicht die  _
Berichtsnummer)
dOut(1, 2) = dIN(5, 20)  ' Berichtnummer
dOut(1, 3) = dIN(3, 8)   ' LC
dOut(1, 4) = dIN(4, 8)   ' AEP
dOut(1, 5) = dIN(5, 8)   ' Kostenstelle
dOut(1, 6) = dIN(6, 8)   ' Produktgruppe
dOut(1, 7) = dIN(4, 28)  ' ABC-Einstufung
dOut(1, 8) = dIN(3, 28)  ' %-Einstufung
dOut(1, 9) = dIN(4, 16)  ' Maßnahmenkoordinator
dOut(1, 10) = dIN(6, 20)  ' Auditor
dOut(1, 11) = dIN(4, 20)  ' Soll Rückmeldetermin
dOut(1, 12) = dIN(3, 32)  ' Ist Rückmeldetermin
dOut(1, 14) = dIN(8, 20)  ' Soll Abschlusstermin
dOut(1, 15) = dIN(5, 32)  ' Ist Auditabschluss
dOut(1, 17) = dIN(4, 32)  ' Rückmeldung Wirksamkeit
Master.Range("C" & v).Resize(, 17) = dOut
End If
End If
Next
Set aWB = Nothing
'Text wird in Hyperlink umgewandelt
For x = 2 To mDL
With Master
.Hyperlinks.Add Anchor:=.Range("B" & x), Address:=.Range("B" & x).Value, _
ScreenTip:=.Range("B" & x).Value, TextToDisplay:="Maßnahmenplan öffnen"
End With
Next x
'ActiveWorkbook.Worksheets("Tabelle1").Range("A1").Select ' ist eh nur eines da...
End Sub
Weshalb die "Typen unverträglich" kam - ist mir schon peinlich: die Zeile
Master.Range("A2:P50").ClearContents
löscht nur bis Zeile 50, da hatte ich die Zeilenermittlung hintenangestellt und es hinterher vergessen.
Das wirkt sich dann so aus, daß wenn zuvor mehr Datein als bis Zeile 50 eingelesen wurden und dann nur, sagen wir, 20, daß die alten dann noch unten standen.
Ansonsten kann ich es nicht sehen, daß Dims im Code verteilt sind.
Aber: weshalb da was "wieder von vorne" anfangen soll, ist nicht nachvollziehbar. Der Code enthält keine Schleifen oder Sprünge (goto), die für so etwas verantwortlich sein könnten.
Wie wird das Makro denn aufgerufen? Vielleicht hakelt es an einem Event?
Schöne Grüße,
Michael

Anzeige
AW: Nachtrag
12.07.2016 16:01:26
Rookie
Hallo Michael,
VIELEN HERZLICHEN DANK!!! Funktioniert super! Ich muss Dich mal aufn Bier einladen!
Gruß
Stefan

sehr schön, das freut mich,
13.07.2016 11:24:26
Michael
Stefan,
bis demnächst im Biergarten,
Prost,
Michael

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige