VBA: Schleife über alle Zeilen abhängig von mehreren Kriterien

17/10/2007 - 16:11 von Felida | Report spam
Hallo NG,

Folgendes Problem:
Ich habe 3 Tabellenblàtter, die je eine Produktgruppe beinhalten und die
folgendermaßen aufgebaut sind:

TabelleA:
Bestellnummer Produktgruppe Anzahl
1 A
2 A

TabelleB:
Bestellnummer Produktgruppe Anzahl
11 B
12 B

TabelleC:
Bestellnummer Produktgruppe Anzahl
21 C
22 C

Ich habe zusàtzlich 3 Pivottabellen, die jeweils ein Jahr repràsentieren.
Folgender Code ermittelt mir für die 3./4./5. Spalte (jeweils in einem
Jahr) wie oft die Bestellnummer in einer Pivottabelle vorkommt am Beispiel
Tabelle A:

Sub CycleThroughA()

Dim WSCol As Worksheet
Dim genutztRange As Range
Dim lngRows As Long
Dim x As Integer
Dim rgeBereich As Range
Dim dblSumme As Double

Set WSCol = Worksheets("Tabelle A")
Set genutztRange = WSCol.usedRange
lngRows = genutztRange.Rows.Count

For x = 2 To lngRows
'3.Spalte
Worksheets("Tabelle A").Cells(x, 3).FormulaR1C1 =
"=IF(ISERROR(GETPIVOTDATA(),"""",GETPIVOTDATA()))"
'4.Spalte
Worksheets("Tabelle A").Cells(x, 4).FormulaR1C1 =
"=IF(ISERROR(GETPIVOTDATA(),"""",GETPIVOTDATA()))"
'5.Spalte
Worksheets("Tabelle A").Cells(x, 5).FormulaR1C1 =
"=IF(ISERROR(GETPIVOTDATA(),"""",GETPIVOTDATA()))"
Next x
End Sub

Anschließend greife ich in einer weiteren Tabelle jeweils für ein Jahr (z.B.
3.Spalte)die Summe ab:
ActiveCell.Formular1C1 = "=SUM('Tabelle A'!C3,'Tabelle B'!C3,'Tabelle C'!C3)"

Nun möchte ich allerdings der Schnelligkeit wegen und weil noch einige Jahre
dazukommen werden und ich die Tabelle nicht unnötig zuladen möchte, dass er
mir nicht zuerst für jede Zeile die Anzahl berechnet und reinschreibt und
dann die Summe abgreift, sondern dass ich in einem die Summe pro Jahr
ermitteln kann ohne die Anzahl zuvor in die Spalte zu schreiben.

Ich bràuchte nur Hilfe für die eine Tabelle, der Rest ist ja dann analog.

Vielen Dank für jeden Tip im Voraus!

Gruß,
Felida
 

Lesen sie die antworten

#1 stefan onken
17/10/2007 - 18:42 | Warnen spam
hallo Felida,
schneller sollte es zunàchst mal werden, wenn du statt For Next nur
jeweils in die erste Zeile der Spalten die Formel schreibst und dann
nach unten ausfüllst (in VBA: AutoFill)

With Worksheets("Tabelle A")
lastrow = .Cells(Rows.Count, 1).End(xlUp).Row
.Cells(2, 3).FormulaR1C1 = "=IF(etc)"
.Cells(2, 3).AutoFill _
Destination:=.Range(.Cells(2, 3), .Cells(lastrow, 3))
End With

evtl auch noch die Berechnung auf Manuell stellen und anschließend
wieder zurücksetzen.

Man kann Daten aus der PT aber auch in eine VBA-Variable einlesen und
damit dann weiterrechnen: http://www.xtremevbtalk.com/archive...89397.html
Vermutlich musst du pt.GetPivotData() des Bsp in einer Schleife
abfragen und kannst die Daten dann gleich addieren, etwa so

for i=2 to lastrow
summe = summe + pt.GetPivotData()
next


Tabellenfunktionen wie SUM (oder ISERROR) sind in VBA berechenbar als
WorksheetFunction.Sum. Evtl kannst du andere Tabellenfunktionen (wie
SUMMENPRODUKT oà, viele Bsp unter http://www.excelformeln.de/formeln.html)
nutzen, um deine Daten zu berechnen.

Gruß
stefan


On 17 Okt., 16:11, Felida wrote:
Hallo NG,

Folgendes Problem:
Ich habe 3 Tabellenblàtter, die je eine Produktgruppe beinhalten und die
folgendermaßen aufgebaut sind:

TabelleA:
Bestellnummer Produktgruppe Anzahl
1 A
2 A

TabelleB:
Bestellnummer Produktgruppe Anzahl
11 B
12 B

TabelleC:
Bestellnummer Produktgruppe Anzahl
21 C
22 C

Ich habe zusàtzlich 3 Pivottabellen, die jeweils ein Jahr repràsentieren.
Folgender Code ermittelt mir für die 3./4./5. Spalte (jeweils in einem
Jahr) wie oft die Bestellnummer in einer Pivottabelle vorkommt am Beispiel
Tabelle A:

Sub CycleThroughA()

Dim WSCol As Worksheet
Dim genutztRange As Range
Dim lngRows As Long
Dim x As Integer
Dim rgeBereich As Range
Dim dblSumme As Double

Set WSCol = Worksheets("Tabelle A")
Set genutztRange = WSCol.usedRange
lngRows = genutztRange.Rows.Count

For x = 2 To lngRows
'3.Spalte
Worksheets("Tabelle A").Cells(x, 3).FormulaR1C1 > "=IF(ISERROR(GETPIVOTDATA(),"""",GETPIVOTDATA()))"
'4.Spalte
Worksheets("Tabelle A").Cells(x, 4).FormulaR1C1 > "=IF(ISERROR(GETPIVOTDATA(),"""",GETPIVOTDATA()))"
'5.Spalte
Worksheets("Tabelle A").Cells(x, 5).FormulaR1C1 > "=IF(ISERROR(GETPIVOTDATA(),"""",GETPIVOTDATA()))"
Next x
End Sub

Anschließend greife ich in einer weiteren Tabelle jeweils für ein Jahr (z.B.
3.Spalte)die Summe ab:
ActiveCell.Formular1C1 = "=SUM('Tabelle A'!C3,'Tabelle B'!C3,'Tabelle C'!C3)"

Nun möchte ich allerdings der Schnelligkeit wegen und weil noch einige Jahre
dazukommen werden und ich die Tabelle nicht unnötig zuladen möchte, dass er
mir nicht zuerst für jede Zeile die Anzahl berechnet und reinschreibt und
dann die Summe abgreift, sondern dass ich in einem die Summe pro Jahr
ermitteln kann ohne die Anzahl zuvor in die Spalte zu schreiben.

Ich bràuchte nur Hilfe für die eine Tabelle, der Rest ist ja dann analog.

Vielen Dank für jeden Tip im Voraus!

Gruß,
Felida

Ähnliche fragen