PDA

Vollständige Version anzeigen : Variablen füllen und Global nutzen


Raphael-2017
31.08.2017, 13:19
Hallo zusammen,

wieder einmal wende ich mich mit einer bitte um Hilfe an Euch!

Mein kleines Projekt soll nun Abteilungsintern genutzt werden und weiter ausgebaut werden.
Nun möchte ich mir einiges an Tipparbeit sparen und auch meinen Code optimieren.

Jetzt zum Problem:
bisher habe ich für jede Funktion meine Variablen Deklariert und dann mit Dateien aus einem Excelsheet befüllt.
Jetzt würde ich gerne diese Variablen in (vorerst) nur diesem Modul für alle Funktionen nutzen!

Bisher habe ich eine Zelle in der Zeile markiert aus welcher ich die Daten benötige und dann mit VBA die benötigten Zellen ausgelesen und an die Variablen übergeben. So weit so gut.

Wie kann ich nun die Variablen befüllen und im Modul bekannt geben?

Hier eine Beispiel Funktion:

Public Function Mat_vobe_Deckblatt()

'*** Variablen Deklarieren ***
Dim Adresse As String
Dim neueAdresse As String
Dim EQNR As String
Dim AENR As String
Dim RPAM As String
Dim RPAMK As String
Dim CCSNR() As String
Dim CCSNRO As String
Dim CCSNRNeu As String
Dim sNumber As String
Dim Kunde As String
Dim Liefertermin As Date
Dim Sachbearbeiter As String

'*** Aktive Zeile auslesen ***
ThisWorkbook.Worksheets("CCS-2016").Activate
Adresse = ActiveCell.AddressLocal(False, False)
neueAdresse = Mid(Adresse, 2)

'*** Variablen mit Daten befüllen ***
'CCSNR = Range("E" & neueAdresse).Value
AENR = Range("R" & neueAdresse).Value
RPAM = Range("G" & neueAdresse).Value
EQNR = Range("T" & neueAdresse).Value
RPAM = Range("G" & neueAdresse).Value
Kunde = Range("V" & neueAdresse).Value
Liefertermin = Range("P" & neueAdresse).Value
Sachbearbeiter = Range("AF" & neueAdresse).Value

If EQNR = "Start" Then
ElseIf EQNR = "io" Then
ElseIf EQNR = "-" Then
ElseIf EQNR = "" Then
Else
'*** Variablen bearbeiten ***
'*** RPAM-Nr. bearbeiten ***
CCSNRO = Range("E" & neueAdresse).Value
'*** Prüfen ob der String ein "-" enthält ***
If InStr(CCSNRO, "-") > 0 Then
'*** Returns an array containing ***
CCSNR() = Split(CCSNRO, "-")
sNumber = CCSNR(1)
' führende Nullen entfernen
CCSNR(1) = Format$(sNumber, "#")
CCSNRNeu = CCSNR(0) & CCSNR(1)
Else
CCSNRNeu = CCSNRO
End If

'*** das jetzt benötigte Tabellenblatt wechseln ***
ThisWorkbook.Worksheets("Mat-Vorbe").Activate

'*** Daten eintragen für... ***
'*** RPAM ***
Range("G3") = RPAM
'*** CCS-Nr ***
Range("D3") = CCSNRNeu
'*** AE-Nr ***
Range("D7") = AENR
'*** EQ-Nr ***
Range("G7") = EQNR
'*** Aufbau ***
Range("D9") = Kunde
'*** Liefertermin ***
Range("D11") = Liefertermin
'*** Sachbearbeiter ***
Range("G11") = Sachbearbeiter

'*** Tabelle Activieren ***
ThisWorkbook.Worksheets("Mat-Vorbe").Activate

'*** Zulieferer/Hersteller auswählen ***
If Range("D9") = "intern" Then
Range("G9") = "intern"
ElseIf Range("D9") = "RS" Then
Range("G9") = "Roland Schrade"
Range("D9") = "intern"
ElseIf Range("D9") = "Stoll" Then
Range("G9") = "Beistellung/Ergänzung"
ElseIf Range("D9") = "KSV" Then
Range("G9") = "Ergänzung"
Else: Range("G9") = ""
End If

'*** Tabelle ausdrucken ***
ThisWorkbook.Worksheets("Mat-Vorbe").PrintOut

'*** zurück zur CCS-2016 Tabelle ***
ThisWorkbook.Worksheets("CCS-2016").Activate
Range("C" & neueAdresse).Select
End If
End Function



Vielen Dank für Eure Hilfe und Eure Mühe.

Gerne bin ich bereit dem Helfer eine Tüte Gummibären zukommen zu lassen oder aber eine Spende an die KinderKrebsStiftung in Tübingen zu tätigen.

R J
31.08.2017, 14:07
Hi Raphael,

ich entscheide mich für die Spende an die Kinderkrebshilfe...:)

Du hast zwar eine Public Function (die eigentlich ein Sub ist, weil sie keinen Wert zurückgibt), die von überall aus aufgerufen werden kann, aber die Variablen darin sind nur innerhalb dieser Function bekannt.

Du könntest ein neues Modul erstellen. Benenne es um in modDeklarationen.

Dort kannst Du nun die globalen Variablen und/oder Konstanten dimensionieren. Allerdings müssen sie Public sein, wenn sie auch außerhalb dieses Moduls bekannt sein sollen.
Ich nehme jetzt mal exemplarich die Variable Adresse:

In das neue Modul:
Public Adresse as String
'....usw...

Dort könntest Du auch Deine Funktion /Sub zum einlesen unterbringen, falls erforderlich.
Bsp.: (Wenn Adresse zwar immer aus A2 aber jedesmal aus einem anderen Blatt gelesen werden soll)
Public Sub LiesVariablen(ausBlatt as String)
With ThisWotkbook.WORKSHEETS(ausBlatt)
Adresse = .Range("A2")
'nächsteVaribale = .Cells(3,1) 'Aus A3
'usw....
end with



Aufrufen kannst Du dann diese Prozedur aus jedem Modul heraus, auch aus Formularen heraus . Bsp. Aufruf über einen Button mit

Sub cmdEinlesen_Click()
LiesVariablen "Tabelle1"
End Sub

Beverly
31.08.2017, 14:08
Hi,

deklariere die Variablen als Public in einem allgemeinen Modul (dann stehen sie in allen Codemodulen zur Verfügung) und belege sie z.B im Worksheet_Activate-Ereignis, wenn sich die Daten nicht während der Laufzeit ändern.

<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

Raphael-2017
01.09.2017, 08:09
Hallo Ihr 2,

vielen lieben Dank für Eure Hilfe.
Ich werde versuchen dies umzusetzen ... hatte mal wieder in eine völlig andere Richtung gedacht :-)

Spende an die K.K.Stiftung werde ich veranlassen.

Nochmals Danke für Eure Hilfe und Mühe

LG
Raphael