2016-08-09 10 views
0

Ich habe ein Makro erstellt, das der aktuellen Auswahl ein Präfix hinzufügt. Es ist ziemlich einfach, wie Sie sehen können - es durchläuft sichtbare Zellen in der Auswahl. Ich fügte die .SpecialCells(xlCellTypeVisible) hinzu, weil es unbeabsichtigte Zellen beeinflusste, wenn Sie Filter verwendeten.Nicht ausgewählte Zellen sind betroffen, wenn Selection.SpecialCells (xlCellTypeVisible) verwendet wird.

Sub Prefix() 

Dim rng As Range 
Dim Prefix As String 
Prefix = "P" 

For Each rng In Selection.SpecialCells(xlCellTypeVisible) 
    rng = Prefix & rng 
Next rng 

End Sub 

Als Beispiel sei angenommen, dass meine Daten Cells A1:A4 dies aus wie gefüllt ist:

Title 
1 
2 
1 

Mein Problem tritt auf, wenn ich folgendes tun:

  1. ein Autofilter Setzen Sie auf den Bereich und verstecken Sie die '2', die in A3 ist
  2. Wählen Sie A2 (die erste '1')
  3. Führen Sie meinen Makro

Das Problem ist, dass statt nur Cell A2 zu beeinflussen (die ausgewählte Zelle), beginnt es das Präfix in der ersten Reihe der Anwendung (A1: Z1, etc.), bis ich das Makro abzubrechen. Es wird dies weiterhin zu tausenden von Zellen machen, wenn ich es weiter laufen lasse.

Dieses Problem tritt nicht auf, wenn meine Auswahl mehrere Zellen ist, oder wenn ich Selection statt Selection.SpecialCells(xlCellTypeVisible) verwende, oder wenn ich das Makro auf eine Zelle anwende, wenn nichts herausgefiltert (versteckt) wird.

Hat jemand irgendwelche Ideen, warum die Auswahl standardmäßig die gesamte Tabelle, wenn ich nur eine Zelle ausgewählt haben?
Alternativ kann jemand eine Möglichkeit vorschlagen, Präfixe wie diese mit VBA hinzuzufügen?

Ich bin mir bewusst, dass die Verwendung einer Excel-Formel das Problem lindern würde, aber das ist nicht praktisch für mich und ist nicht so schnell wie das Klicken auf ein Makro.

+1

Wahrscheinlich, weil Ihr Sub keine Ahnung hat, was die Auswahl ist, so dass es das ganze Blatt verwendet. Fügen Sie einen Bereichsparameter für den Bereich hinzu, in dem Sie arbeiten möchten, und übergeben Sie diesen an die Unterkomponente. Ersetzen Sie die Auswahl durch diesen Parameter und es sollte funktionieren. – dinotom

+0

Bitte erklären Sie, was Sie meinen, indem Sie den Bereichsparameter hinzufügen? Ich weiß, dass ich das Sub zu arbeiten auf Bereich ("a2: a4"). SpecialCells (xlCellTypeVisible) oder so ähnlich, aber ich möchte in der Lage sein, es für eine Auswahl zu verwenden, anstatt das Makro jedes Mal zu bearbeiten.Ich könnte auf 10 verschiedene Auswahl in einer Reihe, die nicht nebeneinander sind, also nicht die Zeit wert, um den Makrocode jedes Mal zu bearbeiten. – unknownengines

+0

Wenn Sie möchten, dass es so funktioniert, müsste es im Ereignis der Änderung der Arbeitsblattauswahl sein. Ich poste etwas kurz – dinotom

Antwort

0

Sie ‚Application.intersect‘ verwenden können, um Sie das gewünschte Ergebnis stellen Sie sicher, erhalten:

For each rng in Application.Intersect(Selection,ActiveSheet.Cells.SpecialCells(xlCellTypeVisible)) 
+0

Es muss noch wissen, welche Auswahl ist – dinotom

0

Wenn Sie wollen, dass diese dynamisch arbeiten, wenn Sie einen Bereich von Zellen manuell und Ihre Absicht wählen ist nur prepend zu Geben Sie den Ländercode aus dem Eingabefeld in den aktuellen Wert der Zelle ein, fügen Sie das unten angegebene Änderungsereignis dem Codeabschnitt Ihres Arbeitsblatts hinzu, und fügen Sie die Routine einem Codemodul in der Arbeitsmappe hinzu.

Nicht sicher, warum Sie das Minuszeichen ersetzen, aber Sie können es bei Bedarf zu diesem Code hinzufügen.

Arbeitsblatt Code:

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    Call AddPrefix(Target) 
End Sub 

ein Modul hinzufügen und diesen Code setzen in ihm.

Sub AddPrefix(rangeToPrefix) 
    Dim cCell As Range 
    Dim prefix As String 
    prefix = InputBox("Enter your country code", "Set Country Code", +33) 

    For Each cCell In rangeToPrefix.SpecialCells(xlCellTypeVisible) 
     If Not IsEmpty(cCell) Then cCell.Value = prefix & cCell.Value 
    Next cCell 
End Sub 
+0

Dies ist eine interessante Lösung. Dies ist ziemlich schwer zu aktivieren und zu deaktivieren, und erfordert ein wenig Arbeit für eine zweite Gelegenheit. Ich bemühe mich auch, es zu benutzen, ohne es manchmal zu entscheiden, die Änderung auf das ganze Arbeitsblatt anzuwenden (und damit zu übertreffen), scheinbar zufällig, aber vermutlich missbrauche ich es irgendwie. Ich denke, eine Alternative wäre die Verwendung meiner ursprünglichen Methode, aber mit einem 'If', das überprüft, ob' selection.SpecialCells (xlCellTypeVisible) 'einen Fehler erzeugt, und wenn dies der Fall ist, stattdessen' selection' zu verwenden. – unknownengines

+0

Der Code, den ich gepostet habe, sollte nur die Zellenwerte ändern, die Sie manuell mit der Maus auswählen (wodurch das selectionchange-Ereignis ausgelöst wird). Wenn eine Zelle leer ist, ändert sich der Wert nicht. – dinotom

Verwandte Themen