Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Zellwert aus 100 Tabellenblättern auslesen

Frage Microsoft Microsoft Office

Mitglied: 48075

48075 (Level 1)

28.01.2010 um 15:15 Uhr, 15618 Aufrufe, 19 Kommentare

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
Mitglied: 76109
28.01.2010 um 15:31 Uhr
Hallo bender70!

Sorry, habe mich mal wieder verlesen und meinen Kommentar wieder entfernt

Gruß Dieter
Bitte warten ..
Mitglied: bastla
28.01.2010 um 16:22 Uhr
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:
in A2: Tabelle1 
in B2: =INDIREKT(A2 & "!B35")
Diese beiden Zellen kannst Du markieren und nach unten ausfüllen ...

Grüße
bastla
Bitte warten ..
Mitglied: hybadd
28.01.2010 um 19:06 Uhr
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
Bitte warten ..
Mitglied: 48075
28.01.2010 um 19:29 Uhr
Erstmal vielen Dank für die vielen und schnellen Antworten !

ich habe Euch leider einige wichtige Infos unterschlagen:

Es ist nicht eine Excel-Datei mit 100 Sheets, sondern es sind 100 verschiedene Exceltabellen mit verschiedensten Namen wie z.B. "Schraube 2,5x25" "Schraube gelackt"...

Es geht nur um die Kostenstelle in der Zelle B35, d.h. ich muss die auch nicht alle addiern, ich will damit nur überprüfen ob die da auch steht... 100 Stck könnte ich natürlich alle mal anklicken, aber es gibt weitere Dateien... also insgesamt 2.500 Tabellen...

Viele Grüsse
Tom
Bitte warten ..
Mitglied: hybadd
28.01.2010 um 19:33 Uhr
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
Bitte warten ..
Mitglied: TsukiSan
29.01.2010 um 01:14 Uhr
ungetestet und in VBS eventuell so:

01.
Dim Pfadangabe, Ordner, objxls 
02.
Dim Variable(100) , Zaehler 
03.
 
04.
Zaehler = 0 
05.
 
06.
Ordner = InputBox("Bitte Pfad eingeben ","...","C:\") 
07.
If Not Right(Ordner,1) = "\" then Ordner = Ordner & "\" 
08.
 
09.
set fs = createobject("Scripting.FileSystemObject") 
10.
 
11.
Set objXLS = WScript.CreateObject("Excel.Application") 
12.
 
13.
Listordner Ordner 
14.
 
15.
Sub ListOrdner(ordner) 
16.
	'On Error resume next 
17.
	 
18.
	Set ordner = fs.getfolder(ordner) 
19.
 
20.
	For Each file In ordner.files 
21.
		Pfadangabe =file.path 
22.
		objXLS.Workbooks.Open Pfadangabe 
23.
		objXLS.Visible = False 
24.
 
25.
		Variable(Zaehler) = OBJXLS.Range("B35").Text 
26.
 
27.
 
28.
		objXLS.Quit 
29.
		 
30.
		Zaehler = Zaehler + 1 
31.
	Next 
32.
 
33.
End Sub 
34.
 
35.
Set objXLS = WScript.CreateObject("Excel.Application") 
36.
objXLs.Workbooks.Add 
37.
objXLS.Visible = True 
38.
 
39.
for i = 0 to Ubound(Variable) 
40.
If not Variable(i) = "" then 
41.
	objXLs.Cells(i + 1, 1).Value = Variable(i) 
42.
end if 
43.
next 
44.
 
45.
 
46.
set fs = nothing 
47.
Set objXLS = nothing
das sollte erst einmal bis 100 Exceldateien funktionieren. Teste mal

Gruss
Tsuki
Bitte warten ..
Mitglied: 48075
29.01.2010 um 12:28 Uhr
@ Hans: dieses System hat mal ein Kollege "konstruiert", ich würde es gerne umstellen, aber leider fehlt die Zeit und die Einsicht von Chefe ...

@TsukiSan: Leider will es nicht laufen

ich habe aber etwas gefunden was man vielleicht umschreiben könnte:

Das Programm löscht immer die erste Zelle aus jeder Tabelle, die man vorher ausgewählt hat, vielleicht kann man das so umschreiben, dass das Programm statt löschen einfach die Zelle kopiert und dann in einen Gesamttabelle untereinander schreibt !?

Public Sub Dateien_oeffnen()
'Code für ein allgemeines Modul
On Error GoTo errExit
Dim WBQ As Workbook
Dim WBZ As Workbook
Dim vntDateien As Variant
Dim lngAnzahl As Long

Set WBZ = ActiveWorkbook

With Application
.DisplayAlerts = False
.ScreenUpdating = False
End With

' Verzeichnis und Dateien auswählen
vntDateien = _
Application.GetOpenFilename("Datei (*.xls),*.xls", False, False, False, True)
' Dateien öffnen, A1 der Tabelle1 löschen, speichern und schließen
For lngAnzahl = LBound(vntDateien) To UBound(vntDateien)
Workbooks.OpenText Filename:=vntDateien(lngAnzahl)
Set WBQ = ActiveWorkbook
WBQ.Worksheets("Tabelle1").Range("A1").Clear '< Zelle A1 der Datei löschen
WBQ.Save
WBQ.Close
Next

With Application
.DisplayAlerts = True
.ScreenUpdating = True
End With

MsgBox "Es wurden " & lngAnzahl - 1 & " Dateien geöffnet und bearbeitet.", 64
Application.DisplayAlerts = True
Exit Sub

'Fehlerbehandlung
errExit:
With Application
.DisplayAlerts = True
.ScreenUpdating = True
End With

If Err.Number = 13 Then
MsgBox "Es wurden keine Datei ausgewählt", 64
Else
MsgBox "Es ist ein Fehler aufgetreten." & vbCr _
& Err.Number & vbCr _
& Err.Description, 48
End If
End Sub

Viele Grüsse
Tom
Bitte warten ..
Mitglied: bastla
29.01.2010 um 13:48 Uhr
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:
01.
Sub ErstelleBezuege() 
02.
'"Sammel"-Tabelle 
03.
Spalte = "A" 
04.
StartZeile = 3 
05.
 
06.
'"Daten"-Tabellen 
07.
Ordner = "D:\XL-Dateien" 'Ordner mit den einzelnen Dateien 
08.
Tabelle = "Tabelle1"     'Tabelle, in welcher die Daten in B35 stehen 
09.
Bezug = "B35"            'Zelle mit den gesuchten Daten 
10.
 
11.
Zeile = StartZeile 
12.
Set fso = CreateObject("Scripting.FileSystemObject") 
13.
For Each File In fso.GetFolder(Ordner).Files 
14.
    If LCase(fso.GetExtensionName(File.Name)) = "xls" 
15.
        Cells(Zeile, Spalte).Formula = "='" & File.ParentFolder & "\[" & File.Name & "]" & Tabelle & "'!" & Bezug 
16.
        Zeile = Zeile + 1 
17.
    End If 
18.
Next 
19.
End Sub
Das Script sollte Formeln der Art
='D:\XL-Dateien\[Schraube gelackt.xls]Tabelle1'!B35
für alle im angegebenen Ordner enthaltenen Dateien erzeugen.

Grüße
bastla
Bitte warten ..
Mitglied: TsukiSan
29.01.2010 um 16:46 Uhr
Sorry@all,

es war mir nicht bewußt, dass es in VBA sein muss.
Was ist denn die Fehlermeldung@bender70? (Ist nur für mich, damit ich meine Fehler beseitigen kann.)
Was läuft denn nicht?

Gruss
Tsuki
Bitte warten ..
Mitglied: bastla
29.01.2010 um 16:53 Uhr
@Tsuki
es war mir nicht bewußt, dass es in VBA sein muss.
Muss es wohl nicht - bietet sich aber an ...

Grüße
bastla
Bitte warten ..
Mitglied: TsukiSan
29.01.2010 um 16:58 Uhr
Achso! Na dann!

Trotzdem interessiert mich, was bei meinem VBS-Script nicht läuft.
Hatte heute mal Zeit und es getestet. Es hat genau getan, was es sollte. Mh :-\
(Win XP Prof SP2, Office2000 Prof)

Naja, wohl nicht so wichtig.

Viele Grüße

Tsuki
Bitte warten ..
Mitglied: bastla
29.01.2010 um 17:10 Uhr
@Tsuki
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
Bitte warten ..
Mitglied: TsukiSan
29.01.2010 um 17:17 Uhr
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
i+1
ist sicher nie elegant, weil ja bei Excel es mit
1
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>
Bitte warten ..
Mitglied: bastla
29.01.2010 um 17:45 Uhr
@Tsuki
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
Die Umwandlung in ein Array geht dann per "Split":
Variable = Split(Mid(Daten, 2), ";")
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
Bitte warten ..
Mitglied: TsukiSan
29.01.2010 um 17:52 Uhr
@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
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
Bitte warten ..
Mitglied: bastla
29.01.2010 um 17:59 Uhr
@Tsuki
Dann ist es ja auch "offen" und später mit "Ubound" kann man die "Größe" ermitteln, richtig?
Braucht dann allerdings ein "ReDim Preserve" ...

Grüße
bastla
Bitte warten ..
Mitglied: TsukiSan
29.01.2010 um 18:03 Uhr
Braucht dann allerdings ein "ReDim Preserve" ...
Richtig! Das war es!

Danke dir!

Tsuki
Bitte warten ..
Mitglied: 48075
31.01.2010 um 18:09 Uhr
Oh, sorry, es funktioniert, mein Fehler !!

Vielen Dank !!!

Grüsse
TOM
Bitte warten ..
Mitglied: TsukiSan
01.02.2010 um 03:22 Uhr
wenigstens hat er
48075
vor seinem Austritt den Beitrag noch auf gelöst gesetzt.

Danke!
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
VB for Applications
gelöst Bestimmte Spalten aus CSV-Datei auslesen (VBS) (9)

Frage von Gurkenhobel zum Thema VB for Applications ...

Batch & Shell
Eventlog Druckjobs mit VBS auslesen (2)

Frage von joni2000de zum Thema Batch & Shell ...

Batch & Shell
gelöst Appx aus Image auslesen und entfernen (9)

Frage von Markus2016 zum Thema Batch & Shell ...

Microsoft Office
Button für Wechseln zwischen den Tabellenblättern (6)

Frage von lupi1989 zum Thema Microsoft Office ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (27)

Frage von patz223 zum Thema Windows Userverwaltung ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (20)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...