Es gibt noch weitere Alternativen als ein Ini-File.
Mit GetSetting() und SaveSetting() kann man diese mit Boardmitteln abspeichern (wird in der Windows-Regstry abgelegt). Das ist hauptsächlich dafür gedacht Einstellungen für ein späteres mal zu hinterlegen (z.B. die letzte Position einer UserForm).
Eine Weitere Möglichkeit ist, zusätzliche Werte in der Mappe zu speichern, ohne dass man diese jedoch auf einem versteckten Blatt unterbringen muss - per CustomXMLParts. Das funktioniert auch in Excel-AddIns (*.xlam).
Einfach gehaltenes Beispiel:
-> Kommt in ein Klassenmodul:
'Klasse: ValueStorage
Option Explicit
Private Const C_XML_NAMESPACE As String = "local::valueStorage"
Private Const C_VALUES_MAX As Long = 30
Private m_objValueStorage As Office.CustomXMLPart
Private Sub Class_Initialize()
Set m_objValueStorage = GetValueStorage()
End Sub
'liefert, und erstellt ggf. dabei, den Werte-Speicher
Private Function GetValueStorage() As Office.CustomXMLPart
Dim objParts As Office.CustomXMLParts
Set objParts = ThisWorkbook.CustomXMLParts.SelectByNamespace(C_XML_NAMESPACE)
If objParts.Count > 0 Then
Set GetValueStorage = objParts.Item(1)
Else
Set GetValueStorage = InitValueStorage()
End If
End Function
'erstellt den Werte-Speicher
Private Function InitValueStorage() As Office.CustomXMLPart
Dim objValueStorage As Office.CustomXMLNode
Dim i As Long
Set objValueStorage = ThisWorkbook.CustomXMLParts.Add("<valueStorage xmlns='" & C_XML_NAMESPACE & "'/>").SelectSingleNode("*")
For i = 1 To C_VALUES_MAX
Call objValueStorage.AppendChildNode("value", , , "")
Call objValueStorage.SelectSingleNode("value[last()]").AppendChildNode("ID", , msoCustomXMLNodeAttribute, CStr(i))
Next
Set InitValueStorage = objValueStorage.Parent
End Function
'liefert die Anzahl der gespeicherten Werte
Public Property Get ValueCount() As Long
ValueCount = m_objValueStorage.SelectNodes("//value").Count
End Property
'setzt den Wert anhand seines Index
Public Property Let Value(Index As Long, NewValue As Variant)
m_objValueStorage.SelectSingleNode("//value[@ID=" & Index & "]").Text = CStr(NewValue)
End Property
'liefert den Wert anhand seines Index
Public Property Get Value(Optional Index As Long) As Variant
If Index = 0 Then
Dim objValues As Office.CustomXMLNodes
Dim i As Long
Set objValues = m_objValueStorage.SelectNodes("//value")
If objValues.Count > 0 Then
ReDim vntValues(1 To objValues.Count)
For i = 1 To objValues.Count
vntValues(i) = objValues(i).Text
Next
Value = vntValues
Else
Value = Split(vbNullString)
End If
Else
Value = m_objValueStorage.SelectSingleNode("//value[@ID=" & Index & "]").Text
End If
End Property
-> Anwendungsbeispiel:
Option Explicit
Sub Test()
Dim objValStorage As ValueStorage
'Objekt der Klasse instanziieren
Set objValStorage = New ValueStorage
'zweiten Wert setzen
objValStorage.Value(2) = "Test1234"
'zweiten Wert abrufen
Debug.Print "[2] = "; objValStorage.Value(2)
'alle Werte abrufen (werden als Array zurückgegeben)
Debug.Print "[] = {'"; Join(objValStorage.Value(), "', '"); "'}"
Debug.Print "----- "; CStr(objValStorage.ValueCount); " values -----"
End Sub
|