Exel - Zelleninhalt als Variable im Textfeld nutzen.

OP #6077903
Lesenswert?

Moin

In einem Textfeld möchte ich gerne Werte aus bestimmten Zellen stehen 
haben.
Wenn sich der Wert dieser Zellen ändert, dann soll natürlich auch das 
Textfeld angepasst werden.

Also so:

E1 = "Peter"
E2 = 55

Textfeld: "Hallo E1, du hast E2 Äpfel"


Eigentlich dachte ich, dass es so funktioniert:

="Hallo " & E1 & ", du hast" & E2 & " Äpfel"

Es erscheint aber die Fehlermeldung: kein gültiger Bezug oder Name.


Bin kein VBA Profi, aber wenns damit geht, wäre ich auch damit 
einverstanden.

Gruß Kolja
#6078303
Lesenswert?

Kolja L. schrieb:
> Danke, aber wie kommt die Variable str in das Textfeld?
> Oder verstehe ich den Ansatz falsch?

In Deinem Eingangspost schreibst Du ich bin kein VBA-Spezialist, also 
bin ich davon ausgegangen, dass Du den Text im VBA benötigst.

Wenn Du nur die Zellen E1 und E2 in einer anderen Zelle Nutzen willst, 
ist kein VBA nötig, dann geht das mit verketten. Aber das wurde ja schon 
an anderer Stelle erwähnt.

Grüße
Roland
OP #6078312
Lesenswert?

Dafür wollte ich eine Lösung:

> In einem Textfeld möchte ich gerne Werte aus bestimmten Zellen stehen
> haben.

Das:

Heinz R. schrieb:
> ="Hallo "&(E1)& ", Du hast "&(E2)&" Äpfel"

und das:

MaWin schrieb:
> =CONCATENATE("Hallo ";E1;", Du hast ";E2; " Äpfel")

Funktioniert nicht in einem Textfeld.


Roland F. schrieb:
> In Deinem Eingangspost schreibst Du ich bin kein VBA-Spezialist, also
> bin ich davon ausgegangen, dass Du den Text im VBA benötigst.

Ja, aber wie bekomme ich den Inhalt der Variable in das Textfeld?
Danke für die Hilfe :-)
#6078316
Lesenswert?

Kolja L. schrieb:
> Dafür wollte ich eine Lösung:
>
>> In einem Textfeld möchte ich gerne Werte aus bestimmten Zellen stehen
>> haben.
>
> Das:
>
> Heinz R. schrieb:
>> ="Hallo "&(E1)& ", Du hast "&(E2)&" Äpfel"
>
> und das:
>
> MaWin schrieb:
>> =CONCATENATE("Hallo ";E1;", Du hast ";E2; " Äpfel")
>
> Funktioniert nicht in einem Textfeld.
>
> Roland F. schrieb:
>> In Deinem Eingangspost schreibst Du ich bin kein VBA-Spezialist, also
>> bin ich davon ausgegangen, dass Du den Text im VBA benötigst.
>
> Ja, aber wie bekomme ich den Inhalt der Variable in das Textfeld?
> Danke für die Hilfe :-)

Wie gesagt, Du brauchst dann kein VBA:
Schreibe folgendes in die Zelle wo der Text erstellt werden soll:
1
=VERKETTEN("Hallo "; E1; " du hast "; E2; " Äpfel")
Grüße
Roland
#6079212
Lesenswert?

Das ganze war leider mal wieder ein Missverständnis, das aber nicht von 
Koja ausgelöst wurde.

Jetzt habe ich aber hoffentlich verstanden, was gesucht wird.
Ich beschreibe das mal mit meinen Worten:

Es soll in einem Textfeld (keine Textzelle) ein Text zusammengebaut 
werden, der aus konstanten Textteilen und dem Inhalt zweier Zellen 
besteht.

Leider gibt es dafür keine Lösung ohne Hilfskonstukt.

Lösung 1: (Wurde schon genannt) Eine Hilfzelle nutzen in der der Text 
(mit Verketten) zusammengebaut wird, und im Textfeld auf diese 
Hilfszelle verweisen. Der Grund liegt darin, dass in Textfeldern nur auf 
eine Zelle verwiesen werden darf.

Lösung 2: Ein VBA-Code welcher durch ein Ereigniss ausgelöst wird.

Der VBA-Code muss in das Modul der betroffen Tabelle also z.B. 
"Tabelle1"  eingefügt werden.
Hier der VBA-Code:
1
Private Sub Worksheet_Change(ByVal Target As Range)
2
    If Target.Address = "$E$1" Or Target.Address = "$E$2" Then
3
        ActiveSheet.Shapes("TextBox 1").TextFrame.Characters.Text = "Hallo " + Range("E1").Value + " Du hast " + CStr(Range("E2").Value) + " Äpfel"
4
    End If
5
End Sub
Man könnte den VBA-Code sogar auf eine Zeile verkürzen indem man die 
Bedingung entfernt, das Ergebnis wäre das gleiche, der Code würde aber 
dann bei jeder Änderung einer belibigen Zelle durchlaufen werden.
Funktionier ist aber nicht so elegant.

