Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Konstante aus Zelle ermitteln und Wert zurückgeben

Konstante aus Zelle ermitteln und Wert zurückgeben
04.09.2018 10:26:08
Zacharias
Liebe Excel-Freunde,
ich würde gern Euren Sachverstand anzapfen:
Um in meinen Tools unabhängig von der Spaltenreihenfolge zu sein, bzw.
diese auch beliebig ändern zu können, gehe ich wie folgt vor:
Im Modul deklariere ich Spaltenköpfe(Header) als Konstanten ..
Const SP_NAME_FIRMA = "Firma"
.. und zugehörige Variablen, die später zeigen, in welcher Spalte sich der gesuchte Header befindet..
Dim spalte_Firma As Integer
Ermittelt wird das mit einer Funktion GetColumn:
spalte_Firma = GetColumn(SP_NAME_FIRMA, wksSearch)
Um im Entwicklungsstadium möglichst flexibel und schnell die Header in den jeweiligen worksheets anlegen/erweitern zu können, editiere ich die Zuordnung von Header zu Worksheet in dem sie angelegt werden sollen, in einem separaten Worksheet.
Spalte1		Spalte2
Header 		worksheet
Firma 		Projekte importiert
In der Sub UpdateHeader erzeuge ich dann die fehlenden Header:

With wksHeader
lngLastRow = .Cells(Rows.Count, 1).End(xlUp).Row
spalte_wksTarget = GetColumn(SP_NAME_WKS_TARGET_NAME, wksHeader)
For i = 2 To lngLastRow
strWksTargetName = .Cells(i, spalte_wksTarget)
Set wksTarget = ThisWorkbook.Worksheets(strWksTargetName)
intLastCol = wksTarget.Cells(1, Columns.Count).End(xlToLeft).Column
intTargetCol = intLastCol + 1
If ColumnExists(.Cells(i, 1), wksTarget) = False Then
wksTarget.Cells(1, intTargetCol) = .Cells(i, 1)
End If
Next i
End With

Nun meine Frage:
Ist es möglich, im Worksheet an Stelle der Zeichenkette "Firma" (die dem Wert der Konstanten SP_NAME_FIRMA entspricht), auch direkt den Namen der Konstanten SP_NAME_FIRMA zu benutzen?
Spalte1 	Spalte2
Header 		worksheet
SP_NAME_FIRMA 	Projekte importiert 
Ich suche also eine Möglichkeit, daß beim Aufruf von
If ColumnExists(.Cells(i, 1), wksTarget) = False Then
der Ausdruck .Cells(i, 1), "Firma" enthält, obwohl in der Zelle "SP_NAME_FIRMA" steht.
Es sollte also der Wert der Konstanten, auf Basis einer Zeichenkette in einer Zelle, die einer im Code deklarierten Konstanten entspricht, ermittelt werden.
Der Vorteil wäre, daß ich bei häufig vorkommenden Header-Änderungen, nur einmal Änderungen im Code vornehmen müßte und nicht an zwei Stellen.
Immerhin sind z.T. sehr viele Attribute (größer 100) zu verwalten.
Ich wünsche Euch einen sonnigen Tag und danke vorab schon einmal jedem, der sich mit der Fragestellung beschäftigt !
Zacharias

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
CallByName, heisst die Zauberfunktion! (owT)
04.09.2018 13:35:05
EtoPHG

AW: CallByName, heisst die Zauberfunktion! (owT)
04.09.2018 14:47:03
Zacharias
Hallo EtoPHG
mit Deinem Hinweis bin ich leider nicht ausreichend weitergekommen.
Ich habe nun in Zelle(5,1) SP_NAME_FIRMA stehen.
SP_NAME_FIRMA ist im Modul als Public Const SP_NAME_FIRMA = "Firma" deklariert
Die Hilfe schreibt:
Die CallByName-Funktion wird verwendet, um zur Laufzeit mit Hilfe einer Namenszeichenfolge
eine Eigenschaft einzustellen bzw. zu erhalten oder eine Methode aufzurufen.

Wie würde ich denn CallByName verwenden müssen, um den gewünschten beschriebenen Effekt zu erzielen?
Ich habe mal folgendes probiert:
MsgBox CallByName(Me.Cells(5, 1), "Value", VbGet)

Das liefert aber nur den .value der Zelle (an den man ja auch über .cells(5,1).value herankommt.
Da ich auf Basis eines Textes den Wert der deklarierten Konstante im Code "auslesen" will,
müßte ich da CallByName als Objekt vielleicht das VBA-Projekt selbst übergeben?
Irgendwie so ?
Set v = Application.VBE.VBProjects.Item(1).VBComponents....
MsgBox CallByName(v, Me.Cells(5, 1).Text, VbGet)
Hättest Du evtl. noch einen weiterführenden Hinweis?
Viele Grüße
Zacharias
Anzeige
Aber nur unter bestimmten Voraussetzungen, ...
04.09.2018 15:23:20
Luc:-?
…Hansueli & Zacharias!
Diese vbFkt als Ersatz der 3.AufrufArt nach CallByReference und CallByValue, CallByName, die in Basic ursprünglich nicht vorge­sehen war, verlangt ein Parent-Objekt des als Text übergebbaren Bezeichners einer Variablen, Konstanten bzw eines Proze­dur­Namens. Eine in einem normalen Modul global deklarierte Konstante bzw Variable hat kein solches. Eine in einem Klassenmodul deklarierte Konstante kann nicht public sein und ist deshalb ebenfalls nicht erreichbar. Das ist nur bei in einem (Dokument-)Klassen­modul public deklarierten Variablen möglich, weil sie im ganzen Projekt als Property des Klassenmoduls sicht- und erreichbar ist. Dem­zufolge müsste eine solche Variable bspw im Dokument-Klassenmodul der Mappe angelegt wdn. Dabei wäre auch zweckmäßig, den StandardNamen (interner CodeName) dieses Moduls, dt idR DieseArbeitsmappe, durch einen eindeutigen eigenen zu ersetzen, zB AmProjekte.
Beim Öffnen der Mappe kann deren öffentliche globale Variable mit der nicht-öffentlichen Konstante belegt wdn:
Option Explicit
Const K_SP_NAME_FIRMA$ = "Firma"
Public SP_NAME_FIRMA$
Private Sub Workbook_Open()
SP_NAME_FIRMA = K_SP_NAME_FIRMA
End Sub
Mit MsgBox CallByName(AmProjekte, .Cells(1, 1), VbGet) könnte dann der Wert der an dieser Stelle im angegebenen TabBlatt mit ihrem Namen notierten Variablen angezeigt wdn.
Gruß, Luc :-?
„Die Intelligenzmenge ist auf diesem Planeten eine Konstante, die Bevölkerung nimmt aber zu!“ Auch deshalb informieren mit …
Anzeige
Nachtrag:
04.09.2018 15:35:30
Luc:-?
Natürlich kann man in diesem Fall die Konstanten auch public global in einem normalen Modul deklarieren. Workbook_Open kann sie dort finden und ihre Werte seinen globalen Public-Variablen zuweisen.
Luc :-?
AW: Nachtrag:
04.09.2018 16:14:05
Zacharias
Hallo Luc ;-?
das hat prima geklappt !!!
Vielen Dank. Bevor Du geantwortet hattest, habe ich einen ähnlichen Tread bei herber entdeckt (https://www.herber.de/forum/archiv/1368to1372/1370472_Werte_von_eingebauten_Konstanten_abfragen.html),
in dem Du auch geantwortet hattest.
Aber Deine direkte Antwort hier, hat mir dann viel schneller geholfen.
Super was so alles machbar ist, da staune ich als als Nicht-Informatiker sondern Elektroing. immer wieder.
Auf diese Weise, bin ich in Zukunft viel flexibler, wenn's mal wieder um Tools mit vielen Attributen im Umfeld eines großen Autoherstellers der mit V beginnt und mit W endet ;-)
Danke vielmals!
Zacharias
Anzeige
Bitte sehr, gern geschehen! ;-) owT
04.09.2018 18:28:15
Luc:-?
:-?

312 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige