Anzeige
Archiv - Navigation
1820to1824
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
VBA Formelergebnis in Zwischenablage
21.03.2021 20:13:29
Felo
Hallo!
Ich habe eine Excel-Eingabemaske erstellt (keine UserForm), in die Nutzer Werte eingeben müssen.
Diese Werte werden auf einem neuen Worksheet per Formeln zu Textfragmenten / Sätzen verarbeitet, die in Zellen untereinander stehen. Dieser "Ergebnis-Text" muss dann in ein anderes Programm eingefügt werden.
Der fertige Text muss so untereinander stehen wie es die Zellenbereiche bzw. -Blöcke mit den Formelergebnissen es vorgeben (zB so: C4:C12, sowie C14:C29, u.a...).
Da das externe Programm mit Excel in keinster Weise verknüpft werden kann, muss das ganze per copy-paste über die Zwischenablage laufen.
1) Ich möchte dies gern per klick auf eine Schaltfläche (zB ActiveX oder Formularsteuerelement) durchführen. Der zwischengespeicherte Text (untereinander sortiert, wie in den Zellen vorgegeben) soll dann in dem anderen Programm per STRG-V eingefügt werden.
2) Das zweite Problem ist, dass nicht immer alle Zellen gefüllt sind, da auch mal in bestimmten Zellen keine Werte eingegeben werden müssen und so eine oder mehrere Zellen in dem genannten möglichen Bereich (C4:C12, C14:C29, u.a..) dann eben "keinen Wert" enthalten (bzw. "" durch eine Formel erzeugt!).
Kann man die "leeren" Zeilen direkt per Code löschen/unberücksichtigt lassen?
Manche Leerzeilen sollen als Abstandhalter bleiben (zB C13 zwischen den Blöcken C4:C12, C14:C29), andere Leerzeilen, die keinen Text enthalten (also nur "" durch eine Formel) jedoch gelöscht werden (beispielsweise C8 und C11 im Block C4:C12).
Die Lösungen dieser beiden Probleme sind für mich der Endgegner, dann wäre alles perfekt! ;-)
Vielen Dank für Lösungsansätze! Ich habe schon einige Codes ausprobiert und verzweifle daran.. Bin leider auch kein VBA-Experte.. :-(

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Formelergebnis in Zwischenablage
22.03.2021 01:43:21
ralf_b
hallo,
da man sich die Funktionalitäten alle schön zusammen googlen kann, zeig doch mal was du schon hast und wo es klemmt. Beispieldatei!!! Wir wollen das Rad nicht neu erfinden, aber nen platten Reifen reparieren wir bestimmt. Und was soll das mit den möglichen Bereichen? Es muß schon genauer sein wenn du willst das man dir hilft.
gruß
rb

AW: VBA Formelergebnis in Zwischenablage
22.03.2021 09:59:25
Daniel
Hi
wenn du einen Zellbereich mit .Copy kopierst, sollte diese auch in der normalen Windowszwischenablage sein, um in andere Anwendungen eingefügt werden zu können.
für dein Vorhaben würde ich erstmal mit
Range("ZielBereich").value = Range("Quellbereich").Value
die Daten in einen freien Bereich auf dem Tabellenblatt übernehmen.
dann kannst du in diesem Bereich die unerwünschten Leerzellen löschen, hier natürlich nur den Zellbereich auswählen, in dem die Leerzellen verschwinden sollen:
If Worksheetfunction.CountBlanks(Range("xxx")) > 0 Then Range("xxx").SpecialCells(xlcelltypeblanks).Delete Shift:=xlup
danach dann diesen Bereich einfach mit .Copy kopieren.
Gruß Daniel

Anzeige
AW: VBA Formelergebnis in Zwischenablage
22.03.2021 20:08:08
Felo
Hey Daniel, hab herzlichen Dank!
Das hat schonmal gut geklappt mit dem .copy!
Der nächste Schritt klemmt aber leider noch (Laufzeitfehler 438).
Private Sub CommandButton2_Click()
ActiveSheet.Unprotect
Range("D4:D12").Value = Range("C4:C12").Value
If WorksheetFunction.CountBlanks(Range("L10:L19")) > 0 Then
Range("D4:D12").SpecialCells(xlCellTypeBlanks).Delete Shift:=xlUp
Range("D4:D12").Copy
ActiveSheet.Protect
End If
End Sub
Da fehlt doch etwas, oder?
Vielen Dank und viele Grüße!

AW: VBA Formelergebnis in Zwischenablage
22.03.2021 21:21:19
Daniel
Hi
der Befehl heißt "CountBlank", nicht "CountBlanks"
nutze beim Programmieren die Intelliense (STRG+LEER), dann musst du nicht soviel tippen und du vermeidest solche Tippfehler (ich schreibe solche Einzeiler als Antwort meist direkt in Forum, daher habe ich diese kontrolle nicht, aber du kannst sie nutzen)
außerdem solltest du die Leerzellen in dem Bereich zählen, in dem du sie auch löschen willst, ansonsten ist es ja sinnlos.
das Problem ist bspw, dass ein Formelergebnis "" für excel nicht als Leerszelle gibt.
erst durch die Übertragung mit .Value = .Value wird aus dem Formelergebnis "" eine echte Leerzelle.
dann musst du auch darauf achten, was du hier in das IF mit rein nimmst und was nicht.
das IF soll hier nur absichern, dass die Leerzellen nur gelöscht werden, wenn welche da sind.
ansonsten bekommst du einen Fehlerabbruch, wenn du das SpecialCells(xlcelltypeblanks) ausführen willst und keine Leerzellen vorhanden sind.
alles weitere wie das kopieren der Zellen und das aufheben des Blattschutzes darf nicht in dieses IF mit rein.
ich habs ja als Einzeiler geschrieben (dh direkt nach dem THEN in der gleichen Zeile weiter), dann gehört nur das zum IF, was in dieser Zeile steht.
Wenn du das als Mehrzeiligen IF-Block schreibst, dann musst du schon darauf achten, was du mit rein nimmst und was nicht (beachte das END IF)
Gruß Daniel

Anzeige
AW: VBA Formelergebnis in Zwischenablage
23.03.2021 12:02:24
Felo
Hallo Daniel!
Zunächst einmal vielen dank für die Geduld und das Wohlwollen, das ich von dir und dem Forum bekomme, das weiß ich sehr zu schätzen!
nutze beim Programmieren die Intelliense (STRG+LEER)
Guter Tip! Mache ich
außerdem solltest du die Leerzellen in dem Bereich zählen, in dem du sie auch löschen willst, ansonsten ist es ja sinnlos.
War ein Tippfehler beim Posten, war mir schon bald aufgefallen..
Einzeiler / Mehrzeiler - IF / END IF
und schon wieder etwas gelernt! Top!
Es funktioniert leider noch nicht:

Private Sub CommandButton2_Click()
ActiveSheet.Unprotect
Range("D4:D12").Value = Range("C4:C12").Value
If WorksheetFunction.CountBlank(Range("D4:D12")) > 0 Then
Range("D4:D12").SpecialCells(xlCellTypeBlanks).Delete Shift:=xlUp
End If
Range("D4:D12").Copy
ActiveSheet.Protect
End Sub
1) Es gibt eine Fehlermeldung im Bereich Range("D4:D12").SpecialCells, wenn eine Leerzeile besteht.
2) Der Zielbereich wird weder mit noch ohne Leerzeile kopiert..
Grüße, Felo

Anzeige
AW: VBA Formelergebnis in Zwischenablage
23.03.2021 13:03:31
Felo
Hallo Daniel!
Zunächst einmal vielen dank für die Geduld und das Wohlwollen, das ich von dir und dem Forum bekomme, das weiß ich sehr zu schätzen!
nutze beim Programmieren die Intelliense (STRG+LEER)
Guter Tip! Mache ich
außerdem solltest du die Leerzellen in dem Bereich zählen, in dem du sie auch löschen willst, ansonsten ist es ja sinnlos.
War ein Tippfehler beim Posten, war mir schon bald aufgefallen..
Einzeiler / Mehrzeiler - IF / END IF
und schon wieder etwas gelernt! Top!
Es funktioniert leider noch nicht:

Private Sub CommandButton2_Click()
ActiveSheet.Unprotect
Range("D4:D12").Value = Range("C4:C12").Value
If WorksheetFunction.CountBlank(Range("D4:D12")) > 0 Then
Range("D4:D12").SpecialCells(xlCellTypeBlanks).Delete Shift:=xlUp
End If
Range("D4:D12").Copy
ActiveSheet.Protect
End Sub
1) Es gibt eine Fehlermeldung im Bereich Range("D4:D12").SpecialCells, wenn eine Leerzeile besteht.
2) Der Zielbereich wird weder mit noch ohne Leerzeile kopiert..
Grüße, Felo

Anzeige
AW: VBA Formelergebnis in Zwischenablage
23.03.2021 14:21:26
Daniel
Hi
sorry, ich kann den Fehler bei mir nicht nachvollziehen.
bei mir gehts.
welche Fehlermeldung bekommst du denn in welcher Zeile konrekt?
kannst du mal die Datei hochladen?
Gruß Daniel

AW: VBA Formelergebnis in Zwischenablage
23.03.2021 18:26:15
Felo
Ok, ich habe den Fehler gefunden!
Tatsächlich funktioniert deine Lösung gut, Daniel, jedoch funkt folgender Code, der uns schon als schwierig prophezeit wurde, dazwischen:

Private Sub Worksheet_Calculate()
Dim Ja As Boolean
Ja = Range("D5") = "1"
Me.Unprotect
If Not Ja Then
Application.EnableEvents = False
Range("E26,E27,G26,G27").ClearContents
Application.EnableEvents = True
End If
Range("E26,E27,G26,G27").Locked = Not Ja
Me.Shapes("Rechteck 42").Visible = Not Ja
Me.Shapes("Textfeld 32").Visible = Not Ja
Me.Shapes("Textfeld 40").Visible = Not Ja
Me.Shapes("Textfeld 41").Visible = Not Ja
Me.Shapes("Textfeld 43").Visible = Ja
Me.Shapes("Textfeld 44").Visible = Ja
Me.Protect
End Sub
Es liegt wohl am ständigen Aktivieren des Blattschutzes, denke ich..
Auch mit Application.EnableEvents in deinem Code funktioniert es nicht und hängt sich an der Zeile
Range("D4:D12").SpecialCells(xlCellTypeBlanks).Delete Shift:=xlUp
auf.
Ich glaube ich muss o.g. Code von einem Calculate- auf ein Change-Event umstellen, oder was meinst du?
Eine BeispielMappe könnte ich in diesen Tagen hochladen, falls nötig, bräuchte ich noch etwas Zeit für.

Anzeige
AW: VBA Formelergebnis in Zwischenablage
24.03.2021 15:15:57
Daniel
Hi
du kannst selber das Application.EnableEvents = False/True verwenden, um das automatische Ausführen der Events zu unterbinden (Beispiel siehst du ja im Calculate-Makro, da ist das drin damit es sich nicht selbst in einer Endlosschleife aufruft)
also einfach auf FALSE setzen, bevor du deine Aktionen startets und hinterher wieder auf TRUE setzen.
alternativ kannst du dir für das einfügen der Inhalte auch ein neues Blatt anlegen und dort die sachen hinkopieren.
Das neue Blatt sollte dann keine Events haben.
Gruß Daniel

AW: VBA Formelergebnis in Zwischenablage
25.03.2021 14:37:25
Felo
Vielen Dank, Daniel!
Ich habe auch ein Change-Event umgestellt, es funktioniert auch gut, danke für den Tip bez. Application.EnableEvents!
Es funktioniert soweit gut, hat aber leider noch Fehlerchen..
Insbesondere funktioniert die Kopier-Funktion nicht.
Ich lade mal eine Beispiel-Mappe hoch.
https://www.herber.de/bbs/user/145112.xlsm

Anzeige
AW: VBA Formelergebnis in Zwischenablage
26.03.2021 14:38:09
Daniel
Hi
es gibt bestimmte Aktionen in Excel, bei denen wird der Zwischenspeicher geleert.
das Aktivieren des Blattschutzes gehört dazu.
Also erst Blattschutz aktivieren, danach kopieren (einfach die beiden Zeilen tauschen).
alternativ führe die Aktion auf einem anderen, ausgeblendeten Blatt durch, welches keinen Blattschutz hat.
Gruß Daniel

AW: VBA Formelergebnis in Zwischenablage
30.03.2021 18:49:33
Felo
Hallo Daniel,
das Kopieren funktioniert jetzt, vielen Dank.
Aber es wird immernoch der untere Bereich ("L19:L22") im zu kopierenden Ergebnis-Text nach oben gezogen/kopiert, eine Leerzeile (im Code unten Zeile18) bleibt nicht (Wahrscheinlich durch "Shift:=xlUp"?!). Kann man das "hochziehen", wenn man zB. mehrmals auf den Button klickt, vermeiden und eine freie Zeile zum Trennen der Blöcke dazwischen belassen? Alle anderen Leerzeilen sollen nicht berücksichtigt werden (Leerzeilen werden im Moment mitkopiert, nur eben unter den zusammengerückten Zeilen).
Private Sub CommandButton1_Click()
ActiveSheet.Unprotect
Range("L14:L17").Value = Range("H14:H17").Value
If WorksheetFunction.CountBlank(Range("L14:L17")) > 0 Then
Range("L14:L17").SpecialCells(xlCellTypeBlanks).Delete Shift:=xlUp
Range("L19:L22").Value = Range("H19:H22").Value
If WorksheetFunction.CountBlank(Range("L19:L22")) > 0 Then
Range("L19:L22").SpecialCells(xlCellTypeBlanks).Delete Shift:=xlUp
ActiveSheet.Protect
Range("L14:L22").Copy
End Sub

Anzeige

304 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige