Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1044to1048
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

Range einer Variable zuweisen

Range einer Variable zuweisen
07.02.2009 08:42:07
Mario
Hallo
Ich wollte die selection.Range einer variablen zuweisen, damit ich danach die selection verändern kann und trotzdem noch weiss, was vorher selectiert war.
Ich habe schon folgende Varianten versucht:

Dim r As Range
r = selection.Range ''Fehlermeldung
r = Range(Cells(selection.Range.Row, selection.Range.Column), Cells(selection.Range.Row +  _
selection.Range.Count - 1, selection.Range.Column + selection.Range.Column.Count - 1)  '' _
Fehlermeldung
r = New Range(Cells(selection.Range.Row, selection.Range.Column), Cells(selection.Range.Row +    _
_
_
selection.Range.Count - 1, selection.Range.Column + selection.Range.Column.Count - 1)  '' _
Fehlermeldung
Set r = Range(Cells(selection.Range.Row, selection.Range.Column), Cells(selection.Range.Row +    _
_
_
selection.Range.Count - 1, selection.Range.Column + selection.Range.Column.Count - 1)  '' _
Fehlermeldung


Wenn ich


Set r = selection.Range

mache, wird ja nur eine Referenz darauf gemacht, das will ich aber nicht, da dann ja r auch verändert würde, wenn ich selection verändere. Deshalb will ich eine Kopie von selection.Range an die Variable zuweisen.
Wie kann ich das bewerkstelligen?

20
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Range einer Variable zuweisen
07.02.2009 09:00:00
Tino
Hallo,
so müsste es richtig sein.
Set r = Selection
Gruß Tino
AW: Range einer Variable zuweisen
07.02.2009 09:26:00
Nepumuk
Hallo Mario,
in Ergänzung zu Tinos Antwort:
1.

Deshalb will ich eine Kopie von selection.Range an die Variable zuweisen.


Du erstellst dabei keine Kopie, sondern nur eine Referenz. In der Objektvariablen befindet sich also nur die Adresse des Objektes im Arbeitsspeicher, nicht das Objekt selbst.
2.
Du machst das ganze ohne Prüfung. Wenn dein User ein Diagramm, ein Shape oder sonst irgendein Objekt in der Tabelle aktiviert hat, läufst du mit der Zuweisung auf einen Fehler. Also vorher prüfen, ob die Selection-Eigenschaft überhaupt ein Range-Objekt zurückgibt. Beispiel:

Public Sub Beispiel()
    
    Dim objCell As Range
    
    If TypeOf Selection Is Range Then
        
        Set objCell = Selection
        
        'Dein weiterer Code
        
    Else
        MsgBox "Keine Zelle ausgewählt", vbExclamation, "Hinweis"
    End If
End Sub

3.

r = New Range(Cells(selection.Range.Row,


Das kann mit New nicht funktionieren, da du kein Range-Objekt ohne Tabelle im Arbeitsspeicher erzeugen kannst. Mit New kannst du nur Objekte erzeugen, welche die entsprechende Automatisierungsschnittstelle besitzen. Soweit mir bekannt sind das nur das Application-Objekt und virtuelle Objekte (selbstdefinierte Klassen).
4.


Dim r As Range


Einzelne Buchstaben als Variablennamen zu benutzen ist zwar sparsam beim schreiben von Code, aber stell dir vor, deine Prozedur wird ein paar hundert Zeilen lang. Weißt du in Zeile 200 noch was r ist wenn du 50 Variablen benötigst?
Ließ mal hier: http://www.it-academy.cc/article/995/Ungarische+Notation+fuer+Visual+Basic.html
Gruß
Nepumuk

Anzeige
da ist noch was faul...
07.02.2009 09:33:00
Tino
Hallo,
ich glaube aber auch, dass da noch was anderes ist.
Weil überall selection am Anfang klein geschrieben ist und
das ist auch nicht normal.
Gruß Tino
AW: da ist noch was faul...
07.02.2009 09:38:21
Hajo_Zi
Hallo Tino,
das könnte vielleicht davon kommen das er ein Makro mit diesem Namen hat und das ist klein geschrieben.

dann wird es sowieso krachen. ;-)
07.02.2009 09:42:00
Tino
AW: dann wird es sowieso krachen. ;-)
07.02.2009 10:27:59
Mario
Danke für die zahlreichen Antworten!
Hier noch ein paar Klarstellungen:
  • selection habe ich klein geschrieben, da Excel es auch klein schreibt wenn ich ein Makro aufzeichne.

  • Der Variabelnname heisst nicht wirklich r ich habe den Code nur der übersichtlichkeitshalber auf das wesentliche gekürzt ;-).

  • Ich will ja genau eine Kopie von selection machen deshalb funktioniert ja Set objCell = Selection eben genau nicht, da ich nacher über alle Zellen der selection iterieren möchte und während der Iteration andere Zellen selektieren muss.

  • Eine Abfrage brauche ich nicht, da ich den Code nur benötige um eine Exceltabelle zu erstellen, die Tabelle selbst aber dann keine Makros enthalten soll.
    Ich schildere mein Problem mal etwas ausführlicher:
    Ich möchte eine Tabelle machen um Arbeitszeiten zu erfassen. Nun habe ich eine Zelle, in der steht ob es sich beim aktuellen Tag um einen Feiertag handelt oder nicht. Nun sollen die Zellen, in denen man die Arbeitszeiten angeben kann eine andere Farbe haben, wenn es sich um einen Feiertag handelt. Soweit funktioniert das auch alles super. Nun muss die bedingte Formatierung aber bei jedem Tag auf eine andere Zelle verweisen und wenn ich es kopiere und einfüge, wird das nicht wie bei Formeln automatisch angepasst. Da ich das nicht alles von Hand machen möchte, habe ich folgendes Makro erstellt:
    
    Sub CopyWeek()
    ' CopyWeek Makro
    Dim formatChanged As Boolean
    Dim rows As Range
    formatChanged = False
    rows = selection.rows '' Das funktioniert nicht. Und ich möchte hier KEINE Referenz  _
    zuweisen.
    For Each Row In rows
    For Each col In rw.Cells
    Dim addr As String
    Dim formula As String
    addr = col.Address
    If col.FormatConditions.Count >= 1 Then
    formatChanged = True
    formula = "=Z" + CStr(col.Row - 7) + "S" + CStr(col.Column) + "=1"
    Range("Z" + CStr(col.Row) + "S" + CStr(col.Column) + ":" + "Z" + CStr(col.Row +  _
    3) + "S" + CStr(col.Column)).Select
    selection.FormatConditions.Delete
    selection.FormatConditions.Add Type:=xlExpression, Formula1:=formula
    selection.FormatConditions(selection.FormatConditions.Count).SetFirstPriority
    With selection.FormatConditions(1).Interior
    .PatternColorIndex = 0
    .Color = 192
    .TintAndShade = 0
    .PatternTintAndShade = 0
    End With
    selection.FormatConditions(1).StopIfTrue = False
    End If
    Next cl
    If formatChanged Then
    Exit For
    End If
    Next rw
    End Sub
    


    Der Kalender in dem man die Daten eintragen kann ist in Wochen unterteilt. Nur brauche ich für ein Jahr ja ~50 Wochen, die ich aber nicht alles von Hand kopieren und die bedingte Formatierung anpassen möchte. Mit diesem Makro kann ich per CTRL C eine Woche kopieren und dann statt mit CTRL V mit Hilfe meines Makros am gewünschten Ort einfügen. Pro Tag sind jeweils 4 Zellen untereinander, die die bedingte Formatierung haben. Diese Maktro funktioniert soweit auch, bis auf mein Problem mit der Zuweisung der Range. Vielleicht hat ja auch jemand einen besseren Vorschlag, wie ich die Wochen vervielfältigen kann.

    Anzeige
    hättest Du vielleicht eine Beispieldatei? oT.
    07.02.2009 10:34:03
    Tino
    damit bin ich überfordert.
    07.02.2009 11:13:00
    Tino
    Hallo,
    sorry, mit dieser Datei bin ich überfordert.
    Bekomme zu viele Fehlermeldungen, diese bekomme ich übermorgen noch nicht zum laufen.
    Du darfst in Deiner Datei keine Namen verwenden die für VBA Reserviert sind.
    z. Bsp.
    Dim rows As Range
    oder
    For Each row In rows
    Deklarierungen sollten meiner Meinung nach immer im Kopf gemacht werden und
    nicht irgendwo dazwischen.
    Sorry, da kann ich nicht helfen, ich lass die Frage offen.
    Gruß Tino
    Anzeige
    AW: damit bin ich überfordert.
    07.02.2009 12:01:51
    Hajo_Zi
    Hallo Tino,
    mir scheint dann lag ich mit meiner Annahme Makro nicht so falsch. Es ist kein Makro sondern es es davon auszugehen das es eine Variable ist.
    Gruß Hajo
    AW: damit bin ich überfordert.
    07.02.2009 12:22:00
    Mario
    Hallo
    Eigentlich wollte ja nur wissen, wie ich eine Range einer Variable zuweisen kann und zwar nicht eine Referenz auf die Range sondern eine Kopie davon. Über den Rest meines Codes müsst ihr euch keine Gedanken machen der macht schon was ich will. Aber es muss doch möglich sein eine Range einer Variable zuzuweisen, in jeder anderen Programmiersprache die ich kenne ist dies problemlos möglich.
    Anzeige
    AW: sondern eine Kopie davon
    07.02.2009 12:28:00
    Gerd
    Hallo Mario,
    dann schreibe die Werte aus dem Range halt in ein Datenfeld.
    Gruß Gerd
    AW: damit bin ich überfordert.
    07.02.2009 12:43:24
    Mario
    Bevor ich die Datei hochgeladen habe, habe ich die variabelnnamen nochmal angepasst, damit es besser verständlich ist. Allerdings wusste ich nicht, dass der Compiler nicht caseSensitive ist. Hätte es aber vorher nochmal prüfen sollen, war mein Fehler. Selection kann ich übrigens gar nicht gross schreiben, der Compiler wandelt es automatisch in Kleinbuchstaben um, obwohl es sich dabei um Application.Selection handelt und nicht um eine Funktion. Ich habe es jetzt so gemacht, das ich die 1ste und letze Spalte und Zeile als Integer abspeichere und dann mit zwei For-Schleifen durch die Zellen iteriere. Ob dieser Umständlichkeit komme ich mir dabei ein bisschen vor als ob ich hier mit C arbeiten würde aber Hauptsache es funktioniert :-).
    Trotzdem Danke für eure zahlreichen Antworten.
    Anzeige
    Normal ist es auf alle Fälle nicht...
    07.02.2009 13:07:00
    Tino
    Hallo,
    , ich kenne dies aus keiner Excelversion.
    "der Compiler wandelt es automatisch in Kleinbuchstaben um"
    dann wirst Du irgendwo ein Add-In oder sowas haben,
    wo dies als Variable oder Function oder Sub verwendet wird.
    Gruß Tino
    AW: Normal ist es auf alle Fälle nicht...
    07.02.2009 13:15:55
    Mario
    Obwohl er es in Kleinbuchstaben umwandelt, kann ich so darauf zugreifen wie es sein sollte. Zum Teil werden auch Properties von Objekten in Kleinbuchstaben umgewandelt. Allerdings kann ich mich nicht erinnern, ein AddInn installiert zu haben und Makros habe ich zum ersten mal geschrieben, seit ich diese Excel Version installiert habe. Was ist denn das Problem an der Umwandlung in Kleinbuchstaben?
    Anzeige
    AW: Normal ist es auf alle Fälle nicht...
    07.02.2009 13:40:00
    Tino
    Hallo,
    wie meine Vermutung bestätigt,
    wenn ich zuvor eine solche Variable oder sowas verwende und diese danach lösche,
    wandelt der Kompilier diese immer in Kleinbuchstaben um.
    Ein Beispiel soll verdeutlichen, was basiert kann wenn man VBA Begriffe verwendet.
    Mach mal eine neue Datei und erstell in dieser ein Modul.
    In dieses machst Du mal diese Codezeilen.
    
    Sub TestSelection()
    Selection = 1
    End Sub
    'Function selection()
    ' selection = 1
    'End Function
    


    Wenn Du jetzt TestSelection ausführst, wird in die Selektierten Zellen die Zahl 1 geschrieben.
    Jetzt mache die Hochkommas bei der Function selection weg,
    jetzt wird selection überall klein geschrieben.
    Wenn Du nun TestSelection ausführst, passiert was ganz anderes und die eigentliche Funktion die hinter Selection steckt gibt es nicht mehr.
    Jetzt bekomme ich selection auch immer klein geschrieben, auch wenn ich die Funktion lösche,
    weil sich dass der Kompilier scheinbar merkt.
    Also Du stellst Dein ganzes VBA auf den Kopf und dies kann nur eine Zeitbombe sein,
    bis es irgendwann kracht und Du nicht mehr weist was vorn und hinten ist.
    Es gibt soviele Namen die man verwenden kann (braucht etwas Phantasie),
    dass man nicht die verwenden muss die für VBA Reserviert sind.
    Bin kein Ausbilder, aber ich denke die Botschaft ist verständlich.
    Gruß Tino

    Anzeige
    AW: Normal ist es auf alle Fälle nicht...
    07.02.2009 13:55:00
    Mario
    Mir ist schon bewusst, das man Begriffe einer Programmiersprache nicht als Variablennamen benutzen darf, allerdings wusste ich ja am Anfang nocht nicht, dass der Compiler die Gross/Kleinschreibung nicht beachtet. Ausserdem kenne ich ja noch gar nicht alle Keywords von VBA und wenn mich der Compiler nicht warnt, merke ich es auch nicht sofort wenn ich so einen Begriff verwende. Deshalb gibt es denn eine Möglichkeit diese Variablen wieder zu löschen oder muss ich dafür das System neu aufsetzen?
    AW: Normal ist es auf alle Fälle nicht...
    07.02.2009 14:05:19
    Tino
    Hallo,
    schreibe in den Kopf eines Moduls diese Zeile
    Public Selection
    Einmal die Entertaste danach drücken und diese Zeile wieder löschen.
    Gruß Tino
    Anzeige
    @Hajo
    07.02.2009 12:48:47
    Tino
    Hallo,
    ja ich nehme mal an so ist es, ich konnte die Variable bzw. das Makro nicht finden,
    dass die Kleinschreibung verursacht.
    Vermutlich war diese Variable oder dieses Makro die ganze Zeit in der Datei und
    wurde nachträglich gelöscht und daher die Kleinschreibung.
    Auf jedem Fall ist diese Datei eine Zeitbombe.
    Gruß Tino

    307 Forumthreads zu ähnlichen Themen

    Anzeige
    Anzeige
    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige