Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.04.2024 14:18:05
28.04.2024 13:43:14
Anzeige
Archiv - Navigation
1896to1900
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
Inhaltsverzeichnis

VBA - Excel ergänzt Formel selbstständig

VBA - Excel ergänzt Formel selbstständig
19.09.2022 08:05:14
MARTHoss_R
Hallo zusammen,
ich habe eine Tabelle, in dieser sind leider vertikal verbundene Zellen enthalten.
Unterhalb dieser Zellen füge ich per VBA eine Auswertung ein, die sowohl auf die verbundenen wie auch die geteilten Zellen reagieren muss.
Um die verbundenen Zellen zu ermitteln, habe ich eine Funktion (ZELLE_IM_VERBUND), die mir ein Wahr zurückgibt, wenn die erste Zelle Bestandteil eines Zellverbundes ist, integriert.
Somit kann ich dann mit der Formel im Arbeitsblatt den Rückgabewert dieser Funktion benutzen.
So weit so gut, Handeingabe der Formel funktioniert:

=WENN(ZELLE_IM_VERBUND(O$7)=WAHR;22;ANZAHL2(O$7:O$28)-SUMME(ZÄHLENWENN(O$7:O$28; "2S"); ZÄHLENWENN(O$7:O$28; "ZV");ZÄHLENWENN(O$7:O$28; "MA"))) 
aber mittels VBA eingefügt setzt Excel das @ davor und die Formel funktioniert nicht mehr.

=WENN(@ZELLE_IM_VERBUND(O$7)=WAHR;22;ANZAHL2(O$7:O$28)-SUMME(ZÄHLENWENN(O$7:O$28; "2S"); ZÄHLENWENN(O$7:O$28; "ZV");ZÄHLENWENN(O$7:O$28; "MA"))) 
Ich hatte so etwas in der Vergangenheit ja bereits auch, aber da war der Matrixbezug das Problem, hier ist's ja wirklich nur eine Zelle.
Formula2Local läuft auf einen Fehler.
Info: Die Zeilen sind absolut, weil ich die Formel mittels Autofill auf knapp 3000 benachbarte Zellen verteile.
Hat jemand noch nen Tipp für mich?
Danke schonmal im Voraus.

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

Betreff
Datum
Anwender
Anzeige
AW: VBA - Excel ergänzt Formel selbstständig
19.09.2022 08:43:19
ChrisL
Hi
Ich glaube nicht, dass das @ die Ursache des Problems ist. Zeig mal den Code.
cu
Chris
AW: VBA - Excel ergänzt Formel selbstständig
19.09.2022 12:46:28
MARTHoss_R
Den gesamtes Code hier einzustellen wird schwierig, da muss ich einiges bereinigen.
Aber das Unterprogramm für die Auswertung, kann ich schon hier einstellen.
Geht sicher auch kürzer, aber ich muss immer im Hinterkopf haben, dass mein Vertreter nichts mit VBA am Hut hat und ich die Makros so aufsetzen muss, dass er im Notfall nachvollziehen kann, was getan werden soll.

Sub Auswertung_Teams(ByVal ws_act As Worksheet, i_lstrow As Integer, i_lstcol As Integer)
'Variablen dimensionieren
Dim arr_teamrng() As String
Dim str_pth_bd As String
Dim str_teamrng As String
Dim str_formula As String
Dim i_lstrow_bd As Integer
Dim i_col As Integer
Dim i_cnt As Integer
Dim i_row As Integer
Dim i_anzteammitgl As Integer
'Überschriften einfügen und formatieren
'Schriftgröße
ws_act.Cells(i_lstrow + 6, 7).Font.Size = 8
ws_act.Cells(i_lstrow + 6, 8).Font.Size = 8
ws_act.Cells(i_lstrow + 6, 9).Font.Size = 8
'Schrift kursiv
ws_act.Cells(i_lstrow + 6, 7).Font.Italic = True
ws_act.Cells(i_lstrow + 6, 8).Font.Italic = True
ws_act.Cells(i_lstrow + 6, 9).Font.Italic = True
'Schrift fett
ws_act.Cells(i_lstrow + 6, 7).Font.Bold = True
ws_act.Cells(i_lstrow + 6, 8).Font.Bold = True
ws_act.Cells(i_lstrow + 6, 9).Font.Bold = True
'Textausrichtung in der Zelle
ws_act.Cells(i_lstrow + 6, 7).HorizontalAlignment = xlRight
ws_act.Cells(i_lstrow + 6, 8).HorizontalAlignment = xlLeft
ws_act.Cells(i_lstrow + 6, 9).HorizontalAlignment = xlLeft
'Bezeichnung einfügen
ws_act.Cells(i_lstrow + 6, 7).Value = "Team"
ws_act.Cells(i_lstrow + 6, 8).Value = "Kb"
ws_act.Cells(i_lstrow + 6, 9).Value = "MA"
'Formeln einfügen
'in Spalte N (14) Formel eintragen
i_col = 14
'Variablen aus Blatt: "Basisdaten" befüllen
str_pth_bd = ThisWorkbook.Sheets("Basisdaten").Name & "!"
i_lstrow_bd = ThisWorkbook.Sheets("Basisdaten").Cells(Rows.Count, 15).End(xlUp).Row
'alle Teams in "Basisdaten" durchlaufen
For i_cnt = 3 To i_lstrow_bd
'Zellverbund setzen
ws_act.Range(ws_act.Cells(i_lstrow + i_cnt + 4, 5), ws_act.Cells(i_lstrow + i_cnt + 4, 7)).Merge
'Schriftgröße
ws_act.Range(ws_act.Cells(i_lstrow + i_cnt + 4, 5), ws_act.Cells(i_lstrow + i_cnt + 4, 9)).Font.Size = 8
'Schrift kursiv
ws_act.Range(ws_act.Cells(i_lstrow + i_cnt + 4, 5), ws_act.Cells(i_lstrow + i_cnt + 4, 9)).Font.Italic = True
'Textausrichtung in der Zelle
ws_act.Range(ws_act.Cells(i_lstrow + i_cnt + 4, 5), ws_act.Cells(i_lstrow + i_cnt + 4, 9)).HorizontalAlignment = xlRight
'Einsatzbereich verknüpfen
ws_act.Cells(i_lstrow + i_cnt + 4, 5).Formula = "=" & str_pth_bd & "P" & i_cnt
'Einsatzbereichkürzel verknüpfen
ws_act.Cells(i_lstrow + i_cnt + 4, 8).Formula = "=" & str_pth_bd & "O" & i_cnt
str_teamrng = Empty
'alle Zeilen durchlaufen
For i_row = 7 To i_lstrow
'wenn in Spalte E (Teams-Eintragung) der Einsatzbereich enthalten ist
If InStr(1, ws_act.Cells(i_row, 5).Value, ws_act.Cells(i_lstrow + i_cnt + 4, 8).Value, vbTextCompare) > 0 Then
'wenn Bereich noch leer
If str_teamrng = Empty Then
'Zelle in Bereichsstring übernehmen
str_teamrng = ws_act.Cells(i_row, i_col).Address(True, False)
Else
'Zelle zu Bereichsstring hinzufügen
str_teamrng = str_teamrng & "|" & ws_act.Cells(i_row, i_col).Address(True, False)
End If
End If
Next i_row
'wenn Bereich nicht leer ist
If Not str_teamrng = Empty Then
'Mitarbeiteranzahl je Team verknüpfen
ws_act.Cells(i_lstrow + i_cnt + 4, 9).Formula2 = "=COUNTA(" & Replace(Replace(str_teamrng, "|", ","), f05_Spaltenbuchstabe.Buchstabe(i_col), "$C") & ")"
'Anzahl abwesende Mitarbeiter (Anzahl Einträge in Mitarbeiterzeilen abzüglich 2.Schicht, zeitversetztes / mobiles Arbeiten)
arr_teamrng() = Split(str_teamrng, "|", -1, 1)
'wenn mehr als eine Zelle im String vorhanden ist
If UBound(arr_teamrng(), 1) > 0 Then
'Formelstring leeren
str_formula = Empty
'Array durchlaufen
For i_anzteammitgl = LBound(arr_teamrng(), 1) To UBound(arr_teamrng(), 1)
'wenn erster Wert
If str_formula = Empty Then
'Formelstring erstbefüllen
str_formula = "COUNTIF(" & arr_teamrng(i_anzteammitgl) & ", ""2S""),COUNTIF(" & arr_teamrng(i_anzteammitgl) & ", ""ZV""),COUNTIF(" & arr_teamrng(i_anzteammitgl) & ", ""MA"")"
Else
'Formelstring erweitern
str_formula = str_formula & "," & "COUNTIF(" & arr_teamrng(i_anzteammitgl) & ", ""2S""),COUNTIF(" & arr_teamrng(i_anzteammitgl) & ", ""ZV""),COUNTIF(" & arr_teamrng(i_anzteammitgl) & ", ""MA"")"
End If
Next i_anzteammitgl
'Formelstring vervollständigen
str_formula = "=IF(ZELLE_IM_VERBUND(N$7)=TRUE," & _
"COUNTA(" & Replace(Replace(str_teamrng, "|", ","), f05_Spaltenbuchstabe.Buchstabe(i_col), "$C") & ")," & _
"COUNTA(" & Replace(str_teamrng, "|", ",") & ")-SUM(" & str_formula & "))"
'Formel in Zelle übernehmen
ws_act.Cells(i_lstrow + i_cnt + 4, i_col).Formula = str_formula
'wenn nur eine Zelle im String enthalten ist
Else
'Formel in Zelle übernehmen
ws_act.Cells(i_lstrow + i_cnt + 4, i_col).Formula2 = "=IF(ZELLE_IM_VERBUND(N7)=TRUE," & _
"COUNTA(" & Replace(Replace(arr_teamrng(0), "|", ","), f05_Spaltenbuchstabe.Buchstabe(i_col), "$C") & ")," & _
"COUNTA(" & Replace(arr_teamrng(0), "|", ",") & ")" & _
"-SUM(COUNTIF(" & Replace(arr_teamrng(0), "|", ",") & ", ""2S"")," & _
"COUNTIF(" & Replace(arr_teamrng(0), "|", ",") & ", ""ZV"")," & _
"COUNTIF(" & Replace(arr_teamrng(0), "|", ",") & ", ""MA"")))"
End If
'wenn keine Zelle zum Team gehört
Else
'Null Eintragen
ws_act.Cells(i_lstrow + i_cnt + 4, 9).Value = 0
ws_act.Cells(i_lstrow + i_cnt + 4, i_col).Value = 0
End If
'Bereich leeren
str_teamrng = Empty
'Formeln in benachbarte Zellen übernehmen
ws_act.Range(ws_act.Cells(i_lstrow + 7, i_col), ws_act.Cells(i_lstrow + i_cnt + 3, i_col)).AutoFill _
Destination:=ws_act.Range(ws_act.Cells(i_lstrow + 7, i_col), ws_act.Cells(i_lstrow + i_cnt + 3, i_lstcol)), Type:=xlFillDefault
'Auswertungszeilen gruppieren
ws_act.Rows(i_lstrow + 7 & ":" & i_lstrow + i_cnt + 3).Group
'Variablen leeren
Erase arr_teamrng()
str_pth_bd = Empty
str_teamrng = Empty
str_formula = Empty
i_col = Empty
i_cnt = Empty
i_row = Empty
i_anzteammitgl = Empty
End Sub

Anzeige
AW: VBA - Excel ergänzt Formel selbstständig
19.09.2022 13:14:42
ChrisL
Hi
Ich habe mal folgendes Testmakro laufen lassen, welches problemlos funktioniert.

Sub t()
Dim arr_teamrng(0)
arr_teamrng(0) = "B1:B3"
Range("A1").Formula2 = "=IF(ZELLE_IM_VERBUND(N7)=TRUE," & _
"COUNTA(" & Replace(Replace(arr_teamrng(0), "|", ","), "$A", "$C") & ")," & _
"COUNTA(" & Replace(arr_teamrng(0), "|", ",") & ")" & _
"-SUM(COUNTIF(" & Replace(arr_teamrng(0), "|", ",") & ",""2S"")," & _
"COUNTIF(" & Replace(arr_teamrng(0), "|", ",") & ",""ZV"")," & _
"COUNTIF(" & Replace(arr_teamrng(0), "|", ",") & ",""MA"")))"
End Sub

Function ZELLE_IM_VERBUND(rng As Range) As Boolean
ZELLE_IM_VERBUND = True
End Function
Ich gehe deshalb davon aus, dass meine Variablen (arr_teamrng und Buchstabe) einen anderen Inhalt haben.
Unklar ist mir z.B.
Replace(arr_teamrng(0), "|", ",")
Zuvor hast du bereits mit "|" gesplittet, also dürfte das Zeichen eigentlich gar nicht mehr vorkommen. Und wenn es doch vorkommen würde, dann ergäbe sich mit dem neuen Komma ein 3. Kriterium für ZÄHLENWENN, was nicht passen würde.
cu
Chris
Anzeige

242 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige