Mahlzeit,
nachdem ich letzte Woche schon dachte die Sache wäre vom Tisch, kam Cheffe an: Ähm - ich hätte noch gerne ...
Letztlich ging es darum neue Abschnitte einfügen zu können und sich die Formeln anpassen.
Gelöst habe ich das nun selbständig
mit eine Combobox, die gefüllt wird in dem eine Funktion über die Zeile (2) rauscht und sich alle "Überschriften" wie Global to Global etc. einsammelt (ohne doppelte).
Bei Auswählen eines Items wird dann hinter dem Bereich ein Neuer angelegt, der genauso heißt wie der Vorgänger.
Damit sich die Formeln auch ja weiter aktualisieren hab ich als allerletzten Bereich ein Template angelegt.
Bei Auswahl von Template wird dann der neue Bereich unmittelbar davor angelegt.
Grundsätzlich funktioniert das alles, jedoch mit 2 "kleinen" Einschränkungen:
Zum einen kann ich das 1. angezeigte Item (hier Global to Global) nicht auswählen bzw. es reagiert nicht.
Wähle ich das 2. oder eins der folgenden funktioniert das ganze bzw. danach funktioniert auch das 1.
Ein unmittelbares hintereinander Auswählen des gleichen Item funktioniert auch nicht.
Warum?
Click- und Change Ereignisse habe ich beide wechselseitig ausprobiert, leider ohne Erfolg.
Beide zusammen führen interessanterweise zu einem doppelten Einfügen.
Das Zweite wäre das Aktualisieren der Combobox, das immer dann stattfinden solte, wenn ein Bereich hinzugefügt wurde.
Wie und Wohin?
Hier mal mein bisheriges Werk:
(Arbeitsmappe)
Visual Basic:
Private Sub Workbook_Open()
FillCombo
End Sub
(Tabelle2)
Visual Basic:
'Private Sub AddNewColumn_Click()
' sItem = ActiveSheet.AddNewColumn.Value
' InsertCol (sItem)
'End Sub
Private Sub AddNewColumn_Change()
sItem = ActiveSheet.AddNewColumn.Value
InsertCol (sItem)
End Sub
(Modul1)
Visual Basic:
Function FillCombo()
Dim rItems As Object
LCol = gLCol
area = Range("D2:" & LCol & "2").Value
Set rItems = CreateObject("scripting.dictionary")
For i = 1 To UBound(area, 2)
On Error Resume Next
If Len(area(1, i)) > 0 Then rItems.Add area(1, i), 0
Next
With ActiveSheet.AddNewColumn
.List = rItems.keys
.ListIndex = 0
End With
Set rItems = Nothing
End Function
Function InsertCol(sItem)
LEntN = gLEnt(sItem)
LEntA = gColA(LEntN)
IEntN = LEntN + 2
IEntA = gColA(IEntN)
cCol1 = LEntA
cCol2 = gColA(LEntN + 1)
dCol1 = IEntA
dCol2 = gColA(IEntN + 1)
If sItem = "Template" Then
IEntN = IEntN - 2
IEntA = gColA(IEntN)
cCol1 = gColA(IEntN + 2)
cCol2 = gColA(IEntN + 3)
dCol1 = LEntA
dCol2 = gColA(LEntN + 1)
End If
Application.ScreenUpdating = False
ActiveSheet.Cells(1, IEntN).Resize(1, 2).EntireColumn.Insert
With ActiveSheet
.Range(cCol1 & "1:" & cCol2 & "36").Copy
.Range(dCol1 & "1").PasteSpecial Paste:=xlPasteFormats
.Range(cCol2 & "5:" & cCol2 & "16").Copy
.Range(dCol2 & "5").PasteSpecial Paste:=xlPasteFormulas
.Range(cCol1 & "3:" & cCol2 & "3").Copy
.Range(dCol1 & "3").PasteSpecial Paste:=xlValues
.Range(cCol1 & "17").Copy
.Range(dCol1 & "17").PasteSpecial Paste:=xlValues
.Range(dCol1 & "2").Value = sItem
Application.CutCopyMode = False
Application.ScreenUpdating = True
.Range(dCol1 & "1").Select
End With
End Function
Function gLEnt(sItem)
For i = Cells(2, Columns.Count).End(xlToLeft).Column To 1 Step -1
If Cells(2, i) = sItem Then
CN = i
Exit For
End If
Next
gLEnt = CN
End Function
Function gLCol()
CN = ActiveSheet.Cells(3, Columns.Count).End(xlToLeft).Column
gLCol = gColA(CN)
End Function
Function gColA(CN)
gColA = Left(WorksheetFunction.Substitute(Cells(1, CN).Address, "$", ""), _
Len(WorksheetFunction.Substitute(Cells(1, CN).Address, "$", "")) - 1)
End Function
Grüße
opiwahn