3.4k Aufrufe
Gefragt in Tabellenkalkulation von m-o-m Mitglied (499 Punkte)
Hallo Alleswisser,

ich habe in einem Ordner knapp 150 gleich aufgebaute Excel 2003 Dateien.

Jetzt soll ich bestimmte Informationen der Dateien zusammenführen. Trotz Suche habe ich hier eider nix hier gefunden.

Ich benötige in einer Tabelle in Spalte A den jeweiligen Dateinamen und in Spalte B jeweils den Wert aus Tabelle 1 L24.

Zu allem Überfluss sind die Dateien alle mit Passwort lesegeschützt (immer gleich).

Bekommt ihr das hin???

Vielen Dank schonmal.

Gruß Maik

8 Antworten

0 Punkte
Beantwortet von kicia Mitglied (939 Punkte)
BELEHRUNG:
Ich muss der Vollständigkeit halber darauf hinweisen, daß man hier eigentlich nicht erwarten kann, fertige Scripts programmiert zu bekommen.
Es ist wohl eher so gedacht, daß man hier Hilfe bei Detailfragen bekommt.
Dein Glück ist (falls mein Script bei Dir funktioniert), daß ich gerade sehr viel Lust zum Scripten habe.

ANLEITUNG:
- Den Code in eine neue Textdatei kopieren und speichern
- die Datei umbenennen in zB.: 'xlsCombine.hta'
- Einstellungen müssen gemacht werden, siehe Codeabschnitt
settings = { ... }

HINWEIS:
Mein Script behandelt nicht:
- falsche, fehlende oder schreibgeschützte Dateien oder Dateinamen etc.
- Leere (nicht verwendete) Zelle L24
und wird in solchen Fällen mit 'Skriptfehler' abbrechen.

SCRIPT:

<html>
<head>
<hta:application id="DeineID" applicationname="DeinAppName" windowState="normal" >
<style type="text/css">
* { font-family:Verdana, Arial, Helvetica, sans-serif; }
h1 { font-size:20px; }
h2 { font-size:14px; }
p { font-size:11px; }
#msgs { border:solid 1px #0099CC; padding:4px; }
</style>

<title></title>
<script type="text/javascript">

settings = {
inFolder: getCurrentDirectory(), // Ordner mit jenen 150 Dateien
outFile: getCurrentDirectory() + "/out.xls", // Ordner und Dateiname der Ausgabedatei
password: "test", // passwort zum öffnen der Dateien
fileNamePrefix: "file" // nur Dateinamen bearbeiten, die mit dem fileNamePrefix beginnen
};

//-----------------------------
//-----------------------------
function getContentOfFiles()
{
var i = 0;
var out = [];
var startFolder = getCurrentDirectory();
var files = getFiles( startFolder, 5 )[1];
var xlsfile;

window.setTimeout( getNext, 100 );

function getNext()
{
if( i < files.length )
{
if( files[i].name.substr( 0, settings.fileNamePrefix.length ) == settings.fileNamePrefix )
{
msg( "loading file: " + files[i] );
xlsfile = loadExcelFile( files[i], settings.password );
out.push( xlsfile[23][11] );
}
i++;
window.setTimeout( getNext, 100 );
}
else
{
writeOutFile( settings.outFile, out );
msg( "outfile saved" );
msg( "done" );
}
}
};

//-----------------------------
//-----------------------------
function writeOutFile( filename, arr )
{
var excelApp = new ActiveXObject("Excel.Application");
var wbnew = excelApp.Workbooks.Add();
var sheet = wbnew.Sheets(1);
var x,y,i;
for ( i = 0; i < arr.length; i++ )
{
y = i + 1;
sheet.Cells( y, 1 ) = arr[i];
}
wbnew.SaveAs( filename );
wbnew.Close();
excelApp.Quit();
};

//-----------------------------
//-----------------------------
function init( )
{
getContentOfFiles();
}

//-----------------------------------------------------------------------------------
//-- get current directory
//-----------------------------------------------------------------------------------
function getCurrentDirectory()
{
var wssh = new ActiveXObject("WScript.Shell");
return wssh.CurrentDirectory.replace(/\\/g,"/");
}

//-----------------------------------------------------------------------------------
//-- returns an array: [ array of folder objects, array of file objects ]
//-- filter:
//-- n = 0000 (0): all folders and subfolders and all files
//-- n = 0001 (1): no folders
//-- n = 0010 (2): no files
//-- n = 0100 (4): no subfolders
//-----------------------------------------------------------------------------------
function getFiles( startfolder, n )
{
n = n || 0;
var fso = new ActiveXObject("Scripting.FileSystemObject");
var folders = new Array();
var files = new Array();
if( !fso.FolderExists( startfolder ) )
{
msg("Folder " + startfolder + " not found!");
return [ [],[] ];
}
getNext( startfolder );
return [ folders, files ];

function getNext( fld )
{
var folderObj = fso.getFolder( fld );
var filesEn, foldersEn;
if( (n & 2) == 0 )
{
filesEn = new Enumerator( folderObj.Files );
for (; !filesEn.atEnd(); filesEn.moveNext()) files.push( filesEn.item() );
}
if( (n & 1) == 0 )
{
folders.push( folderObj );
foldersEn = new Enumerator( folderObj.SubFolders );
if( (n & 4) == 0 )
{
for (; !foldersEn.atEnd(); foldersEn.moveNext()) getNext( foldersEn.item().path );
}
}
}
}

