Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1504to1508
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

Arrays???

Arrays?
25.07.2016 14:08:56
Pelic
Hallo an alle.
Ich beschäftige mich seit einer Woche intensiver mit Makroporgrammierung in Excel. Habe durch dieses und andere Foren bereits sehr viel lernen können nur zu einem Problem was ich habe finde ich gar nichts. Vielleicht stelle ich mich auch einfach nur zu doof an ^^.
Zu meinem Problem:
Ich habe eine Excel-Datei mit einer unbestimmten Anzahl von Tabellen. Der Name der Tabellen wird vorher vom Script bereits aus einer anderen Excel-Datei entnommen. Dabei kann man zu den Namen sagen, dass sie am Anfang immer gleich sind und der Schluss durch eine Art Seriennummer gebildet wird. Der Anfang der Tabellennamen befindet sich auch in einer Variable. Was ich nun machen möchte ist, aus einer neu geöffneten Excel-Datei die bestimmten Seriennummern lesen und dann in meiner ursprünglichen Datei alle Tabellen die nicht diese Nummern enthalten zu löschen.
Als Beispiel habe ich in meiner Ursprungsdatei die Tabellen Beispiel0001 bis Beispiel0100. In meiner anderen geöffneten Datei finde ich die Nummer 0030, 0042, 0003 und 0054. Also sollen nun alle Tabellen bis auf Beipiel0030, Beispiel0042, Beispiel0003 und Beispiel0054 gelöscht werden.
Ich hatte gedacht, dass man die Nummern in einem Array speichert und dann abruft. Dafür kenne ich mich aber mit Arrays zu wenig aus um das ordentlich hinzubekommen. Ich hoffe meine Erklärung ist einleuchtend und mir kann jemand helfen.
Hier schon mal das was ich habe(wir gehen davon aus, dass die zweite Excel Datei schon offen ist.) :
intZeile = 29
Zeilenzahl = Cells("D29", Cells("D29").End(xlDown)).Rows.Count
For z = 0 To Zeilenzahl
ReDim Preserve arr(z)
arr(z) = Name & Cells(intZeile, 4).Value
intZeile = intZeile + 1
Next z
Um zwischen den Datein zu wechseln habe ich der Ursprungsdatei die variable zielmappe und der neu geöffneten Datei die Variable quellmappe gegeben. So kann ich mit Windows(zielmappe/quellmappe).Activate hin und her wechseln. Und Variablen wurden alle definiert.
Danke schon mal im Voraus.

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Arrays?
25.07.2016 14:26:42
baschti007
So kannst du das Array Füllen und auslesen für weitere Sachen solltest du eine Beispielmappe hochladen
Sub bb()
Dim Name As String
Dim arr
Name = "Tabelle"
intZeile = 29
Zeilenzahl = Range(Range("D29"), Range("D29").End(xlDown)).Rows.Count
arr = Array()
For Z = 0 To Zeilenzahl - 1 'Array einlesen
ReDim Preserve arr(Z)
arr(Z) = Name & Cells(intZeile, 4).Value
intZeile = intZeile + 1
Next Z
For i = LBound(arr) To UBound(arr) '-- Array auslesen
Debug.Print arr(i)
Next
End Sub

AW: Arrays?
25.07.2016 14:34:38
Michael
Hallo!
Kann man natürlich mittels Array lösen. Nachdem Du aber mit konkreten Angaben zu Deinen Verhältnissen gespart hast, hier nur schematisch:
Sub a()
Dim WbQ As Workbook
Dim WbZ As Workbook
Dim WsQ As Worksheet
Dim WsZ As Worksheet
Dim aTabs
Dim IstDa As Boolean
Dim i&
Application.ScreenUpdating = False
'Ausgangsmappe = DIESE Mappe (in der DIESES Makro liegt)
Set WbQ = ThisWorkbook
'Blattname, wo die zu behaltenden Blattnamen aufgeführt sind - anpassen
Set WsQ = Wb.Worksheets("Tabelle1")
'Die Zielmappe, in der die Blätter gelöscht werden sollen öffnen - anpassen
Set WbZ = Workbooks.Open(Filename:="C:\Irgenwo\DeineMappe.xlsx")
'Die zu behaltenden Blattnamen aus der Quellblatt direkt in ein Array einlesen
With WsQ
aTabs = Application.Transpose(Application.Transpose(.Range("D29:D" & _
.Cells(.Rows.Count, 4).End(xlUp).Row)))
End With
'Die Zielmappe durchgehen
With WbZ
'Fehlermeldung beim Löschen der Blätter unterdrücken
Application.DisplayAlerts = False
'Bei jedem Blatt prüfen, ob der Name im Array vorkommt
For Each WsZ In .Worksheets
For i = LBound(aTabs) To UBound(aTabs)
If WsZ.Name = "Beispiel" & aTabs(i) Then IstDa
Next i
'Kommt der Name im Array nicht vor, wird das Blatt gelöscht
If Not IstDa Then WsZ.Delete
Next WsZ
End With
Application.DisplayAlerts = True
Application.ScreenUpdating = True
Set WbQ = Nothing
Set WbZ = Nothing
Set WsQ = Nothing
Set WsZ = Nothing
Erase aTabs
End Sub
Nachdem die Blattnamen, die es zu behalten gibt, ja in einem Tabellenblatt definiert werden, ist es ratsam, diesen Zellbereich gleich direkt in ein Array zu schreiben (s.o. - D29:Dx, wobei "x" = letzte gefüllte Zelle in D).
LG
Michael
Anzeige
AW: Arrays?
25.07.2016 15:14:36
Pelic
Erstmal Danke für die schnelle Antwort.
Ich habe den Code gerade hoffentlich richtig auf mein Problem angewendet. Jedoch bekomme ich eine Fehlermeldung bei:
For i = LBound(aTabs) To UBound(aTabs)
If WsZ.Name = "Beispiel" & aTabs(i) Then IstDa
Next i
'Kommt der Name im Array nicht vor, wird das Blatt gelöscht
If Not IstDa Then WsZ.Delete
Der Fehler besagt: Prozedur anstelle einer Variablen erwartet.
Wie kann man das umgehen?
AW: Arrays?
25.07.2016 16:05:56
Pelic

intZeile = 29
Zeilenzahl = Range("D29", Range("D29").End(xlDown)).Rows.Count
arr = Array()
For z = 0 To Zeilenzahl - 1
ReDim Preserve arr(z)
arr(z) = Name & "_0" & Cells(intZeile, 4).Value
intZeile = intZeile + 1
Next z
With ZM
Application.DisplayAlerts = False
For Each wsz In .Worksheets
For z = LBound(arr) To UBound(arr)
If wsz.Name = arr(z) Then IstDa = True
Next z
If IstDa = False Then wsz.Delete
Next wsz
End With
Ich habe den Code jetzt so zu stehen. An sich funktioniert er auch. Außer das er mir einen Fehler bei wks.Delete anzeigt aber erst nachdem er bereits die gelöscht hat, welche nicht aufgelistet sind. Also im Prinzip alles richtig bis auf diesen Fehler. Aber wodurch entsteht er?
Fehlermeldung:
Laufzeitfehler '1004':
Die Methode 'Delete' für das Objekt '_Worksheet' ist fehlgeschlagen
Anzeige
AW: Arrays?
25.07.2016 16:32:50
Michael
Hallo!
Ja, in meinem Code war noch ein Fehler (deswegen auch mein Hinweise "schematisch", hab ich nicht groß getestet), hier korrigiert (getestet und läuft korrekt bei mir!):
Sub a()
Dim WbQ As Workbook
Dim WbZ As Workbook
Dim WsQ As Worksheet
Dim WsZ As Worksheet
Dim aTabs
Dim IstDa As Boolean
Dim i&
Application.ScreenUpdating = False
'Ausgangsmappe = DIESE Mappe (in der DIESES Makro liegt)
Set WbQ = ThisWorkbook
'Blattname, wo die zu behaltenden Blattnamen aufgeführt sind - anpassen
Set WsQ = WbQ.Worksheets("Tabelle1")
'Die Zielmappe, in der die Blätter gelöscht werden sollen öffnen - anpassen
Set WbZ = Workbooks.Open(Filename:="C:\Pfad\Datei.xlsx")
'Die zu behaltenden Blattnamen aus der Quellblatt direkt in ein Array einlesen
With WsQ
aTabs = Application.Transpose(.Range("A1:A" & _
.Cells(.Rows.Count, 1).End(xlUp).Row))
End With
'Die Zielmappe durchgehen
With WbZ
'Fehlermeldung beim Löschen der Blätter unterdrücken
Application.DisplayAlerts = False
'Bei jedem Blatt prüfen, ob der Name im Array vorkommt
For Each WsZ In .Worksheets
For i = LBound(aTabs) To UBound(aTabs)
If WsZ.Name = aTabs(i) Then IstDa = True
Next i
'Kommt der Name im Array nicht vor, wird das Blatt gelöscht
If Not IstDa Then WsZ.Delete
IstDa = False
Next WsZ
End With
Application.DisplayAlerts = True
Application.ScreenUpdating = True
Set WbQ = Nothing
Set WbZ = Nothing
Set WsQ = Nothing
Set WsZ = Nothing
Erase aTabs
End Sub
Ob der auch bei Dir genauso läuft kann ich nicht sagen, da ich die Bezeichnungen, die Du ins Array einliest, nicht kenne, weil Du sie uns auch noch nicht mitgeteilt hast - beim Vergleich der Blattnamen mit dem Array musst Du also ggf. meinen Code noch anpassen/ändern.
For Each WsZ In .Worksheets
For i = LBound(aTabs) To UBound(aTabs)
'ggf. anpassen ála:
'If WsZ.Name = "_0" & aTabs(i) Then IstDa = True oder so ähnlich...
If WsZ.Name = aTabs(i) Then IstDa = True
Next i
'Kommt der Name im Array nicht vor, wird das Blatt gelöscht
If Not IstDa Then WsZ.Delete
IstDa = False
Next WsZ
Der andere Code, der mit Redim arbeitet, ist nicht von mir; da musst Du Basti fragen...
LG
Michael
Anzeige
AW: Arrays?
26.07.2016 08:58:50
Pelic
Danke für die Antwort. Konnte mir aus euren beiden Codes das passende für mich basteln. Ich weiß ich hätte genauere Angaben machen können oder meinen Code reinstellen. Aber das wollte ich doch keinem zumuten sich durch 300 Zeilen wirren Code zu schlagen ^^.
Im Endeffekt habt ihr mir sehr weiterhelfen können.
Vielen lieben Dank.
Na super, dann noch viel Erfolg! LG und owT
26.07.2016 10:07:00
Michael

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige