Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1508to1512
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

Formelbezug Leer, Formel löschen

Formelbezug Leer, Formel löschen
29.08.2016 10:46:50
Blue
Servus,
ich bräuchte ein Makro was mir, wenn der Bezug einer Formel Leer ist, die Formel löscht.
Hintergrund ist, habe ein Makro was mir aus Tabelle2 alle doppelten Einträge löscht und eins was mir die Daten von Tabelle2 in einer neuen Reihenfolge in Tabelle1 kopiert.
Nun möchte ich immer die Spalte über einen Zelle in Spalte C Fett setzen.
Das Makro für das Fett setzen habe ich bereits, allerdings stehen halt leider noch die Formeln in den "Leeren" Zellen.
Hat da jemand was für mich?
mfg Blue Bird

22
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Nachfrage...
29.08.2016 11:03:26
Michael
Hallo!
wenn der Bezug einer Formel Leer ist, die Formel löscht
Heißt das eine Formel soll gelöscht werden, wenn Ihr Rückgabewert LEER ("") ist? Oder meinst Du wirklich, dass ALLE in der jeweiligen Formel vorkommenden Bezüge (das können viele sein) auf Inhalte geprüft werden sollen, und sofern da keine Werte vorhanden sind, die Formel gelöscht wird?
= RIESENUNTERSCHIED
LG
Michael
AW: Nachfrage...
29.08.2016 11:11:58
Blue
Servus Michael,
danke für den Hinweis, natürlich nur wenn alle Bezüge von der Formel leer sind.
mfg Blue Bird
Nochmals Nachfrage...
29.08.2016 12:20:07
Michael
Hallo!
Da hast Du Dir ja was vorgenommen. Nur zur Sicherheit: Sind die überprüften Formeln immer gleich? Wenn ja, zeig bitte Bsp. dieser Formeln. Wenn nein, und es geht darum jegliche Formel zu überprüfen, die da evtl. eingetragen werden, dann vergiss es gleich.
LG
Michael
Anzeige
...denn das könnte eine nahezu endlose Kette ...
29.08.2016 13:00:04
Luc:-?
…von .Precedents wdn, Sialia. ;-)
Für einfache Fälle könnte das Stichwort reichen…
Gruß, Luc :-?
Besser informiert mit …
AW: Nochmals Nachfrage...
29.08.2016 13:11:34
Blue
Servus Michael,
=Tabelle2!$C$11 & ZEICHEN(10) & Tabelle2!$G$11 & ZEICHEN(10) & Tabelle2!$D$11 & ZEICHEN(10) & Tabelle2!$E$11 & " " & Tabelle2!$F$11
Im Prinzip ist es immer diese Formel, "nur" die Bezüge sind natürlich immer anders.
mfg Blue Bird
Anzeige
da musst du doch nur ....
29.08.2016 13:18:46
Rudi
...auf Länge()=4 prüfen.
Gruß
Rudi
AW: Nochmals Nachfrage...Michael
30.08.2016 08:17:58
Blue
Servus Michael,
hättest du schon eine Lösung für mich?
mfg Blue Bird
Hast Du die anderen Antworten schon gelesen?
30.08.2016 11:27:28
Michael
Hallo Blue Bird!
Ich war nicht der einzige Helfer hier im Faden... Luc und Rudi haben Dir beide schon Ansatzpunkte gegeben; hast Du was davon ausprobiert? Insofern bin ich bisher nicht wieder eingestiegen.
Zu Lucs Ansatzpunkt mit .Precedents: Das könnte zB darauf raus laufen, dass die Vorgängerzellen der überprüften Zelle auf Inhalte überprüft werden, schematisch so:
Sub a()
Dim dieFormelZelle As Range
Dim dieVorgaengerZellen As Range
Dim eineZelle As Range
Set dieFormelZelle = Selection
If dieFormelZelle.HasFormula Then
With dieFormelZelle
Set dieVorgaengerZellen = .Precedents
If WorksheetFunction.CountA(dieVorgaengerZellen) 
Das funktioniert so aber nur, wenn sich die überprüfte Zelle (in der die Formel steht) auf dem selben Blatt befindet, wie die Vorgängerzellen. Liegt die überprüfte Zelle in Blatt1 und bezieht sich auf Blatt2 muss ein Workaround geschaffen werden; da ich soetwas bisher noch nicht gebraucht habe, müsstest Du recherchieren - die Jungs bei Stackoverflow haben da einen ähnlich gelagerten Workaround, auf dem Du evtl. aufbauen könntest: http://stackoverflow.com/questions/10897958/programmatically-select-other-sheet-precedents-or-dependents-in-excel
D.h. Ockhams Rasierklinge zufolge ist Rudis pragmatische Herangehensweise wiedermal goldrichtig: Bezogen auf die von Dir eingestellte Bsp-Formel hat deren Ergebnis genau die Länge "4", wenn in den sonstigen Bezugszellen keine Werte vorkommen. D.h. Du kannst die Zelle löschen, wenn sie eine Formel enthält und die Länge ihres Wertes = 4 ist, schematisch:
Sub b()
Dim dieFormelZelle As Range
Set dieFormelZelle = Selection
If dieFormelZelle.HasFormula Then
If Len(dieFormelZelle.Value) = 4 Then
dieFormelZelle.ClearContents
End If
End If
End Sub
Lg
Michael
Anzeige
AW: Hast Du die anderen Antworten schon gelesen?
31.08.2016 07:49:04
Blue
Servus Michael,
erst einmal sorry, das sollte nicht drängend rüber kommen.
Ich kam nur mit den Beiträgen von Rudi und Luc nicht nicht zurecht, da meine VBA Kenntnisse nur sehr bescheiden sind.
Trotzdem vielen dank für deine Lösungsvorschläge, mit dem Makro Sub b funktioniert das auch teilweise sehr gut.
Nur habe ich das Problem das er es nur für die Zelle ausführt die vorher markiert habe.
Könntest du mir bitte sagen ich es auf die komplette Spalte C ausführen lassen kann.
Dann wäre ich wunschlos Glücklich mit dem Makro.
mfg Blue Bird
Bitteschön...
31.08.2016 09:28:29
Michael
Hallo Blue Bird,
...mit Kommentaren:
Sub c()
'Geht in der aktuellen Mappe, im aktiven Blatt, Spalte C
'von C1 bis zur letzten gefüllten Zelle in C durch, und
'löscht den jeweiligen Zellwert, wenn in der Zelle eine Formel
'enthalten ist deren Rückgabewert eine Länge von 4 Zeichen aufweist
Dim Wb As Workbook
Dim Ws As Worksheet
Dim Bereich As Range
Dim Zelle As Range
Set Wb = ThisWorkbook 'Diese Mappe (wo das Makro liegt)
Set Ws = Wb.ActiveSheet 'auf dem gerade aktiven Blatt
With Ws
'C1:Cx (x = letzte gefüllte Zelle)
Set Bereich = .Range(.Cells(1, 3), .Cells(.Rows.Count, 3).End(xlUp))
For Each Zelle In Bereich
'Wenn die Zelle eine Formel enthält...
If Zelle.HasFormula Then
'Wenn die Länge des Zellwertes gleich 4 Zeichen ist
If Len(Zelle.Value) = 4 Then
'Zelle leeren
Zelle.ClearContents
End If
End If
Next Zelle
End With
End Sub
Passt?
LG
Michael
Anzeige
Dankeschön !!!
31.08.2016 13:05:00
Blue
Servus Michael,
recht herzlichen dank für deine Bemühungen und detaillierten Makros, so das man es auch als nicht VBA Profi gut nachvollziehen kann.
mfg Blue Bird
Gerne! Danke für die nette Rückmeldung, owT
31.08.2016 13:43:53
Michael
Bitte um andere Variante
01.09.2016 14:18:57
Blue
Servus Michael,
es fällt einem doch immer wieder was auf, bzw kommt auf Optimierungsideen.
Könntest du mir vlt. noch sagen wie das Makro aussehen müsste wenn wenn aus einer Formel nur der Teil der den leeren Bezug hat entfernt werden soll?
Beispiel:
Userbild
Auch für diesen Fall wäre es immer die gleiche Formel, allerdings könnte der betroffene Bezug an 1., 2., 3., oder auch 4. Stelle liegen und es könnte auch mehrere Bezüge treffen.
mfg Blue Bird
Anzeige
Nein!
01.09.2016 14:50:41
Michael
Hallo BlueBird!
Das ist nun schon der Fall (und ich habe es erwartet!), den Luc und ich angesprochen haben: Für solche Aktionen muss alles was in einer Formel vorkommt zunächst zerpflückt werden, und dann geprüft werden ob es sich um einen Bereich handelt; erst dann *könnte* der jeweilige Bereich auf Inhalte geprüft werden.
So eine Aktion ist aber schon theoretisch extrem aufwändig, und praktisch nicht durchführbar, v.a. wenn es sich um jegliche Formeln handelt. Stell Dir vor: es gibt Formel die haben zig Verschachtelungen, absolute, relative und evtl. sogar gemischte Bezüge - das wird nix.
Und auch, wenn es sich hier um immer die gleiche Formel handelt - die in einer Formel vorhandenen Bezüge per VBA zu ersetzen, wenn die Bezugsziele leer sind - das ist eine fragwürdige Optimierungsidee. Sowas macht man nicht; denn wenn Bezüge einfach routinemäßig gelöscht werden sollen, warum werden die irgendwann überhaupt in die Formel aufgenommen?!
D.h. die Optimierungsideen müssen von Dir an anderer Stelle ansetzen - wie ist die Mappe aufgebaut, die Datenstruktur, was wird wann, wo und wie verarbeitet und ausgegeben... Im Nachhinein per VBA eine Formel verpfuschen ist keine Optimierung. Es gibt evtl. Situationen, in denen man Formel per VBA anpassen möchte, aber dieser Grund (ein Bezugs-Ziel ist leer) ist mE keiner davon.
LG
Michael
Anzeige
AW: Nein!
01.09.2016 15:28:12
Blue
Servus Michael,
alles klar dann weiß ich erstmal bescheid.
Mein Problem ist das an dem Makro welches mir die Formel erzeugt ich nicht weiß was daran anpassen müsste um das Ergebnis zu erreichen.
Zur Erklärung, das Makro nimmt aus Tabelle2 Einträge und fügt mir diese in einer neuen Sortierung in Tabelle1 ein.
Anschließend lass ich über ein anderes Makro doppelte Einträge (bis auf die erste) in Tabelle2 löschen.
Und somit habe ich dann in Tabelle1 natürlich leere Zeielenteile.
Hier mal meine Datei, vlt hättest du ja eine Lösung.
https://www.herber.de/bbs/user/107950.xlsm
mfg Blue Bird
Anzeige
Bin heute schon weg, schaue ich mir morgen a owT
01.09.2016 16:20:05
Michael
Siehe meine AW weiter unten... owT
02.09.2016 08:33:35
Michael
AW: Formellösung und Makrolösung
01.09.2016 15:44:12
Daniel
Hi
warum muss der Zellbezug auf die leere Zelle raus?
der schadet hier ja eigentlich nicht, mal abgesehen von den leeren Zwischenzeilen im Zelltext.
um die leeren Zwischenzeilen zu vermeiden, gibts mehrere Varianten.
eine Lösung wäre, diese erst gar nicht auftretehn zu lassen und den Zellwert nur zu übernehmen, wenn die Zelle gefüllt ist:
statt: =Tabelle2!C11&Zeichen(10)&Tabelle2!G11&Zeichen(10)
dann: =Wenn(Tabelle2!C11="";"";Tabelle2!C11&Zeichen(10))&Wenn(Tabelle2!G11="";"";G11&Zeichen(10))
eine andere Methode die überzähligen Zeilenumbrüche nachträglich zu entfernen wäre GLÄTTEN.
hierzu muss man aber die erste die Zeilenumbrüche durch Leerzeichen ersetzen und dann wieder zurück:
hier für den Fall, dass die Zelltexte selbst keine Leerzeichen enthalten, dann gehts relativ einfach:
deine Orignalformel steht in A1. Statt dem "&Zeichen(10)& musst du &" "& einsetzen.
dann in B1 diese Formel:
=Wechseln(Glätten(A1);" ";Zeichen(10))
Sollten die Texte selbst Leerzeichen enthalten, müsste man diese vorher aber durch ein anderes Zeichen ersetzten, da sonst die auch für die Leerzeichen Zeilenumbrüche eingefügt werden und das sollte nicht sein: Deine Originalformel steht in A1, diesmal mit dem Zeichen(10) als Zwischenzeichen:
=Wechseln(Wechseln(Glätten(Wechseln(Wechseln(A1;" ";"_");Zeichen(10);" "));" ";Zeichen(10));"_";"0")
wie gesagt, wenn du auf die Zusätzliche Zelle verzichten willst, musst du anstelle von A1 deine Originalformel einsetzen (je nach Variante mit " " oder Zeichen(10) als Zwischenzeichen).
wenn das alles nichts ist, hier der Code um deine Formel zu überarbeiten.
dieser Einfache Code funktioniert aber nur für den Fall, dass deine Formel nach genau dem gezeigeten Schema aufgebaut ist und immer nur Einzelzellen mit Zeilenumbrüchen verkettet werden.
Sub FormelnÜberarbeiten()
Dim Zelle As Range
Dim FO As String
Dim FOTeile() As String
Dim i As Long
For Each Zelle In Columns(1).SpecialCells(xlCellTypeFormulas)
'--- Formel beim & in Bestandteile zerlegen
FOTeile = Split(Mid(Zelle.FormulaLocal, 2), "&")
'--- Formelbestandteile durchgehen und Prüfen auf leeren Zellbezug
For i = 0 To UBound(FOTeile)
If FOTeile(i) Like "*!*" Then
If Range(FOTeile(i)).Value = "" Then FOTeile(i) = ""
End If
Next
'--- Formel wieder zusammensetzen
FO = Join(FOTeile, "&")
'--- aufeindander folgende Zeilenumbrüche und & entfernen
Do While InStr(FO, "&&") > 0
FO = Replace(FO, "&&", "&")
Loop
Do While InStr(FO, "&ZEICHEN(10)&ZEICHEN(10)&") > 0
FO = Replace(FO, "&ZEICHEN(10)&ZEICHEN(10)&", "&ZEICHEN(10)&")
Loop
'---Formel wieder in Zelle schreiben
Zelle.FormulaLocal = "=" & FO
Next
End Sub
gruß Daniel
Anzeige
AW: Formellösung und Makrolösung
02.09.2016 07:54:06
Blue
Servus Daniel,
danke für deine umfangreichen Lösungsvorschläg!
Natürlich würde ich vorzugsweise gerne mein Makro so umschreiben damit es so funktioniert wie du beschrieben hast.
Nur leider bekomme ich das irgendwie nicht hin. (bin leider noch nicht so fit in der Sache).
Daher dachte ich mir ich versuche dein Makro "FormelnÜberarbeiten" mal aus, aber leider sagt er da, das er keine Zelle gefunden hat.
Wenn ich wünsche äußern könnte\dürfte, würde ich mir wünschen das du mein Makro mir mal anpassen könntest.
Somit würde ich mir ein zusätzliches Makro (dein Überarbeitungsmakro) in der Datei sparen.
Wenn dir das allerdings zuviel Aufwand ist, würde ich natürlich auch gerne dein makro nehmen nur bräuchte ich mal noch nen Tip was ich da eventuell Falsch gemacht habe.
mfg Blue Bird
Anzeige
AW: Formellösung und Makrolösung
02.09.2016 08:33:11
Michael
Hallo Bluebird!
Daniels Makro geht die Zellen in der ersten Spalte (!) des aktiven Tabellenblattes durch:
For Each Zelle In Columns(1).SpecialCells(xlCellTypeFormulas)
D.h. wenn bei Dir hier keine Formeln gefunden werden, musst Du in einer anderen Spalte suchen - ich meine, dass Du Deine Formeln in Spalte C stehen hast. Das ist die 3. Spalte, daher musst Du so anpassen:
For Each Zelle In Columns(3).SpecialCells(xlCellTypeFormulas)
Probier das mal aus, evtl. reicht Dir das ja... dann brauchst Du ja von mir keine gesonderte Lösung.
LG
Michael
AW: Formellösung und Makrolösung
02.09.2016 08:40:34
Blue
Servus Michael,
das habe ich bereits schon versucht gehabt und da kommt folgende Fehlermeldung:
"Laufzeitfehler ´1004´: Die Methode ´Range´ für das Objekt´_Global´ ist fehlgeschlagen"
mfg Blue Bird
Hab heute viel zu tun, melde mich am Mo!
02.09.2016 14:48:35
Michael

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige