Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Textbausteine

Textbausteine
31.03.2020 20:25:55
Stefan
Hallo,
Ich habe eine Arbeitsmappe erstellt mit der ich Angebote schreiben kann, ähnlich einer Leistungsbeschreibung. Die Texteingabe mache ich über eine Userform. Ich möchte die eingegeben Texte abspeichern um beim nächsten Angebot diese wieder verwenden zu können.
Hat jemand eine Idee wo und wie ich diese Texte abspeichern kann?
Vielen Dank
Anzeige

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

Betreff
Datum
Anwender
Anzeige
AW: Textbausteine
31.03.2020 20:35:54
Patrick
Hallo Stefan,
Du könntest die Texte als .txt Dokument abspeichern und wieder importieren. Das wäre eine simple Lösung. Etwas umfangreicher wäre es, wenn du diese in der Arbeitsmappe direkt hinterlegen möchtest, ohne das diese irgendwo auftauchen.
AW: Textbausteine
31.03.2020 20:36:39
volti
Hallo Stefan,
solche Dinge habe ich früher immer gerne über eine Ini-Datei gemacht, die natürlich auch gerne *.txt heißen kann.
Stichwort API-Funktionen: GetPrivateProfilestring, WritePrivateProfileString
Das managed sich sehr gut mit Bereich, Item, Daten und Default
Hängt natürlich auch ein bisschen vom Text ab (Menge, Handling-Wünsche usw.).
viele Grüße
Karl-Heinz
Anzeige
AW: Textbausteine
31.03.2020 20:43:44
Stefan
Hallo
Vielen Dank für Deine Antworten .
AW: Textbausteine
31.03.2020 20:43:45
Stefan
Hallo
Vielen Dank für Deine Antworten .
AW: Textbausteine
31.03.2020 21:30:38
volti
Hallo Stefan,
hier noch ein einfaches Beispiel für Dich, wie ich das meine, falls noch von Interesse oder auch für andere interessierte Leser.

Option Explicit
#If VBA7 Then
 Private Declare PtrSafe Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" ( _
         ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, _
         ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFilename As String) As Long
 Private Declare PtrSafe Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" ( _
         ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, _
         ByVal lpFilename As String) As Long
#Else
 Private Declare  Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" ( _
         ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, _
         ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFilename As String) As Long
 Private Declare  Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" ( _
         ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, _
         ByVal lpFilename As String) As Long
#End If
Private Const csTxtdatei As String = "Testtextdaten.txt"
Function SetGetTxtdaten(sArt As String, sBereich As String, sItem As String, _
                        sPfadDatei As String, Optional sDaten As String) As String
'Schreibt Daten in die Textdatei oder liest Daten aus der Textdatei
'sArt= R oder W für Lesen oder Schreiben
 Dim sTxt As String * 5000              'Min Anzahl an Zeichen vorgeben
 If sPfadDatei = "" Then Exit Function  'Keine Datei übergeben
 On Error GoTo SGI_Error
 Select Case sArt
 Case "R"
  GetPrivateProfileString sBereich, sItem, "none", sTxt, 5000, sPfadDatei
  SetGetTxtdaten = Replace(Trim(Left(sTxt, InStr(sTxt, vbNullChar) - 1)), "¶", vbCrLf)
 Case "W"
  If sDaten <> "" Then _
     WritePrivateProfileString sBereich, sItem, Replace(sDaten, vbCrLf, "¶"), sPfadDatei
 End Select
 Exit Function
SGI_Error:
 SetGetTxtdaten = "none"
 On Error GoTo 0
End Function
Sub Schreibewas()
 Dim sTxt As String
 sTxt = "Hallo World," & vbCrLf & "ich bin es."
 SetGetTxtdaten "W", "Sektor1", "MeinText", ThisWorkbook.Path & "\" & csTxtdatei, sTxt