So ich hoffe nun nicht wieder etwas misverstanden zu haben :-)

Grüße
Roland
Gast #6081386
Lesenswert?

Roland F. schrieb:

> Es soll in einem Textfeld (keine Textzelle) ein Text zusammengebaut
> werden, der aus konstanten Textteilen und dem Inhalt zweier Zellen
> besteht.

Wenn das so ist, dann bleibt die Frage: Wozu? Oder anders ausgedrückt: 
Warum muss es unbedingt ein Textfeld sein, warum tut es nicht einfach 
eine Zelle?

> Leider gibt es dafür keine Lösung ohne Hilfskonstukt.
[...]

So sieht's aus. Umso mehr stellt sich o.g. Frage...
OP #6081610
Lesenswert?

Moin

Hätte nicht gedacht, dass es hier noch weitergeht.

Roland F. schrieb:
> Das ganze war leider mal wieder ein Missverständnis, das aber nicht von
> Koja ausgelöst wurde.

Danke, danke, danke.

Habe wirklich an mir, bzw an meinen Formulierungen gezweifelt.

Roland F. schrieb:
> Es soll in einem Textfeld (keine Textzelle) ein Text zusammengebaut
> werden, der aus konstanten Textteilen und dem Inhalt zweier Zellen
> besteht.

Richtig!

Roland F. schrieb:
> Lösung 1:

Hatte ich auch erst so gemacht, ist aber unflexibel, weil nicht 
formatierbar.

Roland F. schrieb:
> Lösung 2: Ein VBA-Code welcher durch ein Ereigniss ausgelöst wird.

Das habe ich jetzt auch gemacht, in etwa so wie du.
1
 
2

3
JAHR = Range("Q12").Value 
4
WG = Range("G30").Value
5
BILANZ = CStr(Round(Abs(Range("K42").Value), 2)) + "€"
6
NEUE_MIETE = CStr(Range("E41").Value) + "€"
7

8
TEXT_VORHER = "Liebe Mitglieder des " + WG + vbCrLf + vbCrLf
9

10
SCHULDEN = "Ihr habt im Jahr " + JAHR + " leider " + BILANZ + " zu wenig Miete gezahlt" + vbCrLf + _
11
"Bitte überweisen " + vbCrLf + vbCrLf
12

13
GUTHABEN = "Ihr habt im Jahr " + JAHR + " " + BILANZ + " zu viel Miete gezahlt" + vbCrLf + _
14
"Bekommt ihr wieder" + vbCrLf + vbCrLf
15

16
TEXT_NACHHER = "Eure neue Miete beträgt: " + NEUE_MIETE + " " + vbCrLf + vbCrLf + _
17
"Liebe Grüße euer Schatzmeister"
18

19
If Range("K42").Value < 0 Then
20
    SOLL_HABEN = SCHULDEN
21
Else
22
    SOLL_HABEN = GUTHABEN
23
End If
24

25
    
26
    With ActiveSheet.Shapes("TextBox 1")
27
             .TextFrame2.TextRange = TEXT_VORHER + SOLL_HABEN + TEXT_NACHHER
28
             
29
             .TextFrame2.TextRange.Find(WG).Font.Bold = msoTrue
30
             .TextFrame2.TextRange.Find(BILANZ).Font.Bold = msoTrue
31
             .TextFrame2.TextRange.Find(NEUE_MIETE).Font.Bold = msoTrue
32
    End With
33
End Sub

Ausgelöst wird die Funktion über ein Button, der auch Jahr und Wohnung 
zuordnet.

Nicht ganz so einfach zu bearbeiten, wie ich anfangs wollte, aber es 
funktioniert.

c-hater schrieb:
> Warum muss es unbedingt ein Textfeld sein, warum tut es nicht einfach
> eine Zelle?

Vielleicht ist die Fage ja schon mit den Textbausteinen im Code 
beantwortet.
Was mich bei der ganzen Suche nach dieser Lösung etwas gewundert hat, 
ist dass es weder so einfach ist, wie ich anfangs dachte und dass es 
nicht ganz viele Beispiele für diese Funktion gibt. Ich bin irgendwie 
davon ausgegangen, dass es öfter vorkommt, dass in einem Fließtext 
Zahlenwerte variabel angegeben werden sollen. Die Lösung mit dem 
Textfeld ist ja quasi die Lightversion eines Serienbriefs mit der 
Kombination von Excel und Word. Hätte ich auch machen können, war mir 
dann aber etwas zu übertrieben.

Gruß Kolja
#6081622
Lesenswert?

Kolja, dafür gibt es Datenbanken. Mit Access ist das deutlich schöner 
und einfacher zu lösen.
Die meisten nutzen Excel eher als Datenbank.
Gut, auf der Arbeit mache ich das auch, weil der Austausch einfacher 
ist, aber grundsätzlich wäre vielmals eine Datenbank angebrachter.
Und auch die können rechnen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren