Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1420to1424
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
Gefilterte Werte übertragen
16.04.2015 18:00:06
Jonas
Hallo Leute,
bin ganz neu hier im Forum und kenne mich auch noch nicht besonders gut mit Excel bzw Vba aus.
Mein Problem ist, dass ich aus einer Excel-Tabelle Daten filtere, die ich dann per VBA in eine Power-Point Folie überspiele. Allerdings muss bei der Übertragung jede Zeile einzeln 'hart' eingegeben werden. Gibt es da eine Möglichkeit iwie nur z.B die ersten 8 Zeilen zu übertragen und nicht jedes mal einzugegebn um welche Zeile es sich konkret nach der Filterung handelt.
Hier mal als Bsp.:
1.Der Filter

Sub Makro3()
ActiveSheet.Range("$A$1:$J$868").AutoFilter Field:=2, Criteria1:=Array("1A" _
, "1B", "1C", "1D", "1F", "2A", "2B", "2C", "2D", "2E", "2F", "3", "4"), Operator:= _
xlFilterValues
ActiveSheet.Range("$A$1:$J$868").AutoFilter Field:=6, Criteria1:=Array( _
"Active", "Proposed", "Resolved"), Operator:=xlFilterValues
ActiveSheet.Range("$A$1:$J$868").AutoFilter Field:=2, Criteria1:=Array("1A" _
, "2A", "2B", "2C", "2D", "2E", "2F", "3"), Operator:=xlFilterValues
ActiveWindow.SmallScroll Down:=-108
End Sub

2.Die Übertragung in PPT

Sub PPTausExcelBefuellen()
Dim powerpoint_datei As Object
Dim ppt_slides As Variant
Set powerpoint_datei = _
CreateObject(class:="Powerpoint.Application")
powerpoint_datei.presentations.Open Filename:="Interim Status Template bearbeitet.pptx"
ppt_slides = 1
Dim TextTFS1 As String
Dim TextTFS2 As String
Dim TextTFS3 As String
Dim TextTFS4 As String
TextTFS1 = Replace(Cells(318, 1).Text, Chr(10), Chr(13))
TextTFS2 = Replace(Cells(324, 1).Text, Chr(10), Chr(13))
TextTFS3 = Replace(Cells(479, 1).Text, Chr(10), Chr(13))
TextTFS4 = Replace(Cells(491, 1).Text, Chr(10), Chr(13))
With powerpoint_datei.ActivePresentation.Slides(ppt_slides)
.Shapes("TFS1").TextFrame.TextRange.Text = TextTFS1
.Shapes("TFS2").TextFrame.TextRange.Text = TextTFS2
.Shapes("TFS3").TextFrame.TextRange.Text = TextTFS3
.Shapes("TFS4").TextFrame.TextRange.Text = TextTFS4
End With
End Sub

Vielen Dank für eure Hilfe!

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
im Prinzip
17.04.2015 19:19:51
Michael
Hallo Jonas,
mangels PP usw. mal ein prinzipieller Ansatz:
Kopieren der gefilterten Werte, hier im Beispiel nur 2-spaltig, aber wenn ich die PPT-sub richtig verstehe, benötigst Du eh nur *eine* Spalte:

Option Explicit
Sub FilterKopieren()
With ActiveSheet
.Range(.Cells(2, 1), .Cells(Rows.Count, 2).End(xlUp)).Copy _
Destination:=.Range("E16")
End With
End Sub

X kopiert *nur* die sichtbaren Werte.
Die hast Du dann hier im Beispiel ab E/F 16 stehen und greifst Dir die Werte von da aus ab:

Sub KopieExportieren()
Dim zeile, spalte, nr As Long
' **** getrennt aufrufen oder Kommentar entfernen ****
'        FilterKopieren
' **** getrennt aufrufen oder Kommentar entfernen ****
zeile = 16
spalte = 6
nr = 1
With powerpoint_datei.ActivePresentation.Slides(ppt_slides)
While Cells(zeile, spalte)  ""
.Shapes("TFS" & nr).TextFrame.TextRange.Text = _
Replace(Cells(zeile, spalte).Text, Chr(10), Chr(13))
zeile = zeile + 1
nr = nr + 1
Wend
End With
End Sub
Ich habe die Spalten und Zeilen extra als Variable gemacht, damit Du das nach Gusto ändern kannst, ohne groß rumzupfriemeln.
Der Knackpunkt ist, daß die Nummerierung der .Shapes("...") eben auch mit einer Zählvariable erfolgen kann, deren Wert von Excel durch das "&" automatisch in Ziffern ("Text" statt Zahlenwert) umgewandelt wird.
Probier doch mal, Deinen Code so umzusetzen.
Testdatei anbei: https://www.herber.de/bbs/user/97142.xls
Schöne Grüße,
Michael

Anzeige
AW: im Prinzip
20.04.2015 17:16:00
Jonas
Hallo Michael erstmal vielen Dank für deine Hilfe :)
Ich habe nun einiges verändert und es funktioniert eigentlich alles ganz gut nur das deine Annahme, dass ich nur eine Spalte brauche war nicht ganz richtig sondern ich brauche mehrere. Die zweite Sache ist das ich nachdem die Daten gefiltert sind ich nicht alle Werte in die PPT übertragen möchte sondern nur die ersten 8. Sieht dann derzeit wie folgt aus :

Sub PPTausExcelBefuellen2()
Dim powerpoint_datei As Object
Dim ppt_slides As Variant
Dim Spalte As Variant
Dim Zeile, Nummer As Long
Set powerpoint_datei = _
CreateObject(class:="Powerpoint.Application")
powerpoint_datei.presentations.Open Filename:="Interim Status Template bearbeitet.pptx"
ppt_slides = 1
Spalte = 1
Zeile = 2000
Nummer = 1
With powerpoint_datei.ActivePresentation.Slides(ppt_slides)
While Cells(Zeile, Spalte)  ""
.Shapes("TFS" & Nummer).TextFrame.TextRange.Text = _
Replace(Cells(Zeile, Spalte).Text, Chr(10), Chr(13))
Zeile = Zeile + 1
Nummer = Nummer + 1
Wend
While Cells(Zeile, Spalte)  ""
.Shapes("Prio" & Nummer).TextFrame.TextRange.Text = _
Replace(Cells(Zeile, Spalte + 1).Text, Chr(10), Chr(13))
Zeile = Zeile + 1
Nummer = Nummer + 1
Wend
While Cells(Zeile, Spalte)  ""
.Shapes("TFS Task" & Nummer).TextFrame.TextRange.Text = _
Replace(Cells(Zeile, Spalte + 2).Text, Chr(10), Chr(13))
Zeile = Zeile + 1
Nummer = Nummer + 1
Wend
End With
End Sub

Das Problem ist dass, die Programmierung nun so aufgebaut ist das das Programm nach dem "Shape TFS9 beispielsweise sucht, dieses aber allerdings nicht existiert weil man Wunsch ja ist nur die ersten 8 aus jeder Spalte zu übernehmen. Entweder kann man das ja nun irgendwie in den Filter einfügen oder eine Wenn-Funktion formuliert, dass der nach 8 Zeilen in die nächste Spalte springt.Allerdings scheitert es da an meinen Fähikeiten.
Vielen Dank

Anzeige
wieder nur Prinzip
20.04.2015 17:38:36
Michael
Hallo Jonas,
man kann im Kopf der Schleife mehrere Bedingungen verknüpfen. Der Übersichtlichkeit halber würde ich für diesen Zweck eine weitere Variable "ok" einführen, die Du nach Bedarf "bestücken" kannst.
Also: den Kopf erweitern:

' ..... wie gehabt
Dim Zeile as Long, Nummer As Long
' habe gestern gelernt, daß man bei jeder Variablen den Typ *einzeln* dimensionieren muß
Dim ok as boolean
' ..... wie gehabt
' dann vor *jedem* while:
ok=true
' und das while entsprechend ändern:
While Cells(Zeile, Spalte)  "" and ok
' ..... wie gehabt, dann *vor* dem Wend eine Zeile für das ok, z.B.:
If nr>8 Then ok=false
' > statt >=, weil in der Zeile vorher nr=nr+1 steht

Damit wird die Schleife beendet, sobald die nr 8 erledigt wurde.
Ein grundsätzlich anderer Ansatz wäre, alle shapes mit foreach zu durchlaufen und die jeweiligen Werte dazu zusammenzusuchen, dann kann es Dir nicht passieren, daß Du auf ein nicht vorhandenes shape zugreifst. Oder man programmiert eine Fehlerbehandlung (recherchier mal "on Error")
Schöne Grüße,
Michael

Anzeige
AW: wieder nur Prinzip
23.04.2015 12:36:02
Jonas
Vielen Dank für deine Hilfe.
Funktioniert mittlerweile so wie ich es mit vorgestellt habe.

299 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige