2016-04-19 7 views
2

HintergrundShop ganzes Format einer Zelle in einer Variablen

Ich mag eine einfache Funktion schreiben, die den Inhalt von zwei ausgewählten (nicht notwendigerweise benachbarten Zellen) austauscht. I nicht möchte die Zelle zuerst in eine temporäre Zelle kopieren. Daher möchte ich die Zellen wirklich tauschen.

Herausforderung

Während einfach swaping der Inhalt ist ziemlich einfach, indem eine Variant temporäre Variable unter Verwendung des Inhalts der Zelle 1 und überschreibt den Inhalt der Zelle 1 mit dem Inhalt der Zelle 2 und dann Schreiben Halten zurück Der Inhalt der Variant-Variable zu Zelle 2, ich habe Schwierigkeiten, auch alle Format-bezogenen Sachen zu kopieren. Es gibt viele Slots, die berücksichtigt werden müssen (.NumberFormat, .Interior, um nur zwei zu nennen). Muss ich wirklich jede davon separat kopieren oder gibt es eine einfachere Möglichkeit, das Format ohne mit einer temporären Zelle auszutauschen?

-Code

Public Sub SwapCells(Optional bolWithFormat As Boolean = True) 
    'Purpose: switch the content of two cells 
    On Error GoTo ErrHandler 
    Dim rngSel As Range 
    Dim varContent As Variant 
    Set rngSel = Selection 
    If (rngSel.Count = 2) Then 
     With rngSel.Cells(1) 
      varContent = .Value 
      .Value = rngSel.Cells(2).Value 
      rngSel.Cells(2).Value = varContent 
     End With 
    Else 
     'Do nothing, because swap makes only sense for exactly 2 cells 
    End If 
ErrHandler: 
    Set rngSel = Nothing 
End Sub 
+0

Aus der Spitze von meinem Kopf, würden Sie ein Objekt mit allen gleichen Eigenschaften benötigen ... und das ist eine Zelle. Es wäre schön, in der Lage zu sein, ein Speicher residentes Blatt, einen Bereich oder eine Zelle zu spezifizieren. – OldUgly

+0

Vielleicht ein * Stil *? – Raystafarian

+0

Afaik gibt es kein 'CellFormat'-Objekt oder ähnliches. Was ist Ihre Sorge gegen die Verwendung einer temporären Zelle irgendwo in Ihrem Arbeitsbuch? – Verzweifler

Antwort

3

Per die Kommentare, eine temporäre Haltezelle verwendet, ist viel die einfachste Lösung. Sie können eine Zelle in Ihrer Personal-Makro-Arbeitsmappe verwenden, um zu vermeiden, dass Sie in der aktiven Arbeitsmappe nach einer Ersatzzelle suchen. Es wäre wahrscheinlich ratsam, die Saved-Eigenschaft der persönlichen Arbeitsmappe anschließend auf True zu setzen, um zu vermeiden, bei jedem Beenden von Excel nach dem Ausführen des Makros dazu aufgefordert zu werden, dies zu speichern.

+0

Sehr gut. Um mehr über das 'Gespeicherte' Grundstück zu erfahren, als ich die Antwort nicht gelesen hatte, hätte ich noch mehr Zeit benötigt - perfekte und schnelle Antwort +1 – thothal

1

Nur für das Protokoll, hier ist der endgültige Code (gespeichert in meinem Personal.xlsb), die ich benutze:

Public Sub SwapCellsGeneral(Optional bolWithFormat As Boolean = False) 
    'Purpose: switch the content of two cells 
    'Use Personal.xlsb to use a temporary cell and copy paste 
    On Error GoTo ErrHandler 
    Dim rngSel As Range, rngTemp As Range 
    Dim varContent As Variant 
    Set rngSel = Selection 
    Set rngTemp = ThisWorkbook.Sheets(1).Cells(1, 1) 
    If (rngSel.Count = 2) Then 
     If (bolWithFormat) Then 
      rngSel.Cells(1).Copy rngTemp 
      rngSel.Cells(2).Copy rngSel.Cells(1) 
      rngTemp.Copy rngSel.Cells(2) 
     Else 
      With rngSel.Cells(1) 
       varContent = .Value 
       .Value = rngSel.Cells(2).Value 
       rngSel.Cells(2).Value = varContent 
      End With 
     End If 
    Else 
     'Do nothing, because swap make only sense for exactly 2 cells 
    End If 
ErrHandler: 
    'Set this to avoid asking if we want to save personal.xlsb 
    ThisWorkbook.Saved = True 
    Set rngSel = Nothing 
    Set rngTemp = Nothing 
End Sub 
Verwandte Themen