//---------------------------------
//---------------------------------
function loadExcelFile( fileName, password )
{
var x, y;
var currentRange;
var excelApp = new ActiveXObject("Excel.Application");
var wbin = excelApp.Workbooks.Open( fileName, 2, true, 1, password );
var out = new Array();
var row = new Array();

if( wbin.Sheets.Count > 0 )
{
currentRange = wbin.Sheets(1).UsedRange;

for ( y = 0; y < currentRange.Rows.Count; y++ )
{
for ( x = 0; x < currentRange.Columns.Count; x++ )
{
row.push( currentRange.Cells( y + 1, x + 1 ).Text );
}
out.push( row );
row = [];
}
}

wbin.Close();
excelApp.Quit();
return out;
}

//-----------------------------
//-----------------------------
function msg( s )
{
document.getElementById("msgs").innerHTML += s + "<br>";
//alert( s );
//WScript.Echo( s );
}

</script>
</head>
<body onLoad="init()">
<h1>Filelist</h1>
<div id="msgs"></div>
</body>
</html>
0 Punkte
Beantwortet von marie Experte (2k Punkte)
Hallo Maik,

zuerst brauchst Du das Passwort, hast Du das nicht kannst Du dein Unterfangen vergessen.

Dann liest Du die Dateinamen aus und schreibst sie untereinander in Spalte A, dazu benutzt Du eine API, da gibt es mehrere, probier aus, wenn es Dir nicht gelingt melde Dich nochmal, dann such ich Dir die raus, die ich benutzt habe: Zum Beispiel die hier:
www.vbarchiv.net/api/details.php?id=findfirstfile oder www.office-loesung.de/ftopic148247_0_0_asc.php.

Wenn Du alle Dateinamen gespeichert hast, fängst Du mit der ersten Zeile an, liest aus A den Dateinamen ein, liest den Wert aus Tabelle 1 L24 aus und schreibst ihn in derselben Zeile in Spalte B. Danach zählst Du eine Zeile weiter und machst dasselbe mit der zweiten Zeile. Das ganze natürlich in einer Schleife von der ersten bis zur letzten beschriebenen Zeile.

Gruß Marie
0 Punkte
Beantwortet von kicia Mitglied (939 Punkte)
Ach, vergessen, der Dateiname in Spalte A:

Ändere Zeile 42 zu:
out.push( [ files[i], xlsfile[23][11] ] );

und Zeile 67 zu:
sheet.Cells( y, 1 ) = arr[i][0];
sheet.Cells( y, 2 ) = arr[i][1];


Frag nach, wenn was unklar ist.
0 Punkte
Beantwortet von coros Experte (4k Punkte)
Hallo Maik,

nachfolgend mal ein Makro, dass Dir alle Exceldateien in einem Verzeichnis öffnet, die Zelle L24 ausließt und deren Wert und den Dateinamen in der Übersichtsdatei im 1. Tabellenblatt in Spalte A und B aufführt.

Kopiere das Makro in ein StandardModul und starte es z.B. über eine Befehlsschaltfläche
Teste das Makro aber bitte in einer Testdatei und nicht gleich in Deiner Originaldatei.

Option Explicit

Const strPfad = "C:\Eigene Dateien\"
Const strPasswort = "Hier das Passwort"

Sub Auslesen()
Dim Dateityp
Dim Obj As Object
Dim objAnzDateien As Object
Dim lngFirstRow As Long

Application.ScreenUpdating = False

Set Obj = CreateObject("Scripting.FileSystemObject")
Set objAnzDateien = Obj.getfolder(strPfad)

For Each Dateityp In objAnzDateien.Files
If Right(Dateityp.Name, 4) = ".xls" Then
Workbooks.Open Filename:=Dateityp, Password:=strPasswort
With ThisWorkbook.Sheets(1)
lngFirstRow = .Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row
.Cells(lngFirstRow, 1) = Dateityp.Name
.Cells(lngFirstRow, 2) = Range("L24")
End With
Workbooks(Dateityp.Name).Close
End If
Next
End Sub
Du musst in den Zeilen

Const strPfad = "C:\Eigene Dateien\"
Const strPasswort = "Hier das Passwort"
den Pfad und das Passwort der Dateien anpassen.

@kicia: Ist Dir aufgefallen, dass es sich hier um Excel handelt und daher wohl eher eine VBA-Lösung als Deine Lösunmg zum Einsatz kommen sollte?

MfG,
Oliver
[sub]Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du[/sub]
[sup] ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.[/sup]
0 Punkte
Beantwortet von m-o-m Mitglied (499 Punkte)
Hallo zusammen,

vielen, vielen Dank für eure Mühen.

Ich hab es, weil für übersichtlicher aussah mal mit dem Makro von Oliver probiert:

Dateiname funzt einwandfrei, nur den Zellinhalt will er nicht übernehmen. Es ist zwar die letzte Zelle in Spalte B markiert, aber die Zellen sind leer. Kann es daran liegen, dass in der Zelle eine Berechnung stattfindet? Ich hab es auch mit andern Zellen probiert, aber irgendwie klappt das nicht.

Gruß und nochmals besten Dank

Maik
0 Punkte
Beantwortet von coros Experte (4k Punkte)
Hallo Maik,

ändere mal die Zeile

.Cells(lngFirstRow, 2) = .Range("L24")in

.Cells(lngFirstRow, 2) = Sheets("Tabelle1").Range("L24")

MfG,
Oliver
[sub]Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du[/sub]
[sup] ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.[/sup]
0 Punkte
Beantwortet von m-o-m Mitglied (499 Punkte)
Hallo Oliver,

Du bist der König!!!!

Klasse und besten Dank.

Gruß Maik
0 Punkte
Beantwortet von coros Experte (4k Punkte)
Hallo Maik,

gerne geschehen. Danke auch für die Rückmelung.

MfG,
Oliver
[sub]Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du[/sub]
[sup] ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.[/sup]
...