VBA Konstanten über mehrere Zeilen deklarieren
#1
Ich wollte eine Konstante über mehrere Zeilen erstellen, Excel scheint aber die Verkettung von Strings bei CONST abzulehnen. 
Kann ich eine lange Konstantenstringliste irgendwie aufteilen bei der Konstanten Deklaration?

Bsp:

Code:
const Stadtliste1 = " (Stadt like 'Köln%' " & _ 
                            "  OR Stadt like 'Bochum%'" & _ 
                            "  OR Stadt like 'Düssel%') "

Die Liste ist natürlich viel länger als drei Städte. In einer Zeile geschrieben ist es ok.
Antworten Top
#2
Dein Code-Beispiel funktioniert doch. Wo ist das Problem?
Antworten Top
#3
(22.07.2025, 10:41)ExcelEnte schrieb:
Code:
const Stadtliste1 = " (Stadt like 'Köln%' " & _ 
                            "  OR Stadt like 'Bochum%'" & _ 
                            "  OR Stadt like 'Düssel%') "

Die Liste ist natürlich viel länger als drei Städte. In einer Zeile geschrieben ist es ok.

Das sieht mir eher nach dem Versuch aus, das als "Variable" in einem SQL-String verwenden zu wollen. Da werfen die Unterstriche als Bestandteil des Strings natürlich einen Fehler. Du musst unterscheiden zwischen der Deklaration, die in mehrere Zeilen aufgeteilt, und der Anweisung, die im SQL-Sring ausgegeben werden soll. Da muss die Deklaration so aussehen:

PHP-Code:
Const Stadtliste1 " (Stadt like 'Köln%' " _
                            
"  OR Stadt like 'Bochum%'" _
                            
"  OR Stadt like 'Düssel%') " 


...also die Unterstriche dürfen NICHT Teil des Strings sein.
Der sicherste Ansatz für einen Irrtum ist der Glaube, alles im Griff zu haben.
Nur, weil ich den Recorder bedienen kann, macht mich das noch lange nicht zum Musiker.

Ciao, Ralf

Antworten Top
#4
Hallo,
Zitat:const Stadtliste1 = " (Stadt like 'Köln%' " & _ 

                            "  OR Stadt like 'Bochum%'" & _ 
                            "  OR Stadt like 'Düssel%') "
du kannst in einer VBA-Konstantendeklaration keine Operatoren verwenden, denn der Code,  der dafür notwendig wäre, existiert zur Laufzeit des Programms nicht.
Konstanten werden nämlich vom Compiler bereits zur Kompilierzeit des Codes vollständig erstellt und nicht erst zur Laufzeit des Programmes mittels irgendwelcher Operatoren.

Warum gibst du das Ganze nicht in eine String-Variable, indem du dieser Variable (--> zur Laufzeit) den gewünschten String zuweist?

Code:
Dim Stadtliste1 As String
'....
Stadtliste1 =  " (Stadt like 'Köln%' " & _ 
                            "  OR Stadt like 'Bochum%'" & _ 
                            "  OR Stadt like 'Düssel%') "
Gruß Anton.

Windows 10 64bit
Office365 32bit
[-] Folgende(r) 1 Nutzer sagt Danke an EA1950 für diesen Beitrag:
  • ExcelEnte
Antworten Top
#5
(22.07.2025, 11:38)EA1950 schrieb: Hallo,
du kannst in einer VBA-Konstantendeklaration keine Operatoren verwenden, denn der Code,  der dafür notwendig wäre, existiert zur Laufzeit des Programms nicht.
Konstanten werden nämlich vom Compiler bereits zur Kompilierzeit des Codes vollständig erstellt und nicht erst zur Laufzeit des Programmes mittels irgendwelcher Operatoren.

Warum gibst du das Ganze nicht in eine String-Variable und weist dieser Variable (--> zur Laufzeit) den gewünschten String zu?

Code:
Dim Stadtliste1 As String
'....
Stadtliste1 =  " (Stadt like 'Köln%' " & _ 
                            "  OR Stadt like 'Bochum%'" & _ 
                            "  OR Stadt like 'Düssel%') "

Deine KI halluziniert, genauso wie meine, die meint 
Zitat:1. Const-Deklarationen dürfen keine zusammengesetzten Ausdrücke enthalten
In VBA dürfen Const-Werte nur einfache, zur Kompilierzeit bekannte Werte enthalten – also keine Zeichenkettenverkettung (&), keine Funktionsaufrufe, keine Berechnungen.

2. Zeilenumbruch mit _ ist bei Const nicht erlaubt
Auch der Zeilenumbruch mit Unterstrich (_) ist bei Const-Deklarationen nicht erlaubt, wenn er innerhalb eines Ausdrucks verwendet wird.
[-] Folgende(r) 1 Nutzer sagt Danke an DeltaX für diesen Beitrag:
  • ExcelEnte
Antworten Top
#6
Hi
Meinen Tests nach darf eine Programmzeile aus maximal 25 Editor-Zeilen bestehen
ab der 26. Zeile kommt dann die Fehlermeldung "Zu viele Zeilenfortsetzungen"
dh du darfst maximal 24x mit "_" umbrechen.

Lösungen fallen mir jetzt folgende ein:

a) alles in eine Zeile oder zumindest mehrere Städte in eine Zeile, so dass du unter 26 Zeilen für die Konstante bleibst.

b) Variable statt Konstante. Variablen kannst du mit : x = x & "abc" in einer eigenen Programmzeile schrittweise erweitert, so dass du beliebig viele Textteile hinzufügen kannst (ggf auch per Schleife aus einer Tabelle als Vorgabeliste)

c) wenn die Konstante in mehreren Makros verwendet werden soll, kann man auch eine Funktion erstellen:

Code:
Public Function Stadtliste1() As String
Stadtliste1 = " (Stadt like 'Köln%' "
Stadtliste1 = Stadtliste1 & "  OR Stadt like 'Bochum%'"
Stadtliste1 = Stadtliste1 & "  OR Stadt like 'Düssel%'"
End Function

diese Funktion kannst du dann wie eine Konstante in anderen Makros verwenden.

Gruß Daniel

(22.07.2025, 11:46)EA1950 schrieb: Hallo,
du kannst in einer VBA-Konstantendeklaration keine Operatoren verwenden, 

doch das geht. Einfache Operatoren wie & für Texte oder +-*/ sind in der Konstantendeklaration zulässig.

sowas funktioniert:
Code:
Option Explicit
Const x As Long = (1 + 2 + 3) * 25

Sub test()
Debug.Print x
End Sub

die verwendeten Werte müssen Konstant sein, dh man kann hier keine Variablen verwenden, aber man darf rechnen und vorhandene Konstanten verwenden.


sogar das funktioniert:
Code:
Option Explicit
Const y As Long = 3
Const x As Long = (1 + 2 + y) * 25

Sub test()
Debug.Print x
End Sub


Gruß Daniel
Antworten Top
#7
Für Konstanten ist folgendes möglich
Code:
Enum recht
    X = 42
    Y = 43
    Z = 44
End Enum
Const rechtx = recht.X
Const green = vbGreen

Sub testC()
    Debug.Print rechtx, green
End Sub

[MS-VBAL]: Constant Expressions | Microsoft Learn

Abgesehen davon, wenn es darum geht eine WHERE Klausel  aus Städtenamen aufzubauen, würde ich folgende Funktion verwenden
Code:
Function BuildWhereClause(cityList As Variant) As String
    Dim whereClause As String
    Dim i As Integer
    If UBound(cityList) < 0 Then
        BuildWhereClause = ""
        Exit Function
    End If

    whereClause = "("
    For i = LBound(cityList) To UBound(cityList)
        whereClause = whereClause & "Stadt LIKE '" & cityList(i) & "%'"
        If i < UBound(cityList) Then
            whereClause = whereClause & " OR "
        End If
    Next i
    whereClause = whereClause & ")"

    BuildWhereClause = whereClause
End Function

Sub testBeispiel()
    Dim liste As Variant
    liste = Array("Köln", "Düsseldorf", "Bochum")  ' In Praxis aus einer Tabelle lesen
    Debug.Print BuildWhereClause(liste)
End Sub
[-] Folgende(r) 1 Nutzer sagt Danke an DeltaX für diesen Beitrag:
  • ExcelEnte
Antworten Top
#8
@Ralf:

Die Unterstriche sind ja auch nicht Teil des zusammengesetzten Strings, egal ob der & - Operator nachgestellt oder in der nächsten Zeile steht. Wichtig ist, daß der Unterstrich immer als Letztes in der Zeile die Fortführung ankündigt, sonst steigt der Parser aus.

Der gezeigte Code ist somit eine gültige Konstantendefinition, auch wenn Anton das anders sieht.

Daniel hat das alles eigentlich sehr verständlich erklärt. 👌

Knobbi38
Antworten Top
#9
Das sehe ich jetzt nur den Unterschied dass du erst den Zeilenumbruch machst und dann die Verkettung, und ich mache es andersherum.

Ich schreibe es einfach als globale Variable, das ist die praktikabelste Lösung.
Danke für euren Input!
Antworten Top
#10
(22.07.2025, 15:05)knobbi38 schrieb: @Ralf:

Die Unterstriche sind ja auch nicht Teil des zusammengesetzten Strings, egal ob der & - Operator nachgestellt oder in der nächsten Zeile steht. Wichtig ist, daß der Unterstrich immer als Letztes in der Zeile die Fortführung ankündigt, sonst steigt der Parser aus.

...stimt. Das kommt davon, wenn man Fett auf der Brille hat...  20
Der sicherste Ansatz für einen Irrtum ist der Glaube, alles im Griff zu haben.
Nur, weil ich den Recorder bedienen kann, macht mich das noch lange nicht zum Musiker.

Ciao, Ralf

Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste