Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1096to1100
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Marko verschieben modifizieren; Hallo Sepp

Marko verschieben modifizieren; Hallo Sepp
Lemmi
Hallo Sepp,
Hallo zusammen!
ich habe von Sepp ein Makro geschrieben bekommen, welches die Zeilen und Spalten mit Inhalt verschiebt.
Das Makro funktioniert soweit auch ganz gut!
Nun habe ich immer wieder Arbeitsblätter in dem ich Gliederungen in den Spalten und Zeilen eingebunden habe. Setzte ich die Gliederung in Funktion so werden Zeilen oder Spalteninhalte ausgeblendet.
Genau hier liegt das Problem sind Gliederungen eingebunden und Zeilen oder Spalten ausgeblendet so werden diese Inhalte überschrieben/ ignoriert!
Wie könnte das Makro angepasst werden um die Inhalte der ausgeblendeten Spalten und Zeilen zu berücksichtigen!
Mein Idealwunsch wäre es , wenn die Gliederung nicht zurück gesetzt werden müsste und die Ansicht so verbleibt wie sie ist!
**********************************************************************
' Modul: DieseArbeitsmappe Typ: Element der Mappe(Sheet, Workbook, ...)
' **********************************************************************
Option Explicit
Private Sub Workbook_Activate()
Application.OnKey "%{UP}", "'moveSelection ""up""'"
Application.OnKey "%{DOWN}", "'moveSelection ""down""'"
Application.OnKey "%{LEFT}", "'moveSelection ""left""'"
Application.OnKey "%{RIGHT}", "'moveSelection ""right""'"
End Sub
Private Sub Workbook_Deactivate()
Application.OnKey "%{UP}"
Application.OnKey "%{DOWN}"
Application.OnKey "%{LEFT}"
Application.OnKey "%{RIGHT}"
End Sub
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************
Option Explicit
Sub moveSelection(Direction As String)
Dim rng As Range, objTarget As Worksheet, objSh As Worksheet
Dim rngMove As Range
Dim lngFirstRow As Long, lngLastRow As Long, lngFirstCol As Long, lngLastCol As Long
Dim lngMove As Long, lngOld As Long, lngNew As Long
Dim lngStartRow As Long, lngStartCol As Long
Dim intMove As Integer
On Error GoTo ErrExit
GMS
lngStartRow = 6 'erste Zeile beim Spaltenverschieben - Anpassen!
lngStartCol = 4 'erste Spalte beim Zeilenverschieben - Anpassen!
Set rng = Selection
Set objTarget = rng.Parent
If LCase(Direction) = "up" Or LCase(Direction) = "down" Then
lngFirstRow = rng.Cells(1, 1).Row
lngLastRow = lngFirstRow + rng.Rows.Count - 1
ElseIf LCase(Direction) = "left" Or LCase(Direction) = "right" Then
lngFirstCol = rng.Cells(1, 1).Column
lngLastCol = lngFirstCol + rng.Columns.Count - 1
End If
With objTarget
If LCase(Direction) = "up" Then
If lngFirstRow = 1 Then GoTo ErrExit
lngMove = lngFirstRow - 1
lngOld = lngFirstRow - 1
lngNew = lngLastRow
intMove = -1
ElseIf LCase(Direction) = "down" Then
If lngLastRow = Rows.Count Then GoTo ErrExit
lngMove = lngFirstRow + 1
lngOld = lngLastRow + 1
lngNew = lngFirstRow
intMove = 1
ElseIf LCase(Direction) = "left" Then
If lngFirstCol = 1 Then GoTo ErrExit
lngMove = lngFirstCol - 1
lngOld = lngFirstCol - 1
lngNew = lngLastCol
intMove = -1
ElseIf LCase(Direction) = "right" Then
If lngLastCol = Columns.Count Then GoTo ErrExit
lngMove = lngFirstCol + 1
lngOld = lngLastCol + 1
lngNew = lngFirstCol
intMove = 1
End If
Set objSh = Worksheets.Add
If LCase(Direction) = "up" Or LCase(Direction) = "down" Then
.Range(.Cells(lngOld, lngStartCol), .Cells(lngOld, Columns.Count)).Copy objSh.Cells(1, lngStartCol)
Set rngMove = .Range(.Cells(lngFirstRow, lngStartCol), .Cells(lngLastRow, Columns.Count))
rngMove.Copy .Cells(lngMove, lngStartCol)
objSh.Range(objSh.Cells(1, lngStartCol), objSh.Cells(1, Columns.Count)).Copy .Cells(lngNew, lngStartCol)
.Activate
rng.Offset(intMove, 0).Select
ElseIf LCase(Direction) = "left" Or LCase(Direction) = "right" Then
.Range(.Cells(lngStartRow, lngOld), .Cells(Rows.Count, lngOld)).Copy objSh.Cells(lngStartRow, 1)
Set rngMove = .Range(.Cells(lngStartRow, lngFirstCol), .Cells(Rows.Count, lngLastCol))
rngMove.Copy .Cells(lngStartRow, lngMove)
objSh.Range(objSh.Cells(lngStartRow, 1), objSh.Cells(Rows.Count, 1)).Copy .Cells(lngStartRow, lngNew)
.Activate
rng.Offset(0, intMove).Select
End If
objSh.Delete
End With
ErrExit:
GMS True
Set objSh = Nothing
Set rng = Nothing
End Sub
Public Sub GMS(Optional ByVal Modus As Boolean = False)
Static lngCalc As Long
With Application
.ScreenUpdating = Modus
.EnableEvents = Modus
.DisplayAlerts = Modus
.EnableCancelKey = IIf(Modus, 1, 0)
If Not Modus Then lngCalc = .Calculation
If Modus And lngCalc = 0 Then lngCalc = -4105
.Calculation = IIf(Modus, lngCalc, -4135)
.Cursor = IIf(Modus, -4143, 2)
End With
End Sub

Gruß
Egbert

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Marko verschieben modifizieren; Hallo Sepp
07.09.2009 16:15:40
Björn
Hallo,
ohne das groß getestet zu haben:
Einfach alles einblenden, dann passiert doch nix, oder?
Also den Zustand abfragen, merken (in Variable speichern), alles einblenden, dann Verschiebe-Makro ausführen und am Ende den Ursprungszustand wiederherstellen.
Gruß
Björn
AW: Marko verschieben modifizieren; Hallo Sepp
07.09.2009 17:56:09
fcs
Hallo Egbert,
Hier mal eine Lösung, mit der du die aktuelle Ansicht speichern kannst, dann wird alles eingeblendet.
Nach den Verschiebeaktionen kannst du dann die Ansicht wieder herstellen.
Evtl. passt ja.
Ob du die Warnung in deine vorhandene Prozedur einbimdest muss du selber wissen.
Gruß
Franz
Sub moveSelection(Direction As String)
Dim rng As Range, objTarget As Worksheet, objSh As Worksheet
Dim rngMove As Range
Dim lngFirstRow As Long, lngLastRow As Long, lngFirstCol As Long, lngLastCol As Long
Dim lngMove As Long, lngOld As Long, lngNew As Long
Dim lngStartRow As Long, lngStartCol As Long
Dim intMove As Integer
On Error GoTo ErrExit
'Prüfung, ob Zellen ausgeblendet sind.
If Cells.SpecialCells(xlCellTypeVisible).Count  Cells.Count Then
MsgBox "Bitte erst Makro ""AnsichtSichern"" ausführen! " & vbLf & vbLf _
& "Zellverschiebung wurde nicht durchgeführt!"
GoTo ErrExit
End If
GMS
lngStartRow = 6 'erste Zeile beim Spaltenverschieben - Anpassen!
lngStartCol = 4 'erste Spalte beim Zeilenverschieben - Anpassen!
' Ab Hier dann dein restlicher Code zum Verschieben von Cell-Inhalten
ErrExit 'testZeile
End Sub
Sub AnsichtSichern()
Dim Spalte As Long, Zeile As Long
ActiveWorkbook.CustomViews.Add ViewName:="TestXXAnsicht", PrintSettings:= _
True, RowColSettings:=True
'Alle Gliederungsebenen einblenden
For Spalte = 1 To ActiveSheet.UsedRange.Column + ActiveSheet.UsedRange.Columns.Count
If Cells(1, Spalte).EntireColumn.OutlineLevel > 1 Then
Cells(1, Spalte).EntireColumn.ShowDetail = True
End If
Next
For Zeile = 1 To ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count
If Cells(Zeile, 1).EntireRow.OutlineLevel > 1 Then
Cells(Zeile, 1).EntireRow.ShowDetail = True
End If
Next
End Sub
Sub AnsichtWiederAnzeigen()
Dim intI As Long, bolGefunden As Boolean
For intI = 1 To ActiveWorkbook.CustomViews.Count
If ActiveWorkbook.CustomViews(intI).Name = "TestXXAnsicht" Then
ActiveWorkbook.CustomViews("TestXXAnsicht").Show
ActiveWorkbook.CustomViews("TestXXAnsicht").Delete
bolGefunden = True
Exit For
End If
Next
If bolGefunden = False Then
MsgBox "Es wurde keine Ansicht """ & "TestXXAnsicht" & """ gefunden!"
End If
End Sub

Anzeige
AW: Marko verschieben modifizieren; Hallo Sepp
07.09.2009 21:26:11
Lemmi
Hallo Franz,
..auch ein Ansatz!
....leider kann ich das nicht in VBA umsetzen und bin auf eure Hilfe angewiesen!
Wie sieht den das Makro, wenn alles in Folge abgearbeitet wird aus?
Gruß
Lemmi
AW: Marko verschieben modifizieren; Hallo Sepp
08.09.2009 04:45:13
fcs
Hallo Lemmi,
ich hab keine Ahnung, wie sich dein Move-Makro mit dem Einblenden aller Zellen verträgt.
Deshalb mein Vorschlag:
Bevor du anfängts Zellen hin- und herzujonglieren (warum auch immer?) speicherst du die aktuelle Ansicht.
Dazu das Makro "AnsichtSichern" starten, dass die aktuelle Ansicht speichert und alle Gliederungsstufen einblendet.
Nachdem du deine Verschiebe-Aktion abgeschlossen hast stellst du die ursprüngliche Ansicht mit "AnsichtWiederAnzeigen" wieder her.
Die beiden Prozeduren (Makros) "AnsichtSichern" und "AnsichtWiederAnzeigen" kopierts du im VBA-Editor in das gleiche Modul in dem dein Makro "MoveSelection" sich befindet.
Die Code-Zeilen
  'Prüfung, ob Zellen ausgeblendet sind.
If Cells.SpecialCells(xlCellTypeVisible).Count  Cells.Count Then
MsgBox "Bitte erst Makro ""AnsichtSichern"" ausführen! " & vbLf & vbLf _
& "Zellverschiebung wurde nicht durchgeführt!"
GoTo ErrExit
End If

fügst du an der Position in Prozedur "moveSelection" wie in meiner vorherigen Antwort.
Gruß
Franz
Anzeige
AW: Marko verschieben modifizieren; Hallo Sepp
07.09.2009 21:07:52
Lemmi
Hallo Björn,
alles richtig erkannt!
... kann man den Ablauf des Marks so verändern, das man die Prozedur gezwungenermaßen durchläuft?
Ich habe einfach häufiger große Tabellen. Hier muss ich einfach sicherstellen, das meine Datenzeilen und Spalten nicht verändert werden!
Eine Implementierung würde eben keine Fehler verursachen! (Programmsicherheit denn no body is perfect)
Gruß

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige