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

Forumthread: Auf Variable in VBA-Formel zugreifen

Auf Variable in VBA-Formel zugreifen
12.12.2016 12:03:26
Quacki
Hallo zusammen,
ich würde gerne eine Variable in Zelle N2 (Berichtsjahr) definieren. Über die VBA Programmierung möchte ich nunmehr die Zelle N2 auslesen und in einen Datenschnitt übertragen. D.h. konkret, ich gebe das Berichtsjahr "2015" vor und der Datenschnitt übernimmt diese dann und nimmt eine entsprechende Auswahl vor. Anhand meiner Formel will das aber nicht so richtig funktionieren.
Hier meine dafür erstelle Formel:

Sub Mitarbeiter()
' Mitarbeiter Makro
Dim Variable As Variant
Variable = Worksheets("Bericht").Range("N2").Value
ActiveWorkbook.SlicerCaches("Datenschnitt_Jahr").VisibleSlicerItemsList = Array _
( _
"[zwischentabellevorjahresvergleich].[Jahr].&[Variable]")
End Sub

Anzeige

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Auf Variable in VBA-Formel zugreifen
12.12.2016 12:52:33
Michael
Hallo!
Hantieren mit Pivot-Objekten ist meiner Erfahrung nach selten trivial. In Ermangelung einer Bsp-Datei Deinerseits hier eine Bsp-Mappe von mir: https://www.herber.de/bbs/user/109992.xlsm
Tabelle1 enthält die Spieldaten, Tabelle2 die Pivot-Tabelle, das Makro liegt im Modul1. Das Makro setzt einen Datenschnitt auf das Feld "Jahr" gemäß des Inhalts der Zelle "N2" in Tabelle1.
Der Code:
Sub a()
Dim i As SlicerItem
With ActiveWorkbook.SlicerCaches("Datenschnitt_Jahr")
.ClearManualFilter
For Each i In .SlicerItems
With i
If .Name = Worksheets("Tabelle1").Range("N2").Value Then
.Selected = True
Else: .Selected = False
End If
End With
Next i
End With
End Sub
LG
Michael
Anzeige
AW: Auf Variable in VBA-Formel zugreifen
12.12.2016 14:38:26
Quacki
Hallo Michael,
vielen vielen Dank für deine Hilfe.
Die Pivot entspringt einer PowerPivot Datenbank. Kann es sein, dass er deshalb hier hängen bleibt:
For Each i In .SlicerItems
"Anwendungs- oder Objektdefinierter Fehler"
AW: Auf Variable in VBA-Formel zugreifen
12.12.2016 15:18:32
Michael
Achso, PowerPivot... noch weniger trivial ;-)
Dann lagst Du prinzipiell schon richtig, aber Du hast falsch zusammengesetzt:
Sub b()
Dim Ds As String
Ds = Worksheets("Tabelle1").Range("N2").Value
ActiveWorkbook.SlicerCaches("Datenschnitt_Jahr").VisibleSlicerItemsList = Array( _
"[Tabelle1].[Jahr].&[" & Ds & "]")
End Sub
Passt?
LG
Michael
Anzeige
AW: Auf Variable in VBA-Formel zugreifen
13.12.2016 06:48:14
Quacki
Es funktioniert! Wirklich großartig. Ich bin dir sehr dankbar für deine Hilfe.
Eine letzte Frage in diesem Zusammenhang: Kann ich auch mehrere Filterkriterien vorgeben. In Zelle N2 kann ich jetzt ein Jahr vorgeben aber was ist, wenn ich zwei Jahre auswählen möchte?
AW: Auf Variable in VBA-Formel zugreifen
13.12.2016 09:27:56
Quacki
Habe etwas herumprobiert und es mit folgendem Befehl geschafft:
Dim Ds As String
Ds = Worksheets("Kosten_Pivot").Range("N2").Value
Dim De As String
De = Worksheets("Kosten_Pivot").Range("N6").Value
ActiveWorkbook.SlicerCaches("Datenschnitt_Jahr").VisibleSlicerItemsList = Array _
( _
"[zwischentabellevorjahresvergleich].[Jahr].&[" & Ds & "]", _
"[zwischentabellevorjahresvergleich].[Jahr].&[" & De & "]")
Anzeige
Ja, genau so! Freut mich, Danke fd Rückmldg., owT
13.12.2016 09:57:20
Michael
ein kleiner Haken
13.12.2016 10:13:46
Quacki
Allerdings gibt es einen kleinen Haken bei diesem Befehl, ich muss immer zwei Jahre vorgeben.
Manchmal benötige ich allerdings nur ein Jahr :/
AW: ein kleiner Haken
13.12.2016 12:22:33
Quacki
Über eine ordentliche if Kombination habe ich das Problem im Bereich der Kostenstellen wie folgt umgangen (allerdings nicht sonderlich elegant):
Sub Kostenstellen_anpassen()
Dim KST1 As String
KST1 = Worksheets("Kostenstellen_Region").Range("B3").Value
Dim KST2 As String
KST2 = Worksheets("Kostenstellen_Region").Range("B4").Value
Dim KST3 As String
KST3 = Worksheets("Kostenstellen_Region").Range("B5").Value
Dim KST4 As String
KST4 = Worksheets("Kostenstellen_Region").Range("B6").Value
Dim KST5 As String
KST5 = Worksheets("Kostenstellen_Region").Range("B7").Value
Dim KST6 As String
KST6 = Worksheets("Kostenstellen_Region").Range("B8").Value
Dim KST7 As String
KST7 = Worksheets("Kostenstellen_Region").Range("B9").Value
Dim KST8 As String
KST8 = Worksheets("Kostenstellen_Region").Range("B10").Value
Dim KST9 As String
KST9 = Worksheets("Kostenstellen_Region").Range("B11").Value
Dim KST10 As String
KST10 = Worksheets("Kostenstellen_Region").Range("B12").Value
Dim KST11 As String
KST11 = Worksheets("Kostenstellen_Region").Range("B13").Value
Dim KST12 As String
KST12 = Worksheets("Kostenstellen_Region").Range("B14").Value
Dim KST13 As String
KST13 = Worksheets("Kostenstellen_Region").Range("B15").Value
Dim KST14 As String
KST14 = Worksheets("Kostenstellen_Region").Range("B16").Value
Dim KST15 As String
KST15 = Worksheets("Kostenstellen_Region").Range("B17").Value
Dim KST16 As String
KST16 = Worksheets("Kostenstellen_Region").Range("B18").Value
Dim KST17 As String
KST17 = Worksheets("Kostenstellen_Region").Range("B19").Value
Dim KST18 As String
KST18 = Worksheets("Kostenstellen_Region").Range("B20").Value
Dim KST19 As String
KST19 = Worksheets("Kostenstellen_Region").Range("B21").Value
Dim KST20 As String
KST20 = Worksheets("Kostenstellen_Region").Range("B22").Value
Dim KST21 As String
KST21 = Worksheets("Kostenstellen_Region").Range("B23").Value
Dim KST22 As String
KST22 = Worksheets("Kostenstellen_Region").Range("B24").Value
If KST2 = "" Then
ActiveWorkbook.SlicerCaches("Datenschnitt_Kostenstelle").VisibleSlicerItemsList = Array _
( _
"[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST1 & "]")
GoTo Zeile1
Else
If KST3 = "" Then
ActiveWorkbook.SlicerCaches("Datenschnitt_Kostenstelle").VisibleSlicerItemsList = Array _
( _
"[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST1 & "]" _
, "[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST2 & "]")
GoTo Zeile1
Else
If KST4 = "" Then
ActiveWorkbook.SlicerCaches("Datenschnitt_Kostenstelle").VisibleSlicerItemsList = Array _
( _
"[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST1 & "]" _
, "[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST2 & "]" _
, "[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST3 & "]")
GoTo Zeile1
Else
If KST5 = "" Then
ActiveWorkbook.SlicerCaches("Datenschnitt_Kostenstelle").VisibleSlicerItemsList = Array _
( _
"[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST1 & "]" _
, "[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST2 & "]" _
, "[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST3 & "]" _
, "[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST4 & "]")
GoTo Zeile1
Else
If KST6 = "" Then
ActiveWorkbook.SlicerCaches("Datenschnitt_Kostenstelle").VisibleSlicerItemsList = Array _
( _
"[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST1 & "]" _
, "[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST2 & "]" _
, "[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST3 & "]" _
, "[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST4 & "]" _
, "[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST5 & "]")
GoTo Zeile1
Else
If KST7 = "" Then
ActiveWorkbook.SlicerCaches("Datenschnitt_Kostenstelle").VisibleSlicerItemsList = Array _
( _
"[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST1 & "]" _
, "[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST2 & "]" _
, "[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST3 & "]" _
, "[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST4 & "]" _
, "[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST5 & "]" _
, "[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST6 & "]")
GoTo Zeile1
Else
If KST8 = "" Then
ActiveWorkbook.SlicerCaches("Datenschnitt_Kostenstelle").VisibleSlicerItemsList = Array _
( _
"[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST1 & "]" _
, "[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST2 & "]" _
, "[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST3 & "]" _
, "[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST4 & "]" _
, "[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST5 & "]" _
, "[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST6 & "]" _
, "[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST7 & "]")
GoTo Zeile1
Else
If KST9 = "" Then
ActiveWorkbook.SlicerCaches("Datenschnitt_Kostenstelle").VisibleSlicerItemsList = Array _
( _
"[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST1 & "]" _
, "[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST2 & "]" _
, "[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST3 & "]" _
, "[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST4 & "]" _
, "[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST5 & "]" _
, "[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST6 & "]" _
, "[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST7 & "]" _
, "[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & KST8 & "]")
GoTo Zeile1
Zeile1:
End If
End If
End If
End If
End If
End If
End If
End If
MsgBox ("Fertig")
End Sub

Anzeige
Du könntest das auch so lösen...
13.12.2016 13:00:01
Michael
Quacki,
Sub a()
Const PRE As String = "[zwischentabellevorjahresvergleich].[Kostenstelle].&["
Const SUF As String = "]"
Const SEPP As String = ", "
Dim Wb As Workbook: Set Wb = ThisWorkbook
Dim Ws As Worksheet: Set Ws = Wb.Worksheets("Kostenstellen_Region")
Dim KstBereich As Range, a, i As Long, KSTs As String
With Ws
Set KstBereich = .Range("B3:B24")
a = Application.Transpose(KstBereich)
For i = LBound(a) To UBound(a)
If a(i)  vbNullString Then
KSTs = KSTs & PRE & a(i) & SUF & SEPP
End If
Next i
KSTs = Left(KSTs, Len(KSTs) - 1)
End With
With ActiveWorkbook.SlicerCaches("Datenschnitt_Kostenstelle")
.VisibleSlicerItemsList = Array(KSTs)
End With
End Sub
Ungetestet, aber vom Prinzip sollte es reichen.
LG
Michael
Anzeige
AW: Du könntest das auch so lösen...
13.12.2016 13:48:33
Quacki
Dies habe ich versucht. Allerdings erhalte ich hierbei einen Laufzeitfehler "Typen unverträglich"
With ActiveWorkbook.SlicerCaches("Datenschnitt_Kostenstelle")
.VisibleSlicerItemsList = Array(KSTs)
End With
AW: Du könntest das auch so lösen...
13.12.2016 14:19:58
Quacki
Wenn du mir hierbei nochmal behilflich sein könntest wäre das super nett.
Dann wäre ich mit meinem Vorhaben fertig!
Anzeige
Kann ich mir erst Freitag wieder anschauen...
13.12.2016 16:36:49
Michael
... Bin bis dahin nicht mehr im Forum!
Lg
Michael
Das reicht auch...
16.12.2016 08:27:51
Quacki
Danke schon mal!
AW: Das reicht auch...
16.12.2016 13:59:12
Michael
Hallo Quacki!
Da war ich auch schlampig; denn VisibleSlicerItemsList übernimmt die Parameterliste nicht als String; d.h. unsere schöne Verkettung bringt nix. Daher hier eine neue Version, welche die Datenschnitt-Parameter auch aus dem angegebenen Zellbereich übernimmt, aber in die Array-Form wandelt, die für VisibleSlicerItemsList gebraucht wird.
Bitte die PREfix-Konstante entsprechend Deiner Datei anpassen - ich musste das natürlich bei mir in "Tabelle1" testen.
Sub a()
Const PRE As String = "[Tabelle1].[Jahr].&["
Const SUF As String = "]"
Const SPL As String = ","
Dim Wb As Workbook: Set Wb = ThisWorkbook
Dim Ws As Worksheet: Set Ws = Wb.Worksheets("Kostenstellen_Region")
Dim KstBereich As Range, c As Range, i As Long, a, b
With Ws
Set KstBereich = .Range("B3:B24")
ReDim a(0 To KstBereich.Cells.Count)
For Each c In KstBereich
If c.Value  vbNullString Then
a(i) = PRE & c.Value & SUF & SPL
i = i + 1
End If
Next c
ReDim Preserve a(i)
End With
b = Split(Join(a, vbNullString), SPL)
ReDim Preserve b(UBound(b) - 1)
ActiveWorkbook.SlicerCaches("Datenschnitt_Jahr").VisibleSlicerItemsList = b
End Sub
Ist getestet und läuft in meiner (Test-) Umgebung einwandfrei. Rückmeldung würde mich freuen, war nicht ganz trivial.
LG
Michael
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Auf Variablen in VBA-Formeln zugreifen


Schritt-für-Schritt-Anleitung

Um auf eine Variable in einer VBA-Formel zuzugreifen und den Wert aus einer Zelle in einen Datenschnitt zu übertragen, kannst du folgende Schritte befolgen:

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Erstelle ein neues Modul:

    • Klicke mit der rechten Maustaste auf "VBAProject (DeineDatei.xlsx)".
    • Wähle "Einfügen" > "Modul".
  3. Füge den folgenden Code ein:

    Sub Mitarbeiter()
       ' Mitarbeiter Makro
       Dim Variable As Variant
       Variable = Worksheets("Bericht").Range("N2").Value
       ActiveWorkbook.SlicerCaches("Datenschnitt_Jahr").VisibleSlicerItemsList = Array _
       ( _
       "[zwischentabellevorjahresvergleich].[Jahr].&[Variable]")
    End Sub
  4. Stelle sicher, dass der Datenschnitt den Namen "Datenschnitt_Jahr" hat.

  5. Ändere den Wert in Zelle N2 auf das gewünschte Jahr und führe das Makro aus.


Häufige Fehler und Lösungen

  • Anwendungs- oder objektdefinierter Fehler: Dieser Fehler tritt häufig auf, wenn der Datenschnitt auf einer PowerPivot-Tabelle basiert. Stelle sicher, dass die SlicerItems korrekt referenziert werden.
  • Laufzeitfehler "Typen unverträglich": Dies kann passieren, wenn du versuchst, die VisibleSlicerItemsList mit einer falschen Datentyp-Übertragung zu setzen. Achte darauf, dass die Parameter in der richtigen Form übergeben werden.

Alternative Methoden

Eine alternative Methode, um mehrere Filterkriterien für den Datenschnitt zu definieren, besteht darin, die Werte aus verschiedenen Zellen auszulesen:

Sub FilterMultipleYears()
    Dim Ds As String
    Dim De As String
    Ds = Worksheets("Kosten_Pivot").Range("N2").Value
    De = Worksheets("Kosten_Pivot").Range("N6").Value

    ActiveWorkbook.SlicerCaches("Datenschnitt_Jahr").VisibleSlicerItemsList = Array( _
    "[zwischentabellevorjahresvergleich].[Jahr].&[" & Ds & "]", _
    "[zwischentabellevorjahresvergleich].[Jahr].&[" & De & "]")
End Sub

Praktische Beispiele

Hier ist ein Beispiel für ein komplexeres Szenario, bei dem mehrere Kostenstellen gefiltert werden:

Sub Kostenstellen_anpassen()
    Dim KSTs As String
    Dim KSTBereich As Range
    Dim c As Range

    Set KSTBereich = Worksheets("Kostenstellen_Region").Range("B3:B24")

    For Each c In KSTBereich
        If c.Value <> vbNullString Then
            KSTs = KSTs & "[zwischentabellevorjahresvergleich].[Kostenstelle].&[" & c.Value & "], "
        End If
    Next c

    KSTs = Left(KSTs, Len(KSTs) - 2) ' Entferne das letzte Komma und Leerzeichen
    ActiveWorkbook.SlicerCaches("Datenschnitt_Kostenstelle").VisibleSlicerItemsList = Split(KSTs, ", ")
End Sub

Tipps für Profis

  • Verwende Konstanten für häufig verwendete Strings, um den Code lesbarer zu machen:

    Const PRE As String = "[zwischentabellevorjahresvergleich].[Kostenstelle].&["
  • Überprüfe die Namen der Arbeitsblätter und Datenschnitte sorgfältig, um Tippfehler zu vermeiden.

  • Teste Deinen Code regelmäßig, um sicherzustellen, dass er in verschiedenen Szenarien funktioniert.


FAQ: Häufige Fragen

1. Kann ich auch Werte aus mehreren Zellen gleichzeitig verwenden?
Ja, du kannst mehrere Zellen auslesen und diese in einem Array für die VisibleSlicerItemsList verwenden.

2. Was mache ich, wenn ich einen Fehler beim Ausführen des Makros erhalte?
Überprüfe die Referenzen auf die Zellen und Datenschnitte, stelle sicher, dass sie korrekt benannt sind und dass die Zellen die erwarteten Werte enthalten.

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