Excel SUM
Moderator: Moderatoren
- Koverhage
- Der Entwickler von "Deep Thought"
- Beiträge: 2471
- Registriert: Fr, 23. Dez 2005 8:00
- Wohnort: Aalen
- Hat sich bedankt: 103 Mal
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Excel SUM
Habe folgendes aufgezeichnet.
Sub Makro1()
'
' Makro1 Makro
' Makro am 23.04.2014 von OK aufgezeichnet
'
'
Range("B26").Select
ActiveCell.FormulaR1C1 = "=SUM(R[-24]C:R[-1]C)"
End Sub
Auch die Ausführungen zu SUM in der Wissensbasis gelesen, stehe aber irgendwie auf dem Schlauch.
Ich habe eine Tabelle mit 5 Spalten (A-E) in der ersten Zeile die Überschrift in den Zeilen 2-x die Daten (numerisch).
Ich möchte feststellen, ob eine Spalte nur 0 Werte enthält und diese dann löschen.
Wie kann ich die eine Summe der Spalten erzeugen, ohne diese in einer zelle zu speichern, sondern ganz normal in eine Variable ?
Sub Makro1()
'
' Makro1 Makro
' Makro am 23.04.2014 von OK aufgezeichnet
'
'
Range("B26").Select
ActiveCell.FormulaR1C1 = "=SUM(R[-24]C:R[-1]C)"
End Sub
Auch die Ausführungen zu SUM in der Wissensbasis gelesen, stehe aber irgendwie auf dem Schlauch.
Ich habe eine Tabelle mit 5 Spalten (A-E) in der ersten Zeile die Überschrift in den Zeilen 2-x die Daten (numerisch).
Ich möchte feststellen, ob eine Spalte nur 0 Werte enthält und diese dann löschen.
Wie kann ich die eine Summe der Spalten erzeugen, ohne diese in einer zelle zu speichern, sondern ganz normal in eine Variable ?
Gruß
Klaus
Klaus
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2829
- Registriert: Fr, 08. Feb 2008 21:29
- Hat sich bedankt: 97 Mal
- Danksagung erhalten: 13 Mal
Re: Excel SUM
Hallo, Klaus -
lange vergessen, immer noch wahr: Excel ist ein 1-2-3 Klon und musste daher die 1-2-3 Notation beherrschen. Daher auch die kryptischen (internen) Formeln.
Wenn man Dein Beispiel ausführt, steht in der Zelle B26 diese Formel:
=Summe(B2:B25)
das entspricht diesem Ausdruck im Makro:
=SUM(R[-24]C:R[-1]C)
Wir befinden uns in Zelle B26. Dann ist R[-24] ein "Zurückgehen" von B26 um 24 Zeilen => aus B26 wird B2. R[-1] entspricht einem "Zurückgehen" von B26 um 1 Zeile => B25. Und das entspricht dann der Adressierung von =Summe(B2:B25).
Um an die Summe der Felder einer Spalte zu kommen, könntest Du eine beliebige, in einer anderen Spalte liegende Zelle mit dieser Formel beschicken:
Range("B1").Select
ActiveCell.FormulaR1C1 = "=SUM(C[1])"
Range("C1").Select
In diesem Fall habe ich in B1 die Summe der Spalte C gespeichert. Wenn der Wert von B1 = 0 ist, enthält die Spalte C keinen Wert.
Oder: Du ermittelst die Grösse der Daten (siehe den Artikel in der Wissensbasis) und liest dann über eine Range die Werte der Spalte ein und erhältst ein Array in dieser Form:
{{0}, {17}, NIL}
Das arbeitest Du in einem Loop ab, prüfst auf NIL, und wenn der erste Wert ungleich 0 gefunden wirst, brichst Du ab.
Hinweis: wenn A2 = 2 und A3 = -2 sind, dann ist die Summe der beiden Zeilen 0, obwohl Daten vorhanden sind.
Deine Definiton "0 Werte" ist leider nicht eindeutig: meinst Du, dass alle Zellen nur 0 enthalten, oder die Summe der Zellen 0 ist? Wenn es darum geht, dass eine Spalte nur dann gelöscht wird, wenn alle Zellen leer (= NIL) sind oder 0 enthalten, dann solltest Du eher über den Loop als über =summe() nachdenken.
Hilft Dir das?
lange vergessen, immer noch wahr: Excel ist ein 1-2-3 Klon und musste daher die 1-2-3 Notation beherrschen. Daher auch die kryptischen (internen) Formeln.
Wenn man Dein Beispiel ausführt, steht in der Zelle B26 diese Formel:
=Summe(B2:B25)
das entspricht diesem Ausdruck im Makro:
=SUM(R[-24]C:R[-1]C)
Wir befinden uns in Zelle B26. Dann ist R[-24] ein "Zurückgehen" von B26 um 24 Zeilen => aus B26 wird B2. R[-1] entspricht einem "Zurückgehen" von B26 um 1 Zeile => B25. Und das entspricht dann der Adressierung von =Summe(B2:B25).
Um an die Summe der Felder einer Spalte zu kommen, könntest Du eine beliebige, in einer anderen Spalte liegende Zelle mit dieser Formel beschicken:
Range("B1").Select
ActiveCell.FormulaR1C1 = "=SUM(C[1])"
Range("C1").Select
In diesem Fall habe ich in B1 die Summe der Spalte C gespeichert. Wenn der Wert von B1 = 0 ist, enthält die Spalte C keinen Wert.
Oder: Du ermittelst die Grösse der Daten (siehe den Artikel in der Wissensbasis) und liest dann über eine Range die Werte der Spalte ein und erhältst ein Array in dieser Form:
{{0}, {17}, NIL}
Das arbeitest Du in einem Loop ab, prüfst auf NIL, und wenn der erste Wert ungleich 0 gefunden wirst, brichst Du ab.
Hinweis: wenn A2 = 2 und A3 = -2 sind, dann ist die Summe der beiden Zeilen 0, obwohl Daten vorhanden sind.
Deine Definiton "0 Werte" ist leider nicht eindeutig: meinst Du, dass alle Zellen nur 0 enthalten, oder die Summe der Zellen 0 ist? Wenn es darum geht, dass eine Spalte nur dann gelöscht wird, wenn alle Zellen leer (= NIL) sind oder 0 enthalten, dann solltest Du eher über den Loop als über =summe() nachdenken.
Hilft Dir das?
Liebe Grüsse aus der Eifel,
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
- Koverhage
- Der Entwickler von "Deep Thought"
- Beiträge: 2471
- Registriert: Fr, 23. Dez 2005 8:00
- Wohnort: Aalen
- Hat sich bedankt: 103 Mal
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: Excel SUM
Hallo Georg,
{
{001, 80.00, 123.456, 789.012, 0}, {002, 96.00, 345.678, 901.234, 0}
}
In diesem Fall enthalten die Zellen in Spalte 5 (E) 0, d.h. die Spalte soll komplett entfernt werden.
Excel erschien mir das als einfachster Weg. Da ich das Array in Xbase generiere, könnte ich das ja
auch in Xbase erledigen, erscheint mir aber momentan aufwendiger.
Zum Teil ja. Es ist wie folgt: Ich übergebe ein Array in der Form vonHilft Dir das?
{
{001, 80.00, 123.456, 789.012, 0}, {002, 96.00, 345.678, 901.234, 0}
}
In diesem Fall enthalten die Zellen in Spalte 5 (E) 0, d.h. die Spalte soll komplett entfernt werden.
Excel erschien mir das als einfachster Weg. Da ich das Array in Xbase generiere, könnte ich das ja
auch in Xbase erledigen, erscheint mir aber momentan aufwendiger.
Gruß
Klaus
Klaus
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9388
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 362 Mal
- Kontaktdaten:
Re: Excel SUM
Mmh. Ich halte das tatsächlich für deutlich weniger aufwendig, wenn man es in Xbase++ macht, entweder bei der Übergabe (eine Funktion zur Ermittlung von Spaltensummen auf einem zweidimensionalen Array ist mit aEval() ein Dreizeiler) oder vorher.
Herzlich,
Tom
Tom
- Koverhage
- Der Entwickler von "Deep Thought"
- Beiträge: 2471
- Registriert: Fr, 23. Dez 2005 8:00
- Wohnort: Aalen
- Hat sich bedankt: 103 Mal
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: Excel SUM
Hallo Tom,
ich habe mir gedacht, ich mache das so:
Wie kann ich das mit aEval machen ?
ich habe mir gedacht, ich mache das so:
Code: Alles auswählen
for i:= 1 to nMaxLength // Länge des Aarays
IF aArray[i,5] # 0
lhatWert := .t.
exit
ENDIF
next
IF !lhatWert
for i:= 1 to nMaxLength
aRemove(aArray[i],5)
next
ENDIF
Gruß
Klaus
Klaus
- Martin Altmann
- Foren-Administrator
- Beiträge: 16549
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 114 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: Excel SUM
Du könntest mit aEval die Anzahl der Zellen zählen, die in einer Spalte einen Wert ungleich 0 enthalten. Ist die Anzahl gleich 0, kannst Du die Spalte löschen.
Viele Grüße,
Martin
Viele Grüße,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
- brandelh
- Foren-Moderator
- Beiträge: 15701
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 69 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Excel SUM
Alles was man an Formeln und Zwischenwerten NICHT IM XLS braucht, soll man vorher im Programm berechnen.
Das ist viel einfacher !
Ansonsten kannst du natürlich auch in einer Schleife durch die Zellen gehen und die Ergebnisse auswerten.
Wenn es zu langsam ist, sieh dir mal meine Klasse zur XLS DLL an
Das ist viel einfacher !
Ansonsten kannst du natürlich auch in einer Schleife durch die Zellen gehen und die Ergebnisse auswerten.
Wenn es zu langsam ist, sieh dir mal meine Klasse zur XLS DLL an
Gruß
Hubert
Hubert
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9388
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 362 Mal
- Kontaktdaten:
Re: Excel SUM
Ich würde nicht die Spalte aus dem Array löschen, sondern einfach bei der Übergabe überspringen, feddisch.
Herzlich,
Tom
Tom