mikrocontroller.net

Forum: PC-Programmierung Exel - Zelleninhalt als Variable im Textfeld nutzen.


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Kolja L. (kolja82)


Bewertung
0 lesenswert
nicht 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

von Richard H. (richard_h27)


Bewertung
0 lesenswert
nicht lesenswert
E2 muss als Text formatiert werden:
="Hallo " & E1 & ", du hast " & text(E2;"0") & " Äpfel"

: Bearbeitet durch User
von Kolja L. (kolja82)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Leider nicht :-(

von Olaf B. (omb)


Bewertung
0 lesenswert
nicht lesenswert
Laut dieser Seite funktioniert es nur wenn du eine Zelle der Tabelle als 
"Zwischenspeicher" nutzt. Und dann auf diese Zelle verweist:
https://supportnet.de/fresh/2008/7/id2133989.asp

von Tom (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Schaue mal nach den Funktionen VERKETTEN oder TEXTVERKETTEN.

Da solltest Du das Gewünschte finden.

von Kolja L. (kolja82)


Bewertung
0 lesenswert
nicht lesenswert
Danke, das mit der Hilfszelle ist nervig, aber funktioniert erstmal.

Da ich aber nicht nur einen Satz im Textfeld haben werde, ist das schon 
recht aufwändig.
Eine einfachere Lösung ist immer noch gerne gesehen :-)

von Roland F. (roland_f451)


Bewertung
0 lesenswert
nicht lesenswert
Dann probiere es einmal so:
Dim str As String
str = "Hallo " + Range("E1").Value + " Du hast " + CStr(Range("E2").Value) + " Äpfel"
Grüße
Roland

von HildeK (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Kolja L. schrieb:
> Leider nicht :-(

Doch, schon. Du solltest
   text(E2;"0")
ändern in
   text(E2;0)

von Mike B. (mike_b97) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Tom schrieb:
> Schaue mal nach den Funktionen VERKETTEN oder TEXTVERKETTEN.
>
> Da solltest Du das Gewünschte finden.

=Verketten() ist die korrekte Funktion dafür

von Roland F. (roland_f451)


Bewertung
0 lesenswert
nicht lesenswert
HildeK schrieb:
> Doch, schon. Du solltest
>    text(E2;"0")
> ändern in
>    text(E2;0)

Das geht aber wieder nur über die Hilfszelle, das wollte er ja gerade 
vermeiden.
Daher die Variante mit dem Range("<Zelle>).Value und im Falle von Zahlen
Cstr(Range("<Zelle>").Value)

Grüße
Roland

von Kolja L. (kolja82)


Bewertung
0 lesenswert
nicht lesenswert
Mike B. schrieb:
> =Verketten() ist die korrekte Funktion dafür

Nur in der Zelle, nicht im Textfeld möglich.

Roland F. schrieb:
>  Dim str As String
> str = "Hallo " + Range("E1").Value + " Du hast " +
> CStr(Range("E2").Value) + " Äpfel"


Danke, aber wie kommt die Variable str in das Textfeld?
Oder verstehe ich den Ansatz falsch?

von Heinz R. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Kolja L.
In Open Office Calc funktioniert Folgendes:
="Hallo "&(E1)& ", Du hast "&(E2)&" Äpfel"
Also Deine ursprüngliche Version mit den Zellenbezeichnungen in 
Klammern.

von MaWin (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hä? was wird denn hier wieder für eine Scheisse gelabert.

=CONCATENATE("Hallo ";E1;", Du hast ";E2; " Äpfel")

von Hugo H. (hugohurtig1)


Bewertung
0 lesenswert
nicht lesenswert
MaWin schrieb:
> CONCATENATE

In unserem Sprachraum durch "VERKETTEN" (ohne ") zu ersetzen :-)

von Hugo H. (hugohurtig1)


Bewertung
0 lesenswert
nicht lesenswert
Kolja L. schrieb:
> Mike B. schrieb:
>> =Verketten() ist die korrekte Funktion dafür
>
> Nur in der Zelle, nicht im Textfeld möglich.

Was meinst Du damit?

Du wolltest eine Excel-Lösung (die funktioniert nunmal mit Zellen) - da 
ist sie:  =VERKETTEN() .

: Bearbeitet durch User
von Roland F. (roland_f451)


Bewertung
0 lesenswert
nicht 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

von Kolja L. (kolja82)


Bewertung
0 lesenswert
nicht 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 :-)

von Roland F. (roland_f451)


Bewertung
0 lesenswert
nicht 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:
=VERKETTEN("Hallo "; E1; " du hast "; E2; " Äpfel")
Grüße
Roland

von Kolja L. (kolja82)


Bewertung
0 lesenswert
nicht lesenswert
Ja, in Zellen funktioniert das, aber nicht in Textfeldern.

von pnp (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Kolja L. schrieb:
> Ja, in Zellen funktioniert das, aber nicht in Textfeldern.

Wie öffnest du ohne VBA ein Textfeld?

von Kolja L. (kolja82)


Bewertung
0 lesenswert
nicht lesenswert
pnp schrieb:
> Wie öffnest du ohne VBA ein Textfeld?

Einfügen -> Textfeld ?

von Roland F. (roland_f451)


Bewertung
0 lesenswert
nicht 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:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$E$1" Or Target.Address = "$E$2" Then
        ActiveSheet.Shapes("TextBox 1").TextFrame.Characters.Text = "Hallo " + Range("E1").Value + " Du hast " + CStr(Range("E2").Value) + " Äpfel"
    End If
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

: Bearbeitet durch User
von c-hater (Gast)


Bewertung
0 lesenswert
nicht 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...

von Kolja L. (kolja82)


Bewertung
0 lesenswert
nicht 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.
 

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

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

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

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

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

If Range("K42").Value < 0 Then
    SOLL_HABEN = SCHULDEN
Else
    SOLL_HABEN = GUTHABEN
End If

    
    With ActiveSheet.Shapes("TextBox 1")
             .TextFrame2.TextRange = TEXT_VORHER + SOLL_HABEN + TEXT_NACHHER
             
             .TextFrame2.TextRange.Find(WG).Font.Bold = msoTrue
             .TextFrame2.TextRange.Find(BILANZ).Font.Bold = msoTrue
             .TextFrame2.TextRange.Find(NEUE_MIETE).Font.Bold = msoTrue
    End With
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

von F. F. (foldi)


Bewertung
0 lesenswert
nicht 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.

von Kolja L. (kolja82)


Bewertung
0 lesenswert
nicht lesenswert
F. F. schrieb:
> Kolja, dafür gibt es Datenbanken

Für die eigentliche Aufgabe gibt es Hausverwalter, aber hier soll ja 
alles selbst gemacht werden und dann auch so, dass jeder einzelne Wunsch 
berücksichtigt wird, aber auch jeder ohne Abitur das system bedienen 
kann.

Die BKA der Jahre zuvor wurden mit Papier und Bleistift erstellt.

von F. F. (foldi)


Bewertung
0 lesenswert
nicht lesenswert
Kolja L. schrieb:
> Die BKA der Jahre zuvor wurden mit Papier und Bleistift erstellt.

Ist vielleicht auch heute (wieder) nicht die schlechteste Idee.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.