Systematische / synchrone Zellen-Verschiebung

Hallo, hoffe ihr könnt mir helfen.
Mein Anliegen scheint mir ein recht einfaches zu sein, dennoch habe ich keinen Schimmer wie es in Excel oder OpenOffice umzusetzen ist.

Ziel: Ich will eine Reihe von unzusammenhängender Zellen, also eine Mehrfachmarkierung, nach einem bestimmten Muster verschieben. Also z.B. jede selektierte Zelle um eine relative Einheit nach rechts und eine nach oben verschieben. That’s all.

Visuell veranschaulicht:
Vorher: http://img211.yfrog.com/i/zellenmove.jpg/
Nachher: http://img211.yfrog.com/i/zellenmove2.jpg/

Versuche ich so was mit Copy & Past, dann gibts eine Warnmeldung.
-OpenOffice: „Diese Funktion lässt sich nicht auf Mehrfachselektion anwenden.“
-Excel: „Die Ausführung dieses Befehls ist bei einer nicht zusammenhängenden Mehrfachmarkierung nicht möglich.
Wählen Sie nur einen Bereich auf einmal aus und führen Sie dann den Befehl erneut aus.“

Wer weiß Rat???
Dank geht voraus…

Clemens

Grüezi Clemens

Mein Anliegen scheint mir ein recht einfaches zu sein, dennoch
habe ich keinen Schimmer wie es in Excel oder OpenOffice
umzusetzen ist.

Ziel: Ich will eine Reihe von unzusammenhängender Zellen, also
eine Mehrfachmarkierung, nach einem bestimmten Muster
verschieben. Also z.B. jede selektierte Zelle um eine relative
Einheit nach rechts und eine nach oben verschieben. That’s
all.
Versuche ich so was mit Copy & Past, dann gibts eine
Warnmeldung.
-OpenOffice: „Diese Funktion lässt sich nicht auf
Mehrfachselektion anwenden.“
-Excel: „Die Ausführung dieses Befehls ist bei einer nicht
zusammenhängenden Mehrfachmarkierung nicht möglich.
Wählen Sie nur einen Bereich auf einmal aus und führen Sie
dann den Befehl erneut aus.“

Wer weiß Rat???

IN Excel kannst Du das IMO nur mit VBA-Programmierung erreichen, welche dann jede einzelne markierte Zelle ‚anfasst‘ und verschiebt.
Das kann dann wie folgt aussehen:

Public Sub Move\_Areas()
Dim rngZelle As Range
For Each rngZelle In Selection
 rngZelle.Cut Destination:=rngZelle.Offset(-1, 1)
Next rngZelle
End Sub

Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Hey Thomas,
danke für die klare, inhaltsreiche Antwort. Nicht dass ich mich davor scheuen würde im allgemeinen zu Programmieren, aber sich mit der Schnittstellenprogrammierung für PowerPoint vertraut zu machen erscheint mir dann doch aufwendig, zudem ich mit VBA wenig vertraut bin!

Bin ich denn der erste mit solch einem Anliegen?
Die Welt braucht doch ein Macro, welches erlaubt, nachdem man ein paar vertreute Zellen ausgewählt hat, man ein Fenster aufpoppen lassen kann, welches fragt um wieviele Einheiten die selektieren Zellen nach links/recht und nach oben/unten verschoben werden sollen - oder nicht?!?
Dürfte doch für einen Kenner ein Klacks sein (s. Thomas Code).
Wer erklärt sich bereit :wink:

Dankende Grüße,
Clemens

Hallo Clemens,

sich mit der Schnittstellenprogrammierung für PowerPoint
vertraut zu machen erscheint mir dann doch aufwendig, zudem
ich mit VBA wenig vertraut bin!

Uppsala, du willst mit Vba die Schnittstellen zu PP (was immer du da meinst) programmieren?
Oder meinst du damit Daten von Excel nach PP zu schaufeln?
Wie auch immer, in deiner Ausgangsfrage stand davon nix.

Die Welt braucht doch ein Macro, welches erlaubt, nachdem man
ein paar vertreute Zellen ausgewählt hat, man ein Fenster
aufpoppen lassen kann, welches fragt um wieviele Einheiten die
selektieren Zellen nach links/recht und nach oben/unten
verschoben werden sollen - oder nicht?!?

Klar, wenn 2 Milliarden Menschen so ein Makro brauchen und auch kaufen würden, so schreibe ich das sehr gerne, ist auch billig, nur 2€ pro Makrocode :smile:)
Normalerweise würd mir auch 1 € reichen, aber ich hab von anderen Neureichen gehört, ruckzuck ist die erste Milliarde weg *gg*
So hab ich dann noch eine Milliarde für Notzeiten.

Erstelle dir auf dem Blatt aus „Steuerelementtoolbox“ eine Befehlsschaltfläche.
Im VB-Editor füge eine Userform ein, worauf du zwei Textboxen und eine Befehlsschaltfläche erstellst.

Im Modul der betreffenden Tabbele:

Private Sub CommandButton1\_Click()
UserForm1.Show 0
End Sub

Im Modul der Userform:

Private Sub CommandButton1\_Click()
Dim rngZelle As Range
For Each rngZelle In Selection
 rngZelle.Cut Destination:=rngZelle.Offset(CInt(TextBox1.Value), CInt(TextBox2.Value))
Next rngZelle
Unload Me
End Sub

Gruß
Reinhard

Hallo Reinhard,
ich gebe zu, dass war eine etwas zu abgehobene Formulierung mit Schnittstellenprogrammierung. Ich meine damit nichts anderes als die VBA-(Bibliotheken-)Integration um Excel-macros zu schreiben und alle anderen Vorkehrungen die man so treffen muss, dass alles eingerichtet ist.
(Abgesehen davon habe ich ausversehen schlichtweg PowerPoint statt das gemeinte Excel geschrieben.)

Es bleibt also bei meiner Ausgangsfrage. Am liebsten will ich gar nicht programmieren, sondern es als eine selbstverständliche Anweisung im Programm integriert haben - aber das ist sie ja offensichtlich nicht.

Insofern hoffe ich auf intrinsisch motivierte Macro-Programmier, die durch reine Motivation und Überzeugung der Nützlichkeit eines solchen Macros den schätzungsweise wenige Stunden beanspruchenden Programmieraufwand aufbringen. Wenn überhaupt Stunden - vor allem nachdem die Grundlage hier bereits geschaffen worden ist.

Oder aber einen Link zum bestimmt bereits existierenden Macro hier posten :wink:

Da ich nämlich viele Stunden brauchen würde, bis ich mich überhaupt in diese Programmierwelt eingefunden habe, werde ich es anderenfalls (zumindest für dieses Mal) per Hand machen müssen…

Aber danke für den bisherigen Quellcode!!
Clemens

Hallo Clemens,

Insofern hoffe ich auf intrinsisch motivierte
Macro-Programmier, die durch reine Motivation und Überzeugung
der Nützlichkeit eines solchen Macros den schätzungsweise
wenige Stunden beanspruchenden Programmieraufwand aufbringen.
Wenn überhaupt Stunden - vor allem nachdem die Grundlage hier
bereits geschaffen worden ist.

*hmmh* Irgendwelche Programmierer sollen also für lau einige Stunden opfern um dir eine Lösung zu präsentieren?

Oder aber einen Link zum bestimmt bereits existierenden Macro
hier posten :wink:

Aha, in Google, metager usw. sollen die Programmierer auch such für dich?

Da ich nämlich viele Stunden brauchen würde, bis ich mich
überhaupt in diese Programmierwelt eingefunden habe, werde ich
es anderenfalls (zumindest für dieses Mal) per Hand machen
müssen…

Schlimm, schlimm.

Aber danke für den bisherigen Quellcode!!

Hat er nicht funktioniert? Wie/wo zeigte sich das?

Gruß
Reinhard

Reinhard, du scheinst mich misszuverstehen! Ich fordere hier rein gar nichts und weiß jegliche Hilfe zu schätzen.

Es soll auch niemand für mich suchen, dass habe ich schon selber erfolglos getan, nur wenn hier ein Experte Insiderwissen besitzt, dann kann er dieses ja teilen.

Im Übrigen gibt es viele ((Hobby-))Programmierer, wie ich einer bin (halt nur nicht im Bereich Excel/VBA), die nicht für Geld sondern für den allgemeinen IT-Fortschritt arbeiten bzw. einfach Spaß am Basteln haben. Ist ja auch nicht so, dass ich ein neues Excel programmiert haben möchte! Zudem der Quellcode unter anderem dank dir bereits überwiegend vorliegt.

Diesen Quellcode habe ich nicht testen können, weil mir dafür die entsprechende Softwareanschaffung und -einrichtung als auch Know-How fehlt!

Ich weiß, dass wenig Eigenarbeit von mir ausgeht - aber die werde ich erst dann leisten können, wenn ich mich eines Tages in die Macro-Programmierung reinarbeiten werde. Das beschriebene Macro bräuchte ich schon früher.

Grüezi Clemens

Bin ich denn der erste mit solch einem Anliegen?

Offenbar schon, ja… :wink:

Die Welt braucht doch ein Macro, welches erlaubt, nachdem man
ein paar vertreute Zellen ausgewählt hat, man ein Fenster
aufpoppen lassen kann, welches fragt um wieviele Einheiten die
selektieren Zellen nach links/recht und nach oben/unten
verschoben werden sollen - oder nicht?!?

Keine Ahnung - wenn Du es sagst— :wink:

Hier ist auch schon mal ein wenig Fehlerbehandlung eingebaut - schau dir mal an ob das so klappen will:

Public Sub Move\_Areas()
Dim rngZelle As Range
Dim lngZ As Long
Dim lngS As Long

 lngZ = Application.InputBox("Wie viele Zeilen soll die Markierung verschoben werden?" \_
 & Chr(10) & "negativer Wert ==\> nach oben" \_
 & Chr(10) & "positiver Wert ==\> nach unten", \_
 "Verschieben in Zeilen-Richtung", 0, Type:=3)

 lngS = Application.InputBox("Wie viele Spalten soll die Markierung verschoben werden?" \_
 & Chr(10) & "negativer Wert ==\> nach links" \_
 & Chr(10) & "positiver Wert ==\> nach rechts", \_
 "Verschieben in Spalten-Richtung", 0, Type:=3)
On Error GoTo ErrorHandler
 For Each rngZelle In Selection
 rngZelle.Cut Destination:=rngZelle.Offset(lngZ, lngS)
 Next rngZelle
ErrorHandler:
End Sub

Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

[done] Systematische / synchrone Zellen-Verschieb.
Ich hatte ja keine Ahnung, dass es Microsoft einem so extrem einfach macht, mit dem Excel-Proggen loszulegen. Ist ja alles schon eingerichtet und man muss lediglich das „Entwicklertool“ „Visual Basic“ öffnen, wo man dann im („DieseArbeitsmappe“-)Quellcodefenster entsprechenden Code einfügen muss. Per „Sub/UserForm ausführen (F5)“ (oder F8 fürs Debuggen) kanns ja dann schon los gehen (ohne notwendiger Compilierung)…
saucool 8)

Sry für dieses Unwissen, und vielen Dank für den Quellcode - Thomas, deiner funktioniert wie ich’s mir gewünscht habe !! :smile:
(paar unerklärliche Aussetzer hatte ich: paar wenige Zellen wurde nicht richtig/gar nicht verschoben oder gar stattdessen gelöscht - nicht genauer untersucht…)

THX!

(paar unerklärliche Aussetzer hatte ich: paar wenige Zellen
wurde nicht richtig/gar nicht verschoben oder gar stattdessen
gelöscht - nicht genauer untersucht…)

Moin Clemens,

kann an verbundenen Zellen liegen.

Nimm mal diesen Code:

Public Sub Move\_Areas()
Dim rngZelle As Range
Dim lngZ As Long
Dim lngS As Long
 lngZ = Application.InputBox("Wie viele Zeilen soll die Markierung verschoben werden?" \_
 & Chr(10) & "negativer Wert ==\> nach oben" \_
 & Chr(10) & "positiver Wert ==\> nach unten", \_
 "Verschieben in Zeilen-Richtung", 0, Type:=3)

 lngS = Application.InputBox("Wie viele Spalten soll die Markierung verschoben werden?" \_
 & Chr(10) & "negativer Wert ==\> nach links" \_
 & Chr(10) & "positiver Wert ==\> nach rechts", \_
 "Verschieben in Spalten-Richtung", 0, Type:=3)
On Error GoTo ErrorHandler
 For Each rngZelle In Selection
 rngZelle.Cut Destination:=rngZelle.Offset(lngZ, lngS)
 Next rngZelle
ErrorHandler:
**If Err.Number 0 Then  
 MsgBox "Zelle: " & rngZelle.Address & " " & Err.Number & Chr(10) & Err.Description  
 Err.Clear  
 Resume Next  
End If**  
End Sub

Gruß
Reinhard