Live-Forum - Die aktuellen Beiträge
Datum
Titel
19.04.2024 12:23:24
19.04.2024 11:45:34
Anzeige
Archiv - Navigation
956to960
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
956to960
956to960
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Globaler Array II

Globaler Array II
29.02.2008 16:11:09
Fred
Hallo,
ich bin absoluter Neuling was VBA angeht und habe ein grundlegendes Verständnisproblem mit Arrays:
Ich möchte, dass folgende Arrays in jedem Modul, d.h. für alle Makros vorhanden sind?
'#######################################################################################
' HIER WIRD FESTGELEGT, WO SICH ZU KOPIERENDE TABELLEN BEFINDEN
ReDim drucksheets(1 To 6, 1 To 1)
ReDim druchrange(1 To 6, 1 To 1)
drucksheets = Array("GuV", "GuV", "Bilanz", "Bilanz", "KFR", "KFR") '
druckrange = Array("B10:M45", "B49:M76", "B10:M72", "B47:M60", "B10:M54", "B47:M60")
'#######################################################################################
Wie geht das? Ich habe folgendes probiert:
Public drucksheets as Variant. Das scheint aber nicht zu funktionieren. Zumindest funktioniert folgender Code in einem anderen Modul nicht:
For i = 1 To anzdb
X = zeilenindex(i, 1)
Sheets(drucksheets(X - 1)).Range(druckrange(X - 1)).Copy
Next i
Was mache ich falsch?
Vielen Dank für eure Hilfe!!!
Gruß
Fred

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Globaler Array II
29.02.2008 16:41:51
Peter
Hallo Fred,
globale Varianten müssen immer in einem allgemeinen Modul außerhalb der Subs/Functions deklariert werden.
Also:
Modul1
Public drucksheets as variant

Sub XYZ()
ReDim drucksheets(1 To 6, 1 To 1)
ReDim druchrange(1 To 6, 1 To 1)
drucksheets = Array("GuV", "GuV", "Bilanz", "Bilanz", "KFR", "KFR") '
druckrange = Array("B10:M45", "B49:M76", "B10:M72", "B47:M60", "B10:M54", "B47:M60")
End Sub


Gruß Peter

AW: Globaler Array II
29.02.2008 18:41:49
Fred
Hallo Peter,
vielen Dank für Deine Antwort. Okay, das habe ich gemacht. Dann scheint das Problem doch ein anderes zu sein.
Ich habe die Arrays "drucksheets" und "druckrange" in einem anderen Modul als public deklariert. Wenn ich jetzt in einem anderen Makro den Code:
For i = 1 To anzdb
X = zeilenindex(i, 1)
Sheets(drucksheets(X - 1)).Range(druckrange(X - 1)).Copy
Next i
durchlaufen lasse, bekomme ich bei der Zeile Sheets(drucksheets(X-1)).etc einen Fehler. An der Variable X kann es aber eigentlich nicht liegen (=3 in meinem Beispiel), oder? Ich bekomme den Fehler "Type mismatch"? Weiß jmd. was ich falsch mache?
Vielen Dank für eure Hilfe
Gruß
Fred

Anzeige
AW: Globaler Array II
29.02.2008 20:35:03
Nepumuk
Hallo Fred,
1. Wenn du eine Variantvariable mit der Array-Funktion füllst, kannst du dir das Redim sparen.
2. Schreib mal als erste Zeile in jedes Modul "Option Explicit". Dann findest du Schreibfehler im Variablennamen schneller.
3. Mit kleinen Fragmenten von Code kann niemand sagen, was falsch läuft.
Gruß
Nepumuk

AW: Globaler Array II
29.02.2008 21:49:10
Fred
Hi Nepumuk,
vielen Dank für Deine Antwort. Also, der komplette Code, in dem der Fehler auftritt ist wiefolgt:
Option Explicit

Public Sub copytoppt()
Dim anzdb As Integer
Dim counter As Integer
Dim i As Integer
Dim X As Integer
Dim ppt As Object
Dim oPPT As PowerPoint.Application
Dim oPrs As PowerPoint.Presentation
Dim oSld As PowerPoint.Slide
Dim sPath As String
Dim otxt As Shape
Application.Calculate
sPath = ActiveWorkbook.Path & "\xl2ppt.ppt" ' Speicherpfad
' Erstelle PPT-Datei
Set oPPT = CreateObject("PowerPoint.Application")
Set oPrs = oPPT.Presentations.Add(msoCTrue)
' Kopiere Daten
anzdb = Application.CountA(zeilenindex)
'Debug.Print zeilenindex(1)
counter = 0
For i = 1 To anzdb
Set oSld = oPrs.Slides.Add(oPrs.Slides.Count + 1, ppLayoutTitleOnly)
X = zeilenindex(i, 1) - 1
Sheets(drucksheets(X, 1)).Range(druckrange(X, 1)).Copy
Set otxt = oSld.Shapes.PasteSpecial(ppPasteEnhancedMetafile)
With otxt
.Left = 300
.Top = 100
.Width = 2000
.Height = 1000
End With
Next i
End Sub


Der Fehler tritt auf bei Sheets(drucksheets(X, 1)).Range(druckrange(X, 1)).Copy.
Der Code in dem die Arrays drucksheets und druckrange erstellt werden lautet:
Option Explicit


Public Sub copytablesforprint()
Dim i As Integer
Dim druckrange, drucksheets
Dim anzdb As Integer
Dim letztezeile As Integer
Dim sPrinter As String
Dim counter As Integer
Application.ScreenUpdating = False
'Berichte_drucken.Visible = False
' HIER WIRD FESTGELEGT, WO SICH ZU KOPIERENDE TABELLEN BEFINDEN
ReDim drucksheets(1 To 6, 1 To 1)
ReDim druckrange(1 To 6, 1 To 1)
drucksheets = Array("GuV", "GuV", "Bilanz", "Bilanz", "KFR", "KFR") '
druckrange = Array("B10:M45", "B49:M76", "B10:M72", "B47:M60", "B10:M55", "B47:M60")
'Sheets("DELTACOCKPIT").Select
'Cells(1, 1).Value = druckrange(1)
anzdb = Application.CountA(druckrange) ' Anzahl der verschiedenen Druckbereiche
' Erstelle temporäres Sheet [Sheets("tempdrucken")]
Application.DisplayAlerts = False
On Error Resume Next
Sheets("tempdrucken").Delete
On Error GoTo 0
Worksheets.Add
ActiveSheet.Name = "tempdrucken"
Application.DisplayAlerts = True
' Kopiere gewünschten Tabellen in temporäres Sheet
letztezeile = 0 ' Initialisierung der Variablen
Sheets("tempdrucken").Activate
counter = 0
ReDim zeilenindex(1 To anzdb, 1 To 1)
For i = 1 To anzdb
If Berichte_drucken.Controls("Checkbox" & i).Value = True Then
'Sheets(drucksheets(i - 1)).Visible = xlsheetsvisible
'Sheets(drucksheets(i - 1)).Range(druckrange(i - 1)).Select
'Selection.SpecialCells(xlCellTypeVisible).Select
'Selection.Copy
Sheets(drucksheets(i - 1)).Range(druckrange(i - 1)).Copy
With ActiveSheet.Cells(letztezeile + 2, 2)
.PasteSpecial Paste:=xlValues
.PasteSpecial Paste:=xlFormats
End With
Application.CutCopyMode = False
If i 


Definiert werden die beiden Arrays als Public in einem anderen Modul. Wäre super, wenn Du mir helfen könntest.
Gruß
Fred

Anzeige
AW: Globaler Array II
29.02.2008 22:16:22
Nepumuk
Hallo Fred,
was passiert, wenn du in der Menüleiste - Debuggen - Kompilieren von VBA-Projekt klickst?
Wenn du in der Prozedur "copytoppt" keine Fehlermeldung bekommst, dann hast du die Variablen druckrange und drucksheets zwar richtig als öffentliche Variable deklariert, aber da du sie in der Prozedur "copytablesforprint" nochmals anlegegst, sind die öffentlichen natürlich leer. Denn nach der Vorrangregel werden die auf Prozedurebene deklarieren Variablen den öffentlichen vorgezogen.
Insgesamt ist dein Code aber wenig durchdacht. Denn du legst zwar aufgrund des Objektverweises ein PowerPoint.Application - Objekt an, aber wozu dann das ganze dann nochmal per CreateObject anlegen? Du kannst doch ganz einfach per New - Statement eine neue Instanz der Klasse erstellen.
So:
Public Sub test()
    Dim MS_PowerPoint As PowerPoint.Application
    Set MS_PowerPoint = New PowerPoint.Application
    MS_PowerPoint.Visible = True
End Sub

Ok, ich seh gerade "VBA-bescheiden" du bist also noch am lernen. Na dann wünsche ich dir viel Erfolg.
Gruß
Nepumuk

Anzeige
AW: Globaler Array II
29.02.2008 22:23:00
Fred
Hallo Nepumuk,
super, vielen Dank für Deine Antwort. Ich will die beiden Arrays druckrange und drucksheets ja auch eigentlich nur einmal anlegen, d.h. nicht in der copytablesforprint nochmals erzeugen. Wie "fülle" ich diese aber so, dass sie in jeder Prozedure "gefüllt" sind? Ich habe in einem Modul "Allgemeines" folgendes gemacht:
Public drucksheets as variant
Public druckrange as variant
Hier kann ich diese dann aber nicht mit druckrange = array("A1:M87" etc.) "füllen". Wie bzw. wo mache ich das, so dass ich den Array dann in allen Prozeduren (z.B. copytoppt) nutzen kann?
Zu Deinem zweiten Punkt: der Code ist sicherlich noch überhaupt nicht ausgereift - hab mir den aus vielen Web-Schnipseln zusammen gebastelt. Wie Du aber an meinem vorherigen Punkt merken wirst, bin ich absoluter Neuling und hangel mich gerade parallel noch durch die Basics.
Vielen Dank für Deine Hilfe.
Gruß
Fred

Anzeige
AW: Globaler Array II
01.03.2008 00:28:00
Nepumuk
Hallo Fred,
na dann füll sie im Open-Ereignis der Mappe.
Gruß
Nepumuk

AW: Globaler Array II
01.03.2008 11:50:32
Fred
Hallo Nepumuk,
vielen Dank für Deine vielen Antworten. Allerdings scheine ich irgendwie total auf dem Schlauch zu stehen. Ich habe jetzt folgendes gemacht:
1.) Beide Arrays mit "Public druckrange as variant"/"Public drucksheets as variant" im Modul "Allgemeines" deklariert
2.) In "Diese Arbeitsmappe" habe ich folgendes geschrieben:

Public Sub Workbook_Open()
' Fülle Arrays für Druck und PPT Einstellungen
' HIER WIRD FESTGELEGT, WO SICH ZU KOPIERENDE TABELLEN BEFINDEN
'ReDim drucksheets(1 To 6, 1 To 1)
'ReDim druckrange(1 To 6, 1 To 1)
drucksheets = Array("GuV", "GuV", "Bilanz", "Bilanz", "KFR", "KFR") '
druckrange = Array("B10:M45", "B49:M76", "B10:M72", "B47:M60", "B10:M55", "B47:M60")
End Sub


Ich bekomme dann aber immer noch in z.B. folgender Prozedur einen Fehler bei
"Sheets(drucksheets(i - 1)).Range(druckrange(i - 1)).Copy"


Public Sub copytablesforprint()
Dim i As Integer
Dim anzdb As Integer
Dim letztezeile As Integer
Dim sPrinter As String
Dim counter As Integer
Application.ScreenUpdating = False
'Berichte_drucken.Visible = False
' HIER WIRD FESTGELEGT, WO SICH ZU KOPIERENDE TABELLEN BEFINDEN
'ReDim drucksheets(1 To 6, 1 To 1)
'ReDim druckrange(1 To 6, 1 To 1)
'drucksheets = Array("GuV", "GuV", "Bilanz", "Bilanz", "KFR", "KFR") '
'druckrange = Array("B10:M45", "B49:M76", "B10:M72", "B47:M60", "B10:M55", "B47:M60")
'Sheets("DELTACOCKPIT").Select
'Cells(1, 1).Value = druckrange(1)
anzdb = Application.CountA(druckrange) ' Anzahl der verschiedenen Druckbereiche
' Erstelle temporäres Sheet [Sheets("tempdrucken")]
Application.DisplayAlerts = False
On Error Resume Next
Sheets("tempdrucken").Delete
On Error GoTo 0
Worksheets.Add
ActiveSheet.Name = "tempdrucken"
Application.DisplayAlerts = True
' Kopiere gewünschten Tabellen in temporäres Sheet
letztezeile = 0 ' Initialisierung der Variablen
Sheets("tempdrucken").Activate
counter = 0
ReDim zeilenindex(1 To anzdb, 1 To 1)
For i = 1 To anzdb
If Berichte_drucken.Controls("Checkbox" & i).Value = True Then
'Sheets(drucksheets(i - 1)).Visible = xlsheetsvisible
'Sheets(drucksheets(i - 1)).Range(druckrange(i - 1)).Select
'Selection.SpecialCells(xlCellTypeVisible).Select
'Selection.Copy
Sheets(drucksheets(i - 1)).Range(druckrange(i - 1)).Copy
With ActiveSheet.Cells(letztezeile + 2, 2)
.PasteSpecial Paste:=xlValues
.PasteSpecial Paste:=xlFormats
End With
Application.CutCopyMode = False
If i 


Was mache ich denn falsch? Ich wäre Dir wirklich dankbar, falls Du mir ein weiteres Mal helfen könntest!
Viele Grüße
Fred

Anzeige
AW: Globaler Array II
01.03.2008 12:05:00
Nepumuk
Hallo Fred,
kannst du mal die Mappe hochladen? Die enthaltenen Daten kannst du alle löschen, mich interessiert nur der Code.
Gruß
Nepumuk

AW: Globaler Array II
01.03.2008 13:13:29
Fred
Hi Nepumuk,
hier ist mein sich auf das Problem beschränkendes Excelfile.
https://www.herber.de/bbs/user/50328.xls
Vielen Dank für Deine große Hilfsbereitschaft.
Gruß
Fred

AW: Globaler Array II
01.03.2008 14:28:00
Nepumuk
Hallo Fred,
dein Code funktioniert. Ich habe mit den Variablen keine Probleme. Wenn du natürlich vor dem drucken in Code etwas änderst, dann verlieren die Variablen ihren Wert. Aber das ist ganz normal.
Gruß
Nepumuk

Anzeige
AW: Globaler Array II
01.03.2008 15:18:42
Fred
Hallo Nepumuk,
vielen, vielen Dank für Deine Hilfe. Dann weiß ich jetzt zumindest, dass ich das Konzept von Arrays grudsätzlich verstanden habe. Ich werde dann mal schauen, wo ich den Array wieder überschreibe. Vielen Dank für Deine Hilfe. Das ist sicherlich nicht selbstverständlich!
Gruß
Fred

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige