Anzeige
Archiv - Navigation
1200to1204
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 Variablen zuweisen

Range einer Variablen zuweisen
Markus
Hallo,
stehe gerade auf dem Schlauch... Ich habe eine Tabelle, die nach Spalte F sortiert ist (in Spalte F befinden sich Kundennummern). Jede Zeile enthält Rechnungsdaten, in Spalte G stehen noch unsortiert die Rechnungsbeträge.
Ich möchte jetzt alle Rechnungsbeträge je "Kundennummerbereich" absteigend sortieren.
Die Daten beginnen ab Zeile 9.
Ich scheitere gerade daran, den Sortierbereich richtig zuzuweisen.
Hier mein Entwurf:
Sub SortiereKreditorenNachBetrag()
i = 9
tmpSortAnfang = Range(Cells(i + 1, 1))
tmpKIaktuell = Cells(i, 6).Value
Do While Cells(i + 1, 6)  ""
If tmpKIaktuell  Cells(i + 1, 6).Value Then
tmpSortEnde = Range(Cells(i, 7))
conSortierbereich = Range(tmpSortAnfang, tmpSortEnde)
Range(conSortierbereich).Sort Key1:=Range(conStartzelleSummeKosten2), _
Order1:=xlDescending, Header:=xlYes, OrderCustom:=1, MatchCase:=False, _
Orientation:=xlTopToBottom, DataOption1:=xlSortNormal
i = i + 1
tmpSortAnfang = Cells(i + 1, 1)
tmpKIaktuell = Cells(i, 6).Value
Else
i = i + 1
End If
Loop
End Sub

Eigentlich würde ich nur gern wissen, wie ich die Range richtig zuweise:
tmpSortAnfang = Range(Cells(i + 1, 1)) scheint jedenfalls nicht zu funzen...
Grüße
Markus
lass das Range() weg o.w.T
24.02.2011 17:55:39
Reinhard


tmpSortAnfang = Cells(i + 1, 1) (owT)
24.02.2011 17:56:13
Erich
Objektvariablen
24.02.2011 23:19:51
Rudi
Hallo,
werden normalerweise mit Set zugewiesen.
z.B.
Set tmpSortAnfang = Range(Cells(i + 1, 1))
Set tmpSortEnde = Range(Cells(i, 7))
Set conSortierbereich = Range(tmpSortAnfang, tmpSortEnde)
conSortierbereich).Sort Key1:= ....
Außerdem solltest du die angewöhnen, die Variablendeklaration mit Option Explicit zu erzwingen und dann natürlich alle Variablen auch korrekt zu deklarieren.
Gruß
Rudi
AW: Range einer Variablen zuweisen
25.02.2011 08:01:44
Markus
Hallo zusammen,
vielen Dank für die Hinweise bis hierher.
Leider funktionieren die Vorschläge nicht. Ich fasse mal kurz zusammen.
1. Bei
tmpSortAnfang = Cells(i + 1, 1)
wird der Variablen tmpSortAnfang nicht der Zellbereich, sondern der Zellinhalt zugewiesen. Ich möchte in dieser Variablen aber praktisch die "linke obere Ecke" des zu sortierenden Zellbereichs abspeichern. In tmpSortEnde will ich dann die "rechte untere Ecke" des zu sortierenden Zellbereichs speichern, um aus beiden dann den Sortierbereich in "conSortierbereich = Range(tmpSortAnfang, tmpSortEnde)" zu definieren.
Möglicherweise geht das auch weniger kompliziert als mein Ansatz, aber so habe ich mir das hergeleitet.
2. Bei der Variante von Rudi Maintaire mit der Objektvariablenzuweisung mit "Set" erhalte ich die Fehlermeldung
Die Methode 'Range' für das Objekt '_Global' ist fehlgeschlagen
Da stimmt also auch irgendetwas noch nicht 100 %.
Ich suche also leider immer noch nach einer Lösung... Hat jemand noch eine Idee?
Vielen Dank vorab.
Grüße
Markus
Anzeige
Problem mit Range-Methode
25.02.2011 09:07:22
Erich
Hi Markus,
wenn die Methode 'Range' ein Problem erzeugt, liegt das meist an Unklarheiten über das betroffene Sheet.
3 Fragen:
1. Welches Blatt ist zur Ausführungszeit gerade aktiv?
2. In welchem Blatt befindet sich der zu sortierende Bereich?
3. Wo steht der Code? (in einem allg. Modul, im Code einer Tabelle (welcher?), im Code der Mappe?)
(Ich setze hier voraus, dass das alles innerhalb einer Mappe passiert. Es könnten auch mehrere Mappen beteiligt sein.)
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
AW: Problem mit Range-Methode
25.02.2011 10:03:53
Markus
Hallo Erich,
1. Das Blatt, in dem die Werte stehen und in dem die Sortierung ausgeführt werden soll, ist zur Ausführungszeit aktiv.
2. s. 1.
3. Der Code steht in einem separaten Modul "Hilfsroutinen" innerhalb der Arbeitsmappe.
Es passiert also alles innerhalb einer Arbeitsmappe.
Grüße aus dem grauen Hürth.
Markus.
Anzeige
Set tmpSortAnfang = Cells(i + 1, 1) (owT)
25.02.2011 09:37:43
Erich
AW: Set tmpSortAnfang = Cells(i + 1, 1) (owT)
25.02.2011 10:05:52
Markus
in diesem Fall wird bei mir der Variablen tmpSortAnfang nicht der Bereich, sondern der Zellwert zugewiesen. Ich benötige aber den Bereich (der in diesem Fall der linken oberen Ecke des zu sortierenden Bereichs entspricht, der Bereich besteht also aus genau einer Zelle).
Grüße
Markus
Warum zum Teufel missachtest du Rudis...
25.02.2011 11:08:37
Luc:-?
…Vorschlag, Markus! :-X
Hättest du deine Variable ordentl deklariert, hättest du das Problem wohl kaum! Set macht da nicht unbedingt 'nen Range draus, denn die Standardeigenschaft einer Zelle ist nun mal Value, und das erhältst du ja auch.
Gruß Luc :-?
Sicher?
25.02.2011 12:21:07
Erich
Hi Luc,
"Hättest du deine Variable ordentl deklariert, hättest du das Problem wohl kaum!": Meine ich auch!
"Set macht da nicht unbedingt 'nen Range draus, denn die Standardeigenschaft einer Zelle ist nun mal Value,
und das erhältst du ja auch."
Das glaube ich so nicht - schau mal in die Mini-Testmakros, die ich gerade für Markus gepostet habe.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
Set tmpSortAnfang = Cells(i + 1, 1)
25.02.2011 12:18:12
Erich
Hi Markus,
"wird bei mir der Variablen tmpSortAnfang nicht der Bereich, sondern der Zellwert zugewiesen"
Das glaube ich nicht. Mit Set wird kein einfacher Wert zugewiesen, sondern ein Objekt (hier: ein Range).
Oder hast du vielleicht das "Set" grad mal weggelassen?
Probier mal aus- (auch für Luc):

'Option Explicit  ' hier absichtlich mal auskommentiert
Sub aaaa()
Set xxxx = Cells(1, 1)
MsgBox xxxx.Address    ' funzt!
End Sub
Sub dddd()
Dim xxxx As Long
Set xxxx = Cells(1, 1)  ' hier gibts einen Kompilierungsfehler
MsgBox xxxx
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
P.S.:
Wenn im Betreff "owT" oder Ähnliches steht, braucht man den Beitrag eigentlich gar nicht zu lesen,
ist eh ohne weiteren Text...
Anzeige
Das ist klar, Erich, aber ich hatte eher...
25.02.2011 19:54:18
Luc:-?
…andersherum gedacht. Allerdings würde das mit Deklarierung auch zu einer Fehlermeldung führen. Aber ohne…?! Könnte es nicht sein, dass dann Set fktt, wenn ein Range zugewiesen wird, aber an anderer Stelle das dann als gewöhnl Variant betrachtet wird, bei dem nun mal ein Wert im Vordergrund steht, also generell .Value verwendet wird. Immerhin ist ja so die Entscheidung darüber VBA überlassen worden und immer, wo's zu passen scheint, wird dann halt gleich .Value verwendet (1.Priorität). Sonst wäre es immer erst ein Objekt und .Value hätte 2.Priorität. Dummerweise kann man das dann auch nicht mehr steuern, allenfalls .Value erzwingen (idR unnötig), aber das ist hier ja gerade nicht gewollt. Dass zwingend das Objekt verwendet wird, kann wohl nur durch entsprd Deklaration erreicht wdn. Falls die Variable auch noch für andere Zwecke (als Variant) verwendet wird, ist dieses Verhalten schon vorpgmmiert (würde also deiner Rückfrage bzgl „Set vergessen“ entsprechen).
Fazit: Es ist also nicht besonders klug, VBA die alleinige Entscheidung über meine PgmAbsichten zu überlassen.
Aber möglicherweise steckt der Wurm, wie so oft, in einer ganz anderen Stelle…
Gruß+schöWE, Luc :-?
Anzeige
Unklarheiten?
25.02.2011 20:21:44
Erich
Hi Luic,
sicher stimmen wir darin überein, dass man immer sauber deklarieren sollte,
will man sich derartigen Ärger vom Hals halten.
Aber deinen folgenden Aussagen möchte ich doch widersprechen:
"Könnte es nicht sein, dass dann Set fktt, wenn ein Range zugewiesen wird, aber an anderer Stelle
das dann als gewöhnl Variant betrachtet wird, bei dem nun mal ein Wert im Vordergrund steht,
also generell .Value verwendet wird. Immerhin ist ja so die Entscheidung darüber VBA überlassen worden
und immer, wo's zu passen scheint, wird dann halt gleich .Value verwendet (1.Priorität).
Sonst wäre es immer erst ein Objekt und .Value hätte 2.Priorität. "
Wenn einer Variantvariablen ein Range mit Set zugewiesen wurde, ist in der Variablen ein Objekt gespeichert.
Die Variable hat den VarType Object.
Nicht in der Variablen gespeichert ist ein (eventuell vorhandener) Wert des Objekts.
Das Objekt kennt natürlich seinen Wert (wenn es denn überhaupt einen hat),
wie alle seine Eigenschaften und Methoden.
Dar VarType bleibt unverändert, solange der Variablen nichts anderes zugewiesen wird.
(Das wäre ja auch noch schöner...)
Es kann durchaus sein, dass statt des Objekts mal ein "Wert" erscheint - wenn "Wert" die
Standardeigenschaft des Objekts ist. Das heißt aber keineswegs, dass dann ein Wert
in der Variablen gespeichert wäre. Dort ist und bleibt das Objekt.
Debug.Print Cells(3,4) druckt den Inhalt (Wert) der Zelle, nicht die Zelle selbst.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
Naja, d.Diskussion hat sich ja nun als...
26.02.2011 11:49:55
Luc:-?
…gegenstandslos herausgestellt, Erich;
das kommt davon, wenn man nicht seiner Intention folgt, sondern ein Scheinproblem als echtes ansieht. Wer rechnet schon mit so etwas! Allerdings glaubte ich mich dunkel an eine gewisse VBA-Toleranz im Zusammenhang mit Set erinnern zu können, was das begünstigt hat. Aber nun können wir ja wieder beruhigt sein — alles hat doch seine gewohnte Ordnung…! ;-)
Gruß+schöWE, Luc :-?
Rückfrage
25.02.2011 13:44:33
Erich
Hi Markus,
beim Versuch, deinen Code etwas zu überarbeiten, bin ich über die Variable
conStartzelleSummeKosten2 gestolpert. Sie taucht im Sort beim Key1 auf:
Key1:=Range(conStartzelleSummeKosten2)
Was ist das für eine Variable? Welchen Wert hat sie?
Über dem nächsten Code, den du postest, sollte "Option Explicit" stehen... - dringend!
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Range einer Variablen zuweisen
25.02.2011 14:35:18
Markus
Hallo liebes Forum,
ein besonderes Hallo an Reinhard, Erich, Rudi - und "zum Teufel nochmal" auch an Luc! ;-))
Ich werde mich künftig bemühen, alle Variblen sauber zu deklarieren - auch wenn ich in der Hinsicht wohl ein eher fauler schlampiger Sack bin. ;-)
Es läuft jetzt - und lief wohl auch schon vorher. :-) Ich habe mich vom Debugger in die Irre führen lassen. Wenn ich mit der Maus zum Beispeil über die Variable lngSortAnfang fahre, zeigt mir der Debugger den Zellwert an - ich dachte aber, dass da auch der Zellbereich angezeigt wird, wenn die Variable als Object deklariert ist. Dem ist scheinbar nicht so.
@Erich: Die Variable conStartzelleSummeKosten2 ist eigentlich eine Konstante und stand noch versehentlich im geposteten Code - sorry für diese Ungenauigkeit.
Habt jedenfalls ganz lieben Dank für Eure Hinweise.
Bis zum nächsten Mal.
Grüße aus dem langsam aufklarenden Hürth.
Markus.
P.S. Ach ja, hier noch der Code, der bei mir jetzt funktioniert:
Option Explicit
Sub SortiereKreditorenNachBetrag()
Dim i As Integer, lngKIaktuell As Long, objSortAnfang, objSortEnde As Object, _
rngSortierbereich As Object
i = 9
Set objSortAnfang = Cells(i + 1, 1)
lngKIaktuell = Cells(i, 6).Value
Do While Cells(i + 1, 6)  ""
If lngKIaktuell  Cells(i + 1, 6).Value Then
Set objSortEnde = Cells(i, 41)
Set rngSortierbereich = Range(objSortAnfang, objSortEnde)
rngSortierbereich.Select
Selection.Sort Key1:=Range("AJ10"), Order1:=xlDescending, Header:=xlGuess _
, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
i = i + 1
Set objSortAnfang = Cells(i + 1, 1)
lngKIaktuell = Cells(i, 6).Value
Else
i = i + 1
End If
Loop
End Sub

Anzeige
Deklarationen besser sauberer
25.02.2011 17:43:45
Erich
Hi Markus,
saubere Deklarationen sehen ein wenig anders aus. :-)
"i As Integer"
i sollte Long sein - es gibt Zeilen mit großen Nummern, schau mal in
https://www.herber.de/forum/archiv/1200to1204/t1201407.htm#1201431
"objSortAnfang, objSortEnde As Object"
Damit dklarierst du objSortEnde als Object und objSortAnfang als Variant (da ohne Typangabe)
Das "As Object" dahinter bezieht sich nur auf die eine Variable, die davor steht, nicht alle Variablen in der Zeile!
"objSortAnfang As Object, objSortEnde As Object, rngSortierbereich As Object"
Warum deklarierst du die drei Variablen nicht als Ranges?
Die Namen könnten dann auch jeweils mit rng beginnen.
Noch eine Bemerkung zum Code:
Das Select bei
rngSortierbereich.Select
Selection.Sort ...
könntest du besser weglassen und ersetzen durch
rngSortierbereich.Sort ...
Ein Tipp:
Wenn du in VBA im Menü Extras - Optionen, Karte "Editor"
die Option "Variablendeklaration erforderlich" aktivierst,
schreibt der VBA-Editor automatisch "Option Explicit" als erste Zeile in jedes neue Modul.
Zu Option Explicit und dem Vorteil genauer Deklarationen schau auch mal z. B. hier: Hilfe zur Selbsthilfe
und hier:
http://www.online-excel.de/excel/singsel_vba.php?f=4
http://www.vbarchiv.net/faq/allg_optionexplicit.php
http://www.vb-seminar.de/vb_27.htm
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort und: Schönes Wochenende! :-)
Anzeige
Ha, Erich, weißt du was, was er uns...
25.02.2011 20:01:57
Luc:-?
…jetzt mitgeteilt hat vonwg Debugger-Täuschung und so, war eigentl mein 1.Gedanke, aber nein, das kann doch nicht sein! Das muss doch noch durch was Anderes verifiziert worden sein — dachte ich → denkste! Doch so! Deshalb steht in Gebrauchsanleitungen unter Fehlersuche bei E-Geräten wohl auch immer: 1. Prüfen, ob der Stecker in der Dose sitzt!
Gruß Luc :-?
Luc, ich habe auch nie behauptet...
28.02.2011 10:36:29
Markus
dass ich von Grund auf sauber arbeite, sondern eher "ergebnisorientiert" :-) - das liegt aber in erster Linie daran, dass ich VB(A) nie systematisch gelernt habe und nach dem Motto verfahre: Wenn es lüppt, dann is gut, und der Makroeditor ist mein bester Freund. :-)
Meistens klappt das für mich zufriedenstellend. Manchmal bin ich dann zu ungeduldig, und dann kommt so ein Murks dabei raus. Bei VBA ist es in der Tat oft so, dass ich manchmal nicht weiß, wo genau ich den Stecker finde um zu prüfen, ob er in der Dose sitzt. :-)
Zu meiner Entschuldigung sei gesagt: Ich bin kein Programmierer oder Coder. Ich hoffe, das Forum sieht mir das nach.
Daher um so mehr: Vielen Dank für Eure hilfreichen Hinweise!
Naja, halt eine Null-Diskussion mehr... :-> orT
28.02.2011 14:13:49
Luc:-?
Gruß Luc :-?
Erich: Nochmals vielen Dank...
28.02.2011 10:47:11
Markus
... für Deine ausführlichen Hinweise. Ich werde mich bemühen, das künftig zu beherzigen. Der Hinweis, i als Long zu definieren, ist besonders wertvoll. Auch darauf hätte ich wohl selbst kommen können. :-)
Du hast völlig recht, die Zeile rngSortiertbereich.Select könnte ich weglassen, ich hatte das so zu Kontrollzwecken aufgebaut, weil ich sehen wollte, ob wirklich der richtige Bereich sortiert wird.
Die Option "Variablendeklaration erforderlich" habe ich jetzt aktiviert. Danke auch für diesen Hinweis.
Die Vorteile einer expliziten Var.deklaration sind mir schon intuitiv bewusst, ich hoffe nur, dass mich das unter dem Strich nicht mehr Zeit kosten wird. :-)
So, nochmals vielen Dank für Eure Geduld und Unterstützung!
Grüße aus der mal wieder grauen Kölner Bucht.
Markus.

306 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige