AW: Selection-Eigenschaft
01.01.2009 11:14:13
Vollmer
Hallo Jens und Gerd
Danke für Eure Hilfe erstmal. Mein eigentliches Anliegen ist es, die select-Anweisungen vollständig aus meinem Code zu verbannen (soweit möglich). Wenn das der Fall ist, kann ich Arbeitsblätter beliebig verstecken (ich weiss ja jetzt wie, nun auch per Code), ohne eine Fehlermeldung zu bekommen (wenn ein verstecktes Arbeitsblatt selektiert wird, bekommt man eine Fehlermeldung).
Ich poste mal den ganzen Code (bitte siehe unten, will Euch nicht mit den Details belasten; die Prozedur soll eine bestimmte Buchung, min 2 Zeilen, aus dem Arbeitsblatt "Entries" in das Sheet "EntryForm" kopieren, um es von da zu editieren):
Sub Movements_editentry()
geschw_anfang
Dim EntryNr As Integer
Dim Movements_RowOffset As Integer
Dim Entries_lastrow As Integer
Dim upper As Integer
Dim bottom As Integer
Dim Entries_ColumnOffset As Integer
'Filter must be gone
Sheets("Entries").AutoFilterMode = False
'Entries must be sorted
Range("Entries_EntryNr").Offset(1, 0).Sort Key1:=Range("Entries_EntryNr"), Order1:=xlAscending, _
Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
'Initialize variables
Sheets("Movements").Select
Movements_RowOffset = Selection.Row - Range("Movements_EntryNr").Row
EntryNr = Range("Movements_EntryNr").Offset(Movements_RowOffset, 0)
Entries_lastrow = Range("Entries_EntryNr").Offset _
(Rows.Count - Range("Entries_EntryNr").Row, 0).End(xlUp).Row
Entries_ColumnOffset = Range(Range("Entries_EntryNr"), Range("Entries_Text")).Columns.Count
'Find out top end of the entry
For upper = 1 To Entries_lastrow
If Range("Entries_EntryNr").Offset(upper, 0) = EntryNr Then
Exit For
End If
Next
If upper = 0 Then
upper = 1
End If
'Find out bottom end of the entry
For bottom = Entries_lastrow To upper Step -1
If Range("Entries_EntryNr").Offset(bottom, 0) = EntryNr Then
Exit For
End If
Next
'Copy the entry to EntryForm
'EntryNr
Range(Range("Entries_EntryNr").Offset(upper, 0), _
Range("Entries_EntryNr").Offset(bottom, 0)).Copy
Range("EntryForm_EntryNr").Offset(1, 0).PasteSpecial xlPasteValues
'Date
Range(Range("Entries_Date").Offset(upper, 0), _
Range("Entries_Date").Offset(bottom, 0)).Copy
Range("EntryForm_Date").Offset(1, 0).PasteSpecial xlPasteValues
'Account
Range(Range("Entries_Account").Offset(upper, 0), _
Range("Entries_Account").Offset(bottom, 0)).Copy
Range("EntryForm_Account").Offset(1, 0).PasteSpecial xlPasteValues
'Accname
Range(Range("Entries_Accname").Offset(upper, 0), _
Range("Entries_Accname").Offset(bottom, 0)).Copy
Range("EntryForm_Accname").Offset(1, 0).PasteSpecial xlPasteValues
'Base
Range(Range("Entries_Base").Offset(upper, 0), _
Range("Entries_Base").Offset(bottom, 0)).Copy
Range("EntryForm_Base").Offset(1, 0).PasteSpecial xlPasteValues
'Text
Range(Range("Entries_Text").Offset(upper, 0), _
Range("Entries_Text").Offset(bottom, 0)).Copy
Range("EntryForm_Text").Offset(1, 0).PasteSpecial xlPasteValues
Sheets("EntryForm").Select
geschw_ende
End Sub
Es geht wirklich NUR darum, die Zeile "Sheets("Movements").Select" zu vermeiden. Ich habe es schon mit With...End with probiert, das funkt aber nicht.
Die o.g. Prozedur soll ausgeführt werden, nachdem der Benutzer eine bestimmte Zelle im Sheet "Movements" markiert hat. Wenn ich nur mit Selection arbeiten würde, e.g.
Movements_RowOffset = Selection.Row - Range("Movements_EntryNr").Row
Ohne VORHER Sheets("Movements").Select auszuführen, nimmt die Prozedur die Selection eines anderen Sheets (hier vom Sheet "Entries").
Wie kann man generell per Code feststellen, welche Zelle(n) eines BESTIMMTEN Arbeitsblattes markiert sind? Gibt es nicht immer grundsätzlich EINE ActiveCell pro Arbeitsmappe (vielleicht würde das mein Problem lösen).
Lieber Gruss
Andreas