Sonstiges > Offtopic

Excel-VBA: Logik-Problem

(1/2) > >>

TMC:
Hi,

ich habe in Excel-VBA ein kleines Logikproblem. Habe da folgende Function:


--- Code: ---Public Sub MoveColumn(iQuelle As Integer, iZiel As Integer, strTitle As String)

    If iQuelle < iZiel Then 'Spalte wird um mindestens 1 Zelle nach rechts verschoben
        Columns(iZiel + 1).Select
        Selection.EntireColumn.Insert
        Columns(iQuelle).Cut (Columns(iZiel + 1))
        If Not strTitle = "" Then Cells(1, iZiel + 1).Value = strTitle
        Columns(iQuelle).Delete
    End If

    If iQuelle > iZiel Then 'Spalte wird um mind. 1 Zelle nach links verschoben
        Columns(iZiel).Select
        Selection.EntireColumn.Insert
        Columns(iQuelle + 1).Cut (Columns(iZiel))
        If Not strTitle = "" Then Cells(1, iZiel).Value = strTitle
        Columns(iQuelle + 1).Delete
    End If

    If iQuelle = iZiel Then
        If Not strTitle = "" Then Cells(1, iZiel).Value = strTitle
    End If

    Cells(1, 1).Select
   
End Sub
--- Ende Code ---

Die Sub rufe ich auf mit:

--- Code: ---    iColAusgang = 3
    iColZiel = 6
    Call MoveColumn(iColAusgang, iColZiel, "3auf6")

--- Ende Code ---

Was passiert:
Excel geht zur Spalte 6, fügt eine neue Spalte ein (also zwischen Spalte 5 und 6), und verschiebt die Spalte 3 zur neu eigefügten Spalte 6 und löscht zum Schluss die leere Spalte 3.

Das klappt auch alles fein.

Nun möchte ich aber weitere Calls der Sub machen, also danach z.B. Spalte 37 in Spalte 3 verschieben, dann Spalte 4 zu Spalte 10 etc.

Nur habe ich ja im ersten "Call MoveColumn(iColAusgang, iColZiel, "3auf6")" die Spalte 3 verschoben, d.h. in der 3. Spalte (C) steht nun die 4.Spalte (D). D.h. ein Aufruf

--- Code: ---   iColAusgang = 4
    iColZiel = 10
    Call MoveColumn(iColAusgang, iColZiel, "3auf10")

--- Ende Code ---
klappt so nicht mehr, weil nun ein anderer Bezug vorliegt.

Wie kann ich intelligenterweise diese Spaltenverschiebung mitschreiben (Zähler erhöhen/verringern z.B.) und dies dann in die Public Sub einfliessen lassen?

Semeaphoros:
Wie wäre es, wenn Du statt absoluter Adressen Bereichsnamen verwendest? Die sollten das leisten, da sie sich bei solchen Umstellaktionen in der Regel mitbewegen (wenn sie nicht gerade selber von einer Löschung betroffen werden).

animate:
also ich würde bevor ich irgendwas verschiebe erst die komplette Reihenfolge ermitteln und dann loslegen. Dann sollte das problemlos machbar sein.

Außerdem würde ich mit nem Range-Objekt arbeiten, um die Verschiebeaktionen durchzuführen, dann verliert der Benutzer nicht ungewollt seinen Inhalt im Clipboard.
Aber das ist Geschmackssache.

TMC:

--- Zitat von: Semeaphoros am 04.05.04 - 20:23:07 ---Wie wäre es, wenn Du statt absoluter Adressen Bereichsnamen verwendest? Die sollten das leisten, da sie sich bei solchen Umstellaktionen in der Regel mitbewegen (wenn sie nicht gerade selber von einer Löschung betroffen werden).
--- Ende Zitat ---
Da habe ich auch schon dran gedacht. Wenn man "normal" direkt ohne VBA Zellen kopiert, einfügt etc. werden diese Bezüge ja entsprechend in anderen Formeln mitgezogen (wenn nicht die $ verwendet werden also $A$3 z.B.).

Aber: Im VBA-Code steht diese A1 - Schreibweise doch fix drin? Oder gibt es da in VBA eine Möglichkeit?

TMC:

--- Zitat von: Thomas Völk am 04.05.04 - 20:30:06 ---also ich würde bevor ich irgendwas verschiebe erst die komplette Reihenfolge ermitteln und dann loslegen. Dann sollte das problemlos machbar sein.
--- Ende Zitat ---

Wie würdest Du das angehen?

Angenommen ich starte so:

iSpalteQuelle1 = 10
iSpalteZiel1 = 3
iSpalteQuelle2 = 5
iSpalteZiel2 = 8
iSpalteQuelle3 = 15
iSpalteZiel3 = 4
iSpalteQuelle4 = 11
iSpalteZiel4 = 18

Mein Ziel ist es - wenn ich dann mal was ändern muss an der Reihenfolge - dass ich das an einer zentralen Stelle machen kann.....





Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln