48075
28.01.2010
42020
19
0
Zellwert aus 100 Tabellenblättern auslesen
Hallo zusammen,
leider habe ich nichts auf die Schnelle gefunden, ich hätte ein kleines Problem (hoffe ich).
Ich muss aus einer Datei, die über 100 Excelblätter enthält aus jedem Tabellenblatt den Wert der Zelle „B 35“ auslesen und in eine Gesamtübersicht untereinander eintragen. Die Reihenfolge ist völlig egal, die Werte sollten einfach untereinander stehen.
Kann mir jemand behilflich sein !?
Vielen Dank im Voraus !!
Tom
leider habe ich nichts auf die Schnelle gefunden, ich hätte ein kleines Problem (hoffe ich).
Ich muss aus einer Datei, die über 100 Excelblätter enthält aus jedem Tabellenblatt den Wert der Zelle „B 35“ auslesen und in eine Gesamtübersicht untereinander eintragen. Die Reihenfolge ist völlig egal, die Werte sollten einfach untereinander stehen.
Kann mir jemand behilflich sein !?
Vielen Dank im Voraus !!
Tom
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 134603
Url: https://administrator.de/contentid/134603
Ausgedruckt am: 26.11.2024 um 15:11 Uhr
19 Kommentare
Neuester Kommentar
Hallo bender70!
Sorry, habe mich mal wieder verlesen und meinen Kommentar wieder entfernt
Gruß Dieter
Sorry, habe mich mal wieder verlesen und meinen Kommentar wieder entfernt
Gruß Dieter
Hallo bender70!
Soferne diese Tabellen fortlaufend benannte Namen haben (was Du aus welchen Gründen auch immer geheim gehalten hast ), sollte ein Eintrag und eine Formel genügen:
Diese beiden Zellen kannst Du markieren und nach unten ausfüllen ...
Grüße
bastla
Soferne diese Tabellen fortlaufend benannte Namen haben (was Du aus welchen Gründen auch immer geheim gehalten hast ), sollte ein Eintrag und eine Formel genügen:
in A2: Tabelle1
in B2: =INDIREKT(A2 & "!B35")
Grüße
bastla
Hallo Tom
Ich vermute, dass du die Zellinhalte der Zellen B35 aller Blätter addieren willst, weil du sie untereinander in beliebiger Reihenfolge haben möchtest.
Dafür gibt es eine bessere Möglichkeit: Sogenannte 3D-Bezüge. Damit kannst du gezielt immer die gleiche Zelle in einer Reihe von Arbeitsblättern ansprechen.
Für die Summe aller Zellen B35 in den Blättern Tabelle1 bis Tabelle100 müsstest du schreiben:
=summe(tabelle1:tabelle100!B35)
Noch ein Hinweis: Eine Arbeitsmappe mit über 100 Blättern, auf die alle gleichzeitig zugegriffen werden muss, riecht mir ganz nach einer relationalen Datenbank, die sich mit Access wesentlich besser handeln lässt. Überlege mal, ob ein Umstieg sinnvoll wäre.
Gruß Hans
Ich vermute, dass du die Zellinhalte der Zellen B35 aller Blätter addieren willst, weil du sie untereinander in beliebiger Reihenfolge haben möchtest.
Dafür gibt es eine bessere Möglichkeit: Sogenannte 3D-Bezüge. Damit kannst du gezielt immer die gleiche Zelle in einer Reihe von Arbeitsblättern ansprechen.
Für die Summe aller Zellen B35 in den Blättern Tabelle1 bis Tabelle100 müsstest du schreiben:
=summe(tabelle1:tabelle100!B35)
Noch ein Hinweis: Eine Arbeitsmappe mit über 100 Blättern, auf die alle gleichzeitig zugegriffen werden muss, riecht mir ganz nach einer relationalen Datenbank, die sich mit Access wesentlich besser handeln lässt. Überlege mal, ob ein Umstieg sinnvoll wäre.
Gruß Hans
Oh weh, Tom,
es ist schade um jede Minute Arbeitszeit, die du in dieses verkorkste System investierst. Steige um auf eine richtigige Datenbank. 2500 Tabellen! Wahnsinn! Für eine echte Datenbank ist das aber überhaupt kein Problem und du hast dann alles in einer einzigen Datei.
Wenn du HIlfe zum Umstieg auf eine echte Datenbak brauchst, kannst du dich an mich wenden.
Gruß
Hans
es ist schade um jede Minute Arbeitszeit, die du in dieses verkorkste System investierst. Steige um auf eine richtigige Datenbank. 2500 Tabellen! Wahnsinn! Für eine echte Datenbank ist das aber überhaupt kein Problem und du hast dann alles in einer einzigen Datei.
Wenn du HIlfe zum Umstieg auf eine echte Datenbak brauchst, kannst du dich an mich wenden.
Gruß
Hans
ungetestet und in VBS eventuell so:
das sollte erst einmal bis 100 Exceldateien funktionieren. Teste mal
Gruss
Tsuki
Dim Pfadangabe, Ordner, objxls
Dim Variable(100) , Zaehler
Zaehler = 0
Ordner = InputBox("Bitte Pfad eingeben ","...","C:\")
If Not Right(Ordner,1) = "\" then Ordner = Ordner & "\"
set fs = createobject("Scripting.FileSystemObject")
Set objXLS = WScript.CreateObject("Excel.Application")
Listordner Ordner
Sub ListOrdner(ordner)
'On Error resume next
Set ordner = fs.getfolder(ordner)
For Each file In ordner.files
Pfadangabe =file.path
objXLS.Workbooks.Open Pfadangabe
objXLS.Visible = False
Variable(Zaehler) = OBJXLS.Range("B35").Text
objXLS.Quit
Zaehler = Zaehler + 1
Next
End Sub
Set objXLS = WScript.CreateObject("Excel.Application")
objXLs.Workbooks.Add
objXLS.Visible = True
for i = 0 to Ubound(Variable)
If not Variable(i) = "" then
objXLs.Cells(i + 1, 1).Value = Variable(i)
end if
next
set fs = nothing
Set objXLS = nothing
das sollte erst einmal bis 100 Exceldateien funktionieren. Teste mal
Gruss
Tsuki
Hallo @all!
Wenn schon von der bestehenden Struktur ausgegangen werden soll, könnten es zumindest dynamische Bezüge auf die einzelnen Dateien sein - das ließe sich aus der der "Sammel"-Datei etwa mit folgendem VBA-Script umsetzen:
Das Script sollte Formeln der Art
für alle im angegebenen Ordner enthaltenen Dateien erzeugen.
Grüße
bastla
Wenn schon von der bestehenden Struktur ausgegangen werden soll, könnten es zumindest dynamische Bezüge auf die einzelnen Dateien sein - das ließe sich aus der der "Sammel"-Datei etwa mit folgendem VBA-Script umsetzen:
Sub ErstelleBezuege()
'"Sammel"-Tabelle
Spalte = "A"
StartZeile = 3
'"Daten"-Tabellen
Ordner = "D:\XL-Dateien" 'Ordner mit den einzelnen Dateien
Tabelle = "Tabelle1" 'Tabelle, in welcher die Daten in B35 stehen
Bezug = "B35" 'Zelle mit den gesuchten Daten
Zeile = StartZeile
Set fso = CreateObject("Scripting.FileSystemObject")
For Each File In fso.GetFolder(Ordner).Files
If LCase(fso.GetExtensionName(File.Name)) = "xls"
Cells(Zeile, Spalte).Formula = "='" & File.ParentFolder & "\[" & File.Name & "]" & Tabelle & "'!" & Bezug
Zeile = Zeile + 1
End If
Next
End Sub
='D:\XL-Dateien\[Schraube gelackt.xls]Tabelle1'!B35
Grüße
bastla
@tsuki
Für mich sieht Dein Script - allerdings ohne es getestet zu haben - OK aus.
Was ich allerdings anders gemacht hätte, ist das Eintragen in die Tabelle - wenn Du nämlich die Zeilennummer der Zelle von der Schleifenvariablen i abhängig machst (
In solchen Fällen verwende ich einen eigenen Zähler (meist die Variable "Zeile") für die Zeillenummer ...
Grüße
bastla
Trotzdem interessiert mich, was bei meinem VBS-Script nicht läuft.
Nachvollziehbar; auch ich habe die Angabe der konkreten Fehlermeldung vermisst ...Für mich sieht Dein Script - allerdings ohne es getestet zu haben - OK aus.
Was ich allerdings anders gemacht hätte, ist das Eintragen in die Tabelle - wenn Du nämlich die Zeilennummer der Zelle von der Schleifenvariablen i abhängig machst (
"objXLs.Cells(i + 1, 1).Value = Variable(i)"
, ist eigentlich das vorhergehende "If
" unnötig, da es egal sein sollte, ob die Zielzelle übersprungen oder mit dem Inhalt "" gefüllt wird ...In solchen Fällen verwende ich einen eigenen Zähler (meist die Variable "Zeile") für die Zeillenummer ...
Grüße
bastla
Hallo bastla,
danke dir für deine Ausführung!
Das ist richtig, was du schreibst!
Ich hatte es nur auf die schnelle zusammen "gekrickselt". Dieses
Nuja, mein script sollte zumindest ausbaufähig sein. Man könnte die "Leerstellen" oder was auch immer in den Exceldateien abfragen, sie markiert in das neue Formular eintragen. Alles kein Problem. Aber wie du auch schon richtig bemerkt hast hat der TO die eigentliche Fehlermeldung nicht niedergeschrieben. Von daher.....
Mein Script war nur so eine Idee.
Viele Grüße
Tsuki
<Edit>
Achso, eins noch, das IF bla bla bla in der Schleife zum eintragen in die neue Tabelle bezog sich auf das "Ubound" der Variable. Falls weniger wie 100 (oder in meinem Fall 101) Excel-Dateien im ausgewählten Ordner stehen, soll keine "Pseudonull" eingetragen werden.
Naja, ganz 100pro ist mein Script nicht, aber es zeigt die "Angelroute" (wie biber es beschreibt)
</Edit>
danke dir für deine Ausführung!
Das ist richtig, was du schreibst!
Ich hatte es nur auf die schnelle zusammen "gekrickselt". Dieses
i+1
ist sicher nie elegant, weil ja bei Excel es mit1
anfängt.Nuja, mein script sollte zumindest ausbaufähig sein. Man könnte die "Leerstellen" oder was auch immer in den Exceldateien abfragen, sie markiert in das neue Formular eintragen. Alles kein Problem. Aber wie du auch schon richtig bemerkt hast hat der TO die eigentliche Fehlermeldung nicht niedergeschrieben. Von daher.....
Mein Script war nur so eine Idee.
Viele Grüße
Tsuki
<Edit>
Achso, eins noch, das IF bla bla bla in der Schleife zum eintragen in die neue Tabelle bezog sich auf das "Ubound" der Variable. Falls weniger wie 100 (oder in meinem Fall 101) Excel-Dateien im ausgewählten Ordner stehen, soll keine "Pseudonull" eingetragen werden.
Naja, ganz 100pro ist mein Script nicht, aber es zeigt die "Angelroute" (wie biber es beschreibt)
</Edit>
@tsuki
... allerdings ließe sich das Problem der (vorweg) unbekannten Arraygröße relativ elegant lösen: Anstatt den ausgelesenen Wert in das Array einzutragen, könntest Du ihn zunächst einem String hinzufügen, also etwa
Die Umwandlung in ein Array geht dann per "
Das Trennzeichen (im Beispiel ";") darf natürlich in den eigentlichen Daten nicht vorkommen und muss daher ev mittels eines anderen Zeichens realisiert werden.
Grüße
bastla
as IF bla bla bla in der Schleife zum eintragen in die neue Tabelle bezog sich auf das "Ubound" der Variable. Falls weniger wie 100 (oder in meinem Fall 101) Excel-Dateien im ausgewählten Ordner stehen, soll keine "Pseudonull" eingetragen werden.
Sinnvolle Überlegung ...... allerdings ließe sich das Problem der (vorweg) unbekannten Arraygröße relativ elegant lösen: Anstatt den ausgelesenen Wert in das Array einzutragen, könntest Du ihn zunächst einem String hinzufügen, also etwa
Daten = Daten & ";" & OBJXLS.Range("B35").Text
Split
":Variable = Split(Mid(Daten, 2), ";")
Grüße
bastla
@bastla
das einfachste liegt immer so fern
Du hast recht, bezüglich der grenzenlosen Arrays!
Man kann natürlich auch die Variable definieren indem man schreibt
Ich danke dir für deine Ausführungen!
Viele Grüße
Tsuki
das einfachste liegt immer so fern
Du hast recht, bezüglich der grenzenlosen Arrays!
Man kann natürlich auch die Variable definieren indem man schreibt
Dim blabla()
Dann ist es ja auch "offen" und später mit "Ubound" kann man die "Größe" ermitteln, richtig?Ich danke dir für deine Ausführungen!
Viele Grüße
Tsuki