Nicht gesperrte Zellen leeren per Makro

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Manu1981
**
Beiträge: 26
Registriert: Mi, 15.04.2015 09:47
Kontaktdaten:

Nicht gesperrte Zellen leeren per Makro

Beitrag von Manu1981 »

Guten Morgen,

ich habe ein Angebots-/Rechnungs-/Tool mit Cals gemacht, welches automatisch die eingegebenen Formulardaten der Webseite übernimmt und dann ein Angebot und/oder eine Rechnung als PDF ausspuckt und die Umsätze dann entsprechend verbucht. In diversen Feldern kann ich jedoch auch händisch eingreifen und die Daten, welche über die Webseite kamen, "überschreiben" (wenn istleer), wenn z.B. Kunde anruft und es muss eine Änderung her, die Liefer- oder Rechnungsadresse muss geändert werden oder die Produktkonfiguration des Kunden ergibt keinen Sinn. Habe für viele Fälle solche Felder eingebaut.
Alles cool soweit und es funktioniert auch (fast) wunderbar. Aktuell leere ich zwar diese Zellen auch mit einem Makro, aber das ist nur eine Behelfslösung, denn dieses Makro nimmt jede Zelle einzeln und leert diese. Bis vor ein paar Tagen war das Formular jedoch noch nicht so umfangreich und es ging so recht flott. Jetzt (bei ca. 60 zu leerenden Zellen) dauert dieser Vorgang unglaublich lange und ich habe manchmal das Gefühl, dass dabei der Rechner abstürzt.

"Wer suchet, der findet", dachte ich mir gestern. Also habe ich nach kurzem Suchen diverse Makros gefunden, welche die nicht gesperrten Zellen leeren soll. Alle sind ungefähr ähnlich:

Code: Alles auswählen

Sub wegmit()
Dim Bereich As Range
Dim Zelle As Range

Set Bereich = Sheets("Tabelle1").Range("A1:E18")
For Each Zelle In Bereich
 If Zelle.Locked = False Or Zelle.MergeArea.Locked = False Then Zelle.MergeArea.ClearContents
Next Zelle
End Sub
Also habe ich kurzerhand die Zellen (es gibt auch diverse verbundene Zellen) genommen, den Zellschutz aufgehoben die Tabelle gesperrt und die Makros ausprobiert.
Das Ergebnis war immer das Gleiche:
Im Makro-Editor wird immer das Wort "Range" markiert und ich erhalte die Fehlermeldung "BASIC-Syntaxfehler. Unbekannter Datentyp Range.".

Dann habe ich ein komplett neues Calc-Dokument (ohne verbundene Zellen oder irgendwelchen Schnickschnack) erstellt, bei einem Bereich den Zellschutz aufgehoben und die Makros auch dort ausprobiert. => Gleicher Fehler. Es liegt also nicht an meiner Angebots-/Rechnungs-Datei, sondern es scheint ein generelles Problem mit den Makros zu sein. Da ich mich jedoch mit VBA nicht wirklich auskenne, finde ich jedoch den Fehler nicht.

Frage1: Was mache ich falsch? Was ist an dem Makro falsch?

Frage2: Sollte das mit dem Makro nicht funktionieren: Gibt es eine andere Möglichkeit nicht gesperrte Zellen zu leeren? Alles Markieren => "DELETE" resultiert in der Fehlermeldung "Gesperrte Zellen können nicht geändert werden". Eine andere Möglichkeit wüsste ich jetzt nicht....

Viele Grüße

Manu
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: Nicht gesperrte Zellen leeren per Makro

Beitrag von mikeleb »

Hallo,
zu Frage 1: Es ist ein Excel-Makro, das nur bedingt in Calc funktionieren könnte.
zu Frage 2: Teste mal, ob Folgendes deinen Wunsch erfüllt.

Code: Alles auswählen

Sub wegmit()
	oBereich = Thiscomponent.Sheets("Tabelle1").getCellRangeByName("A1:E18")
	oZellen=oBereich.queryContentCells(7).createEnumeration()
	do while oZellen.hasmoreelements
		oZelle=oZellen.nextelement
		if ozelle.cellprotection.islocked=false then
			ozelle.clearcontents(7)
		end if
	loop
End Sub
Gruß,
mikeleb
Manu1981
**
Beiträge: 26
Registriert: Mi, 15.04.2015 09:47
Kontaktdaten:

Re: Nicht gesperrte Zellen leeren per Makro

Beitrag von Manu1981 »

Hi Mikeleb,

vielen Dank für Deine Hilfe. Genau so stelle ich mir das vor. Leider werden nicht alle Zellen im angegebenen Bereich gelölscht. Leider kann ich keine unterschiede zwischen den geleerten und den nicht geleerten Zellen erkennen.

Anbei habe ich einmal eine Beispieldatei angehängt.
ANGEBOT - Beispieldatei.ods
(185.97 KiB) 106-mal heruntergeladen
Wenn man das Makro laufen lässt, werden lediglich die folgenden Felder geleert:
-Die ergänzenden Kundendaten (R18:R19)
-Die Felder unter "Adresse manuell" (R22:R25)
-Der letzte Einkaufspreis bei Montage (M40)
-Die Felder bei Montageadresse (P46:P49)
-Die manuellen E-Mail-Adressen (N55:N64)

Folgende Felder sollen auch geleert werden, allerdings passiert hier nichts...
-Mitteilung an Kunde, M14
-Anzahl d. Artikel, M22
-Produktbegleitende Dienstleistung, M25
-der Butto-EK, M29:M38 (M39 enthält keine Eingaben, M40 geht)
-Der Aufschlag, O29:O40
-Die Zeit/Menge, R29:R40
-Die Manuellen Produkteingaben, S29:S40
-Die manuelle Einheit, V29:V40
-Die Montage manuell, M43
-Das manuelle Produkt in der Fußzeile, S43
-Die Angebotsfrist, T45
-und der manuelle Montageort, M52

Was mache ich falsch? Gibt es wirklich keine Unterschiede zwischen den Zellen oder habe ich Tomaten auf den Augen?

Viele Grüße und Danke nochmal! :)

Manu
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: Nicht gesperrte Zellen leeren per Makro

Beitrag von mikeleb »

Hallo Manu,

mein Fehler :oops: : In der zweiten Zeile fehlte .Cells (es soll ja jede einzelne Zellen geprüft werden und nicht die Zellbereiche).

Code: Alles auswählen

Sub wegmit()
	oBereich = Thiscomponent.Sheets("Tabelle1").getCellRangeByName("A1:E18")
	oZellen=oBereich.queryContentCells(7).Cells.createEnumeration()
	do while oZellen.hasmoreelements
		oZelle=oZellen.nextelement
		if ozelle.cellprotection.islocked=false then
			ozelle.clearcontents(7)
		end if
	loop
End Sub
Gruß,
mikeleb
Manu1981
**
Beiträge: 26
Registriert: Mi, 15.04.2015 09:47
Kontaktdaten:

Re: Nicht gesperrte Zellen leeren per Makro

Beitrag von Manu1981 »

Hi Mikeleb,

kein Grund zur Beunruhigung! :) Alles gut! :) Funktioniert genau wie es soll. Vielen Dank nochmal! :) Zumindest auf der ersten Tabelle (Angebot). Es gibt jedoch noch 2 weitere Tabellen, wo jedoch bisher nur insg. 3 Zellen geleert werden sollen. Ist es möglich diese Zellen in das Makro mit einzubinden oder müsste ich das Makro für jede Tabelle jeweils 1 mal kopieren und die Tabelle und den Zellbereich entsprechend abändern?

LG Manu
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: Nicht gesperrte Zellen leeren per Makro

Beitrag von mikeleb »

Hallo,
du könntest es so machen.
Wenn es nur wenige Zellen sind (und es kommen vielleicht noch welche hinzu) wäre auch folgendes möglich/praktikabel:

Code: Alles auswählen

Sub wegmit()
	oDoc=ThisComponent
	oBereich = oDoc.Sheets("Tabelle1").getCellRangeByName("A1:E18")
	oZellen=oBereich.queryContentCells(7).Cells.createEnumeration()
	do while oZellen.hasmoreelements
		oZelle=oZellen.nextelement
		if ozelle.cellprotection.islocked=false then
			ozelle.clearcontents(7)
		end if
	loop
	'Festlegung weiterer Zellen
	'in jedem Unterrarray wird zunächst der Tabellenname und dann die einzelnen Zellen festgelegt
	aZellen=array(array("Tabelle2","A1","B5","C7"),array("Tabelle3","E1","F5","G7","H9"))
	for itab=0 to ubound(aZellen())
		oTab=oDoc.Sheets.getByName(aZellen(itab)(0))
		for izelle=1 to ubound(aZellen(itab))
			oTab.getCellRangeByName(aZellen(itab)(izelle)).clearcontents(7)
		next
	next
End Sub
Gruß,
mikeleb
Antworten