End Sub
Sub Lesewas()
 Dim sTxt As String
 MsgBox SetGetTxtdaten("R", "Sektor1", "MeinText", ThisWorkbook.Path & "\" & csTxtdatei)
End Sub

viele Grüße
Karl-Heinz

Anzeige
AW: Textbausteine
01.04.2020 09:19:50
Stefan
Guten Morgen Karl Heinz,
Danke für dein Beispiel. Ich werde mir es dann mal genauer anschauen.
Vielen Dank
AW: Textbausteine
03.04.2020 21:03:25
Stefan
Hallo also das Schreiben habe ich gut hinbekommen. Nun möchte ich alle Sectionen in eine Listbox einlesen und daran verzweifle ich. Wäre cool wenn mir jemand dabei helfen könnte.
Anzeige
AW: Textbausteine
03.04.2020 23:26:50
volti
Hallo Stefan,
dann solltest Du mal (D)eine Beispielmappe mit den bisherigen Ergebnissen und ggf. weiteren Erklärungen hier hochladen.
viele Grüße
Karl-Heinz
AW: Textbausteine
06.04.2020 14:23:55
Stefan
Hi,
also hier mal der Code. Irgendwie steh ich da total auf dem Schlauch. Bisher steht nur der Key in der Listbox was ja schon mal ein Anfang ist. Ich möchte aber die Sections der TXT drin haben, damit ich später beim speichern meiner Texte auswählen kann in welchem Bereich der Text gespeichert werden soll.
Option Explicit
'#If Win64 Then
Private Declare PtrSafe Function WritePrivateProfileStringA Lib "kernel32.dll" ( _
ByVal lpApplicationName As String, _
ByVal lpKeyName As Any, _
ByVal lpString As Any, _
ByVal lpFilename As String) As Long
Private Declare PtrSafe Function GetPrivateProfileStringA Lib "kernel32.dll" ( _
ByVal lpApplicationName As String, _
ByVal lpKeyName As Any, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long, _
ByVal lpFilename As String) As Long
Private Sub UserForm_Initialize()
Dim strPfad As String
Dim strWertGelesen As String
Dim strSection As String
Dim strKey As String
Dim lngResult As Long
Dim strBuffer As String
strPfad = "H:\Eigene Dokumente\Selbstst?ndig\Test.txt"  'Beispiel Anpassen!
strSection = "Beispiel"  'Beispiel Anpassen!
strKey = "Daten"           'Beispiel Anpassen!
'Wert lesen
strBuffer = Space$(255) 'R?ckgabewert wird mit ausreichend Leerzeichen gef?llt
lngResult = GetPrivateProfileStringA(strSection, strKey, vbNullString, strBuffer, Len( _
strBuffer), strPfad)
strWertGelesen = Left$(strBuffer, lngResult)
'    lngResult = GetPrivateProfileStringA(strSection, strKey, vbNullString, strBuffer, Len( _
strBuffer), strPfad)
ComboBox1.Value = strWertGelesen
ComboBox1.ListIndex = 0
End Sub

Danke schon mal.
Anzeige
AW: Textbausteine
06.04.2020 15:54:38
volti
Hallo Stefan,
zwar hast Du meine Anregung mit den beiden API-Funktionen angenommen und verwendet, aber dann hast Du Dir eine komplett andere Vorgehensweise im Netz gesucht, obwohl mein Vorschlag komplett funktionstüchtig ist und bei Bedarf entsprechend ausgebaut und verwendet werden kann.
Außerdem hast Du keine Datei mit dem enthaltenen Userform-Muster und ggf. die Textdatei hier hochgeladen, aus der die Strukturen Deines Projektes halbwegs ersichtlich sind.
Anhand des von Dir geposteten wenig aussagenden Code-Schnipsels kann ich Dir hier leider nicht weiterhelfen.
Trotzdem noch ein Tipp: Wenn ich das richtig verstehe, willst Du die Bereiche (Sections) in einer Listbox zur Auswahl haben. Diese musst Du anderweitig managen, die können natürlich nicht mit der API-Funktion gelesen werden.
Wenn die nicht fest sondern dynamisch sind, könntest Du sie kommagetrennt z.B. in einem Bereich "Sections" o.ä. vorhalten.
[Sections]
MySections=Sec1,Sec2,Sec3,Neuestes Sec.....
viele Grüße
Karl-Heinz
Anzeige
AW: Textbausteine
06.04.2020 19:12:37
Stefan
Hallo Karl Heinz,
Danke für Deine Antwort. Deinen Vorschlag habe ich schon noch im Hinterkopf. Allerdings war ich im ersten Moment wenig überfahren von der länge und da habe ich mal nach was einfacheren gesucht um es erstmal zu verstehen. Diese Herangehensweise ist noch völlig neu für mich.
Aber vielen Dank für Deine Hilfe.
LG
Stefan
Anzeige
AW: Textbausteine
06.04.2020 19:16:20
Stefan
Aber sag mal die Keys kann man mit der API auslesen das geht. Kannst Du mir vielleicht da weiterhelfen warum das funktioniert?
AW: Textbausteine
06.04.2020 19:29:28
volti
Hallo Stefan,
mein Vorschlag ist, aus Gesamtkonzept gesehen, genau richtig. Er vereinigt Scheiben und Lesen in einer Funktion, so dass spätere Zugriffe (und Du willst ja wohl etas schreiben und etwas lesen) mit einem einfachen Aufruf erfolgen. Meine Declares sind für 32 und 64 Bit. Man kann aber auch den nicht relevanten Teil weglassen.
Außerdem kann man mehrzeilig speichern, also mit Zeilenumbruch, was in Deinem Beispiel nicht geht.
Ich denke mir was aus (einschließlich Erklärungen) und poste es hier, auch wenn Du immer noch nicht Dein Konzept hier offen gelegt hast. Kann aber etwas dauern….
viele Grüße
Karl-Heinz
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige

Infobox / Tutorial

Textbausteine in Excel mit VBA nutzen


Schritt-für-Schritt-Anleitung

  1. VBA-Editor öffnen: Drücke ALT + F11, um den VBA-Editor in Excel zu öffnen.

  2. Modul hinzufügen: Klicke mit der rechten Maustaste auf „VBAProject (DeineArbeitsmappe)“ > Einfügen > Modul.

  3. API-Funktionen deklarieren: Füge den folgenden Code in das Modul ein, um die benötigten Funktionen zu deklarieren:

    #If VBA7 Then
    Private Declare PtrSafe Function GetPrivateProfileStringA Lib "kernel32" ( _
        ByVal lpApplicationName As String, _
        ByVal lpKeyName As Any, _
        ByVal lpDefault As String, _
        ByVal lpReturnedString As String, _
        ByVal nSize As Long, _
        ByVal lpFilename As String) As Long
    
    Private Declare PtrSafe Function WritePrivateProfileStringA Lib "kernel32" ( _
        ByVal lpApplicationName As String, _
        ByVal lpKeyName As Any, _
        ByVal lpString As Any, _
        ByVal lpFilename As String) As Long
    #Else
    Private Declare Function GetPrivateProfileString Lib "kernel32" ( _
        ByVal lpApplicationName As String, _
        ByVal lpKeyName As Any, _
        ByVal lpDefault As String, _
        ByVal lpReturnedString As String, _
        ByVal nSize As Long, _
        ByVal lpFilename As String) As Long
    
    Private Declare Function WritePrivateProfileString Lib "kernel32" ( _
        ByVal lpApplicationName As String, _
        ByVal lpKeyName As Any, _
        ByVal lpString As Any, _
        ByVal lpFilename As String) As Long
    #End If
  4. Funktionen implementieren: Erstelle eine Funktion zum Speichern und Abrufen von Textbausteinen. Hier ein Beispiel:

    Function SetGetTxtdaten(sArt As String, sBereich As String, sItem As String, _
        sPfadDatei As String, Optional sDaten As String) As String
        Dim sTxt As String * 5000
        If sPfadDatei = "" Then Exit Function
        On Error GoTo SGI_Error
        Select Case sArt
            Case "R"
                GetPrivateProfileStringA sBereich, sItem, "none", sTxt, 5000, sPfadDatei
                SetGetTxtdaten = Replace(Trim(Left$(sTxt, InStr(sTxt, vbNullChar) - 1)), "¶", vbCrLf)
            Case "W"
                If sDaten <> "" Then
                    WritePrivateProfileStringA sBereich, sItem, Replace(sDaten, vbCrLf, "¶"), sPfadDatei
                End If
        End Select
        Exit Function
    SGI_Error:
        SetGetTxtdaten = "none"
    End Function
  5. Text speichern und lesen: Verwende die Funktion SetGetTxtdaten, um Textbausteine zu speichern und zu lesen.


Häufige Fehler und Lösungen

  • Fehler bei API-Deklarationen: Stelle sicher, dass die Deklarationen korrekt für 32-Bit oder 64-Bit sind. Verwende die #If VBA7 Then Anweisung, um die Kompatibilität sicherzustellen.
  • Dateipfad nicht gefunden: Überprüfe den angegebenen sPfadDatei. Der Pfad muss existieren und korrekt sein.
  • Leere Rückgaben: Wenn die Rückgabe leer ist, könnte der Schlüssel oder die Sektion in der INI-Datei nicht existieren.

Alternative Methoden

Wenn du keine API-Funktionen verwenden möchtest, kannst du Textbausteine auch in einer Excel-Tabelle speichern. Erstelle eine Tabelle mit zwei Spalten: Eine für den Schlüssel und eine für den Text. Du kannst dann VLOOKUP oder INDEX und MATCH verwenden, um die Bausteine abzurufen.


Praktische Beispiele

Hier ist ein einfaches Beispiel, um einen Textbaustein zu speichern und abzurufen:

Sub Beispiel()
    Dim sPfad As String
    sPfad = ThisWorkbook.Path & "\Test.txt"

    ' Text speichern
    SetGetTxtdaten "W", "Beispiel", "MeinText", sPfad, "Hallo Welt!"

    ' Text abrufen
    MsgBox SetGetTxtdaten("R", "Beispiel", "MeinText", sPfad)
End Sub

Dieses Beispiel speichert "Hallo Welt!" unter dem Schlüssel "MeinText" in der Sektion "Beispiel" und gibt ihn anschließend in einer MessageBox aus.


Tipps für Profis

  • Verwende Error Handling: Implementiere Fehlerbehandlung, um sicherzustellen, dass dein Code robust ist.
  • Dynamische Listbox: Wenn du die Sektionen dynamisch verwalten möchtest, speichere die Sektionen in einer Excel-Zelle und lade sie beim Initialisieren der UserForm in die Listbox.
  • VBA-Kommentare: Kommentiere deinen Code gründlich, um die Wartung zu erleichtern.

FAQ: Häufige Fragen

1. Wie kann ich die API-Funktionen für 64-Bit Excel verwenden?
Verwende die #If VBA7 Then Anweisung, um die richtigen Deklarationen für 64-Bit Excel zu erstellen.

2. Kann ich die Textbausteine direkt in Excel speichern?
Ja, du kannst Textbausteine in einer Tabelle speichern und mit Excel-Funktionen darauf zugreifen.

3. Was ist der Unterschied zwischen GetPrivateProfileString und WritePrivateProfileString?
GetPrivateProfileString wird verwendet, um Daten aus einer INI-Datei zu lesen, während WritePrivateProfileString zum Schreiben von Daten in eine INI-Datei verwendet wird.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige