Rechnen mit ActiveCell.Offset(X, X).Value
#1
Hallo zusammen,

habe ein kleines Problem, bei dem mir das Wissen fehlt, wie ich es lösen kann. Folgender Sachverhalt:

Meine Excel Datei wird automatisch von einem System erstellt. Innerhalb dieser Datei, gibt es ein Blatt, dass immer den selben Namen besitzt.
In diesem Blatt gibt es vier Bereiche, deren Überschrift immer die selbe ist. Unter dieser Überschrift, stehen immer die selben Positionen, deren Werte aber Monat für Monat abweichen.

Also habe ich 1) alle Positionen, die in diesem Blatt existieren, als Integer definiert und 2) per Suchfunktion die entsprechende Überschrift gesucht und markiert. Das sah wie folgt aus:

str_Suche = "Abzüge"
For Zähler1 = 1 To ActiveSheet.Cells.SpecialCells(xlLastCell).Column
    
    For Zähler2 = 1 To ActiveSheet.Cells.SpecialCells(xlLastCell).Row
        If Cells(Zähler2, Zähler1).Value = str_Suche Then
          Cells(Zähler2, Zähler1).Select
        End If
  Next
Next

ActiveCell.Offset(0, 0).Select

Abzug1= ActiveCell.Offset(1, 1).Value
Abzug2= ActiveCell.Offset(2, 1).Value
Abzug3= ActiveCell.Offset(3, 1).Value
AbzugM= ActiveCell.Offset(4, 1).Value
Summe2 = ActiveCell.Offset(1, 1).Value + ActiveCell.Offset(2, 1).Value + ActiveCell.Offset(3, 1).Value + ActiveCell.Offset(4, 1).Value
ActiveCell.Offset(5, 1).Value = Summe2

Das funktionierte auch hervorragend. Auch die Ergebnisse stimmten. Aber eine Möglichkeit ist dadurch nicht abgedeckt:

Problem: Es kommt in manchnen Monaten vor, dass einer dieser Abzüge nicht auftritt. Das System lässt in diesem Fall den Wert der Position leer (die Position wird aber noch aufgelistet). Wenn das Feld (Wert der Position) aber leer ist, funktioniert das komplette Makro nicht mehr, weil der Integer mit einem leeren Feld nicht arbeiten kann "typen unverträglich"
Meine Idee war nun, dass man eine IF Funktion einbaut:

Beispiel: "if ActiveCell.Offset(1, 1).Value <> "" then ActiveCell.Offset(1, 1).Value = 0
und anschließend erst dem Integer den Wert zuweist ( Abzug = ActiveCell.Offset(1, 1).Value )
Ich habe nur keine Ahnung, ob das eine elegante Lösung wäre und ob das überhaupt funktioniert?

Für bessere Ideen wäre ich sehr dankbar! :)

Ein Beispiel der Datei habe ich angehängt


Angehängte Dateien
.xlsx   Beispiel.xlsx (Größe: 21,71 KB / Downloads: 4)
Top
#2
Hallo,

wieso "suchst" Du in deinem Sheet, wenn doch die Bereiche konstant sind? Nutze also Konstanten mit fixen Zellbereichen. Diese kannst Du einfach mittels Worksheetfunction.sum() aufsummieren, die Funktion schert sich auch nicht um leere Zellen.
[-] Folgende(r) 1 Nutzer sagt Danke an Jonas0806 für diesen Beitrag:
  • Dragoner
Top
#3
Danke für den Ansatz.
Also suchen tue ich, weil mir keine andere Funktion bekannt war mit der ich das Problem angehen kann. Und weil ich damit in der Vergangenheit immer Erfolg hatte.
Und mit "fixen" Zellen konnte ich nicht arbeiten, weil das System ab und zu 0-3 leerzeilen setzt. Sprich die werte schwanken immer um bis zu drei Zeilen. Wobei die Leerzeilen aber immer nur zwischen den Überschriften zu finden sind.

Ich kann nachvollziehen was Du meinst. Aber ich habe so etwas noch nie umgesetzt. Wie würde sowas aussehen. Also Konstanten nutzen mit fixen Zellbereichen?
Die Funktion Worksheetfunction.sum habe ich auch noch nie genutzt. Muss ich mal recherchieren... :)
Top
#4
Hallo,

wie gesagt, die Leerzellen sind für .sum egal. Ein Code, könnte schemenhaft so aussehen:

Code:
Option Explicit

Const fallpauschalen = "$B$7:$B$8"

Sub summieren()
   Debug.Print WorksheetFunction.Sum(Range(fallpauschalen))
End Sub
[-] Folgende(r) 1 Nutzer sagt Danke an Jonas0806 für diesen Beitrag:
  • Dragoner
Top
#5
Prinzipiell eine echte Interessante Funktion.

Das heißt, ich könnte die vier Summen, die ich benötigen, jeweils als einzelne Const definieren und anschließend über den Befehl aufsummieren?

Auf jeden Fall sehr hilfreich. Weil Summe 1 und 2 nur mit + arbeiten.

Nur bei Summe 3 muss ich dann einen Umweg gehen, weil die sich so ergibt:
ActiveCell.Offset(0, 0).Select
Neuerpreis= ActiveCell.Offset(1, 1).Value
Alterpreis= ActiveCell.Offset(2, 1).Value
Differenz = ActiveCell.Offset(1, 1).Value - ActiveCell.Offset(2, 1).Value
ActiveCell.Offset(3, 1).Value = Differenz
Summe3 = Differenz * Summe2

Ich versuche es mal. Danke ;)
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste