VBA: Indexnummer prüfen
#1
Hallo zusammen,

habe gerade ein kleines Problemchen:

Ich habe eine Datei, welche Einträge von unterschiedlichen Sportarten (sei es Ausdauer- oder Krafttraining als Beispiel) beinhaltet.

Diese Datei hat auch je Sportart ein Blatt, in welchem die Trainingspläne gespeichert sind.

Nun habe ich hinbekommen, dass die Pläne in einer UserForm ausgewählt und gelöscht werden können. Um den Programmieraufwand jedoch nicht für jede Sportart wiederholen zu müssen, würde ich dieses Vorhaben gerne "allgemein" gestalten und die Indexnummer der Tabellenblätter herausfinden - hier bräuchte ich Hilfe.

Ist es möglich zu prüfen, was der Index des gerade aktiven Blattes ist (also nicht der Name, welcher unten in den Reitern sichtbar ist, sondern die Indexnummer, mit welchem man die verschiedenen Blätter gezielt ansprechen kann (z.B. Tabelle10.Cells()...)?

Unten seht ihr meinen letzten Versuch, welcher fehlschlug:

Code:
If ThisWorkbook.ActiveSheet.Index = Tabelle10 Then
  Tabelle11.[...]   'hier passiert dann etwas mit Tabelle11 (dem Blatt mit den Trainingsplänen)
End If

Hatte eine Möglichkeit, den Namen des Blattes zu prüfen, was auch funktionierte, würde nur gerne der Konsistenz halber den Index ansprechen.

Danke für eure Vorschläge und wünsche euch einen schönen Samstag.

LG Domi
Antworten Top
#2
Moin!
Was hältst Du davon, mal eine Mappe mit Deinen Bemühungen hochzuladen?
Allgemein vorab:
Tabelle10.Cells könnte man auch mit Worksheets(10).Cells ansprechen.
Mir wäre dies jedoch (als Code) zu unsicher!
Wahrscheinlich (wie so oft) wäre es besser, alles in ein Blatt zu schreiben und eine Spalte für die Sportart zu "opfern".

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Antworten Top
#3
Guten Abend Ralf,

danke für deine schnelle Antwort.

Habe schnell schnell eine eine Beispiel-Datei erstellt, welche den Sinn hoffentlich etwas fassbarer macht.

Bei weiteren Fragen gerne melden :)

Gruß und Danke!
Domi


Angehängte Dateien
.xlsm   Beispiel Plan löschen.xlsm (Größe: 32,91 KB / Downloads: 8)
Antworten Top
#4
Hallöchen,

1) definiere in einem Module eine Variable: Public shAct As Worksheet
2) fülle diese Variable beim Click-Makro des Buttons: Set shAct = ActiveSheet
3) Nutze die Variable statt dem konkreten Blatt z.B.: statt Tabelle2 dann shAct, z.B. Set Suchbereich = shAct.Range("A:A")
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#5
Guten Morgen André,

danke für deine Antwort.

Werde es wohl so lösen.  19

Danke und guten Wochenstart,

Domi
Antworten Top
#6
Hallo Domi,

die (richtige) Antwort auf Deine Frage lautet

Sheets(ActiveSheet.Index + 1)

Der komplette Code des Userforms entsprechend angepasst und fehlerbereinigt sieht dann so aus:

Code:
Private Sub cmdAbbrechen_Click()
  'Schließt die UserForm "frmKrafttrainingPlanLaden"
  Unload Me
End Sub

'Löscht einen zuvor ausgewählten Trainingsplan
Private Sub cmdPlanLöschen_Click()
  Dim StartSuche As Long
  Dim EndeSuche As Long
  Dim Suchbereich As Range
  Dim StartLöschenA As Range
  Dim EndeLöschenA As Range
  Dim i As Long
  Dim z As Long
  Dim w As Long
 
  With Sheets(ActiveSheet.Index + 1)
    'Legt den Bereich fest, in dem nach dem Namen gesucht werden soll
    Set Suchbereich = .Range("A:A")
 
    'Legt die Variablen "StartSuche" und "EndeSuche" fest (die beiden Zellen, wo die Suche beginnt und aufhört)
    StartSuche = Suchbereich.Find(lboTrainingspläne, , xlValues, xlWhole, xlByRows, xlNext).Row
    EndeSuche = Suchbereich.Find(lboTrainingspläne, , xlValues, xlWhole, xlByRows, xlPrevious).Row
 
    'Gibt Rückfrage, ob der Plan wirklich gelöscht werden soll
    If MsgBox("Soll der ausgewählte Plan wirklich komplett und unwiderruflich gelöscht werden?", vbQuestion + vbYesNo, "Ausgewählten Plan wirklich löschen?") = vbYes Then
     
      'Legt die Variablen "StartLöschen" und "EndeLöschen" fest
      Set StartLöschenA = .Cells(StartSuche, 1)
      Set EndeLöschenA = .Cells(EndeSuche, 1)
   
      For i = StartSuche To EndeSuche
          .Range(StartLöschenA, EndeLöschenA).ClearContents
          z = z + 1
      Next i
      .Range(Rows(StartSuche), Rows(EndeSuche)).EntireRow.Delete
    Else
      Unload Me
      Exit Sub
    End If
  End With

  'Schließt das Eingabefenster nach dem Laden des Plans
  Unload Me
End Sub

Private Sub UserForm_Activate()
  Dim objTrainingspläne As Object               'Definiert "objTrainingspläne" als Object
  Dim lngZ As Long                              'Definiert "lngZ" als Long, um die erste genutzte Zeile zu finden
 
  If ActiveSheet.Index = Sheets.Count Then
    Unload Me
    Exit Sub
  Else
    'Definiert die Auswahlliste für die Combobox "Widerstand"
    Set objTrainingspläne = CreateObject("Scripting.Dictionary")
    With Sheets(ActiveSheet.Index + 1)
      For lngZ = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
        objTrainingspläne(.Cells(lngZ, 1).Value) = 0
      Next
    End With
    lboTrainingspläne.List = objTrainingspläne.keys
  End If
End Sub

Als Aufrufbuttons nimm besser die aus den Formularsteuerelementen, denen du dann allen dieses Makro zuweist, welches in ein allgemeines Modul kommt:

Code:
Sub PlanLoeschen()
  frmPlanLöschen.Show
End Sub

Gruß Uwe


Angehängte Dateien
.xlsm   Beispiel Plan löschen_Kuwer.xlsm (Größe: 39,47 KB / Downloads: 0)
Antworten Top


Gehe zu:


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