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

Target.address für Excel 2007

Target.address für Excel 2007
13.09.2016 15:06:52
Olli
Hallo Zusammen
Benötige eine Hilfestellung bei folgendem Quellcode:
Möchte gerne nach Eingabe der Zelle D3 die Werte von Zelle G3 übernehmen. Wenn G3 leer ist dann ist Zelle D3 leer.
Quellcode funktioniert auch in Office 365 aber nicht in Excel 2007. Hier bekomme ich immer eine Fehlermeldung "Projekt oder Bibliothek nicht gefunden" und markiert mir die [ Klammer an.
Vielleicht habt Ihr einen Lösungsansatz für mich
If Target.Address = ("$D$4") Then
If [G3] "" Then [D3] = [G3]
'
If [G3] = "" Then [D3] = ""
'
End If
Gruß Olli

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Target.address für Excel 2007
13.09.2016 15:43:17
Luschi
Hallo Olli,
so sollte es in allen Excel-Versionen funktionieren:
If [G3].Value "" Then [D3].Value = [G3].Value
Gruß von Luschi
aus klein-Paris
AW: Target.address für Excel 2007
13.09.2016 16:25:39
Olli
Hallo Luschi
Das ist alles schon sehr seltsam.
Hatte Dein Quellcode sowie mein vorhandener Quellcode in einem neuen Sheet getestet und es funktioniert beides unter Excel 2007.
Hasst Du noch eine Idee wie ich das sonst noch umschreiben könnte?
Gruß Olli
'If Target.Address = ("$D$4") Then' ist so ...
13.09.2016 17:35:35
Luc:-?
…nicht erforderlich, Olli,
If Target.Cells(1).Address = "$D$4" Then oder If Target.Cells(1).Address(0, 0) = "D4" Then würde schon reichen (blau kann ggf entfallen). Man kann auch If Not Intersect(Target, Me.Range("D4")) Is Nothing Then schreiben.
Außerdem ist die evaluierende Schreibweise eines Range mit […] oft ungünstig und stets berechnungs­aufwendiger, weshalb du bspw auch das schreiben könntest:
If Me.Range("G3") "" Then Target.Offset(-1, 0) = Me.Range("G3")
Dabei gehe ich davon aus, dass es sich um eine Ereignis­Prozedur des Blattes handelt, in der Me dieses Blatt repräsentiert (und Range ohne Me. auch). Anderenfalls (Prozedur­Standort in allgemeinem Modul) muss Me. entfallen und Range bezöge sich dann auf das ActiveSheet.
.Value ist normalerweise optional, da es sich dabei ohnehin um die Default-Eigenschaft des Range-Objekts handelt (wird bei Fehlen einer Eigenschaft verwendet, falls es sich nicht um eine Objekt­Zuweisung handelt).
Gruß, Luc :-?
Besser informiert mit …
Anzeige
AW: 'If Target.Address = ("$D$4") Then' ist so ...
13.09.2016 19:06:49
Luschi
Hallo Luc,
Vba-Code sollte man lesen können wie ein Liebesroman (wo alles gesagt und ausführlich
beschrieben wird) und nicht wie ein Krimi (wo man durch Weglassen kleiner Details
schon mal in die Irre geführt werden kann).
Deshalb plädiere ich dafür, auch sogenannte Standard-Eigenschaften/Methoden hinzuschreiben.
Denn wer weiß schon, ob das in der nächsten Programmversion immer noch so ist.
Gruß von Luschi
aus klein-Paris
Ist ja auch nicht falsch, ...
13.09.2016 21:03:42
Luc:-?
…Luschi,
kann aber ins Auge gehen, wenn man einen Variant benutzt, der mal eine ZellReferenz (Objekt) und mal das Element eines Datenfeldes (ohne BereichsBezug!), also einen einfachen Skalar (Wert) benutzt. Wahrscheinlich haben die VB(A)-Entwickler bei der Festlegung der Default-Eigenschaft auch daran gedacht. Ich hatte das übrigens schon mal „auf der Pfanne“… ;-)
Gruß, Luc :-?
Anzeige
Dazu habe ich mal ein Code-Bsp geschrieben, ...
14.09.2016 15:07:59
Luc:-?
…Luschi:
Function VIndex(Bezug, Optional ByVal ElementNr = 0)
Dim isArr As Boolean, isRange As Boolean, ix As Long, vx
On Error Resume Next
isRange = TypeName(Bezug) = "Range"
If Not isRange Then isArr = IsArray(Bezug)
If isArr And CBool(ElementNr) Then
For Each vx In Bezug
ix = ix + 1: If ix = ElementNr Then Exit For
Next vx
If Not IsEmpty(vx) Then
If isRange Then Set VIndex = vx Else VIndex = vx
Else: VIndex = CVErr(xlErrNA)
End If
Else: If isRange Then Set VIndex = Bezug Else VIndex = Bezug
End If
End Function
Diese UDF kann in Analogie zu INDEX sowohl ZellBereiche als auch Datenfelder verarbeiten und gibt dann auch Bereichsbezüge oder Werte zurück. Allerdings ist sie als reine Demo auf Vektoren beschränkt, was zur Darstellung des Prinzips ja auch ausreicht.
Wenn man dort jetzt noch .Value unterbringen wollte, würde die UDF mit Datenfeldern nicht mehr fktionieren.
Einfachster Test in einer ZellFml:
• Für ganzen Bereich {=VIndex(A1:A5)}
• Für ganzes Datenfeld mit Texten bzw Zahlen …
… {=VIndex(""&A1:A5)} bzw {=VIndex(--A1:A5)}
• Für einzelne Werte aus Bereich =VIndex(A$1:A$5;ZEILE(A1))
• Für einzelne Werte aus Datenfeld mit Texten bzw Zahlen …
… =VIndex(""&A$1:A$5;ZEILE(A1)) bzw =VIndex(--A$1:A$5;ZEILE(A1))
Luc :-?
Anzeige
AW: Dazu habe ich mal ein Code-Bsp geschrieben, ...
14.09.2016 17:30:21
Daniel
HI
mag sein, dass es für sowas sinnvoll ist, die Voraussicht der MS-Programmierer zu nutzen und auf Defaulteigenschaften zurückzugreifen.
Wenn man jedoch mit eindeutigen Objekten arbeitet und eine bestimmte Eigenschaft verwenden will, dann ist es sinnvoll, diese auch zu benennen.
Gruß Daniel
In solchen Fällen wie gezeigt wird das Pgm ...
14.09.2016 19:31:11
Luc:-?
…einfacher (mache ich auch nur selten so) und universeller, Daniel,
und es steht zu vermuten, dass die MS-Pgmmierer das bei den meisten ursprünglichen Xl-Fktt (zB INDEX) auch (oder Analoges) getan hatten.
Gruß, Luc :-?
AW: Ist ja auch nicht falsch, ...
14.09.2016 22:45:05
Luschi
Hallo Luc,
früher habe ich auch versucht, alles in eine Funktion zu packen und unterschiedlichste Objekte zu übergeben.
C#-5.0/6.0 hat mich wieder runter gebracht und kurze knackige Methoden(Subs/Functions) sind jetzt angesagt.
Verschweigen sollte man dabei aber nicht, das durch die Möglichkeit des Überladens von Methoden und das "Prinzip von Delegates" es hier leichter ist, dieses Ziel zu erreichen.
Trotzdem ein interessanter Ansatz und ich bin gerade dabei, ein bischen zu testen.
Gruß von Luschi
aus klein-Paris
Anzeige
Auch das ist ja richtig, ...
15.09.2016 00:56:07
Luc:-?
…Luschi,
nur muss man dann für eine in ZellFmln einsetzbare UDF alle EinzelTeile unter einem Namen wieder zusammen­führen. Wenn man das in einem AddIn oder gar COM-AddIn stationiert, ist das ja auch kein Problem. Nur kann man so etwas kaum in einem Forum und auf einer WebSite auch nur als Komplett-DownLoad anbieten. Das macht dann beinahe noch mehr Arbeit, die idR bezahlt sein will. Also habe ich mich bei UDFs überwiegend auf All-in-one-Lösungen konzentriert. Ältere UDFs greifen schonmal aufeinander zu und es war eine ziemliche NachArbeit*, erst einmal festzustellen, welche davon betroffen sind und welche man dann - bei über­schau­barer Anzahl solcher Quer­Verbin­dungen - unbesorgt in einem eigenen Auszug-AddIn zusammenfassen kann.
* Musste dafür extra ein Doku-Pgm schreiben und für die dazugehörige CHM-Hilfe auch noch eine Fkt, die gekürzte Texte aus einer MsgBox-Schnell­Hilfe in ungekürzte für erstere transformiert, damit es etwas weniger (Neu-)BetextungsAufwand wird. Und das war längst nicht alles…
Ansonsten viel Erfolg! ;-)
Gruß, Luc :-?
Anzeige
AW: 'If Target.Address = ("$D$4") Then' ist so ...
14.09.2016 13:56:26
Olli
Hallo Luc
Wollte mal eine kurze Rückmeldung geben.
Hatte die Schreibweise mit If Me.Range("G3") "" Then Target.Offset(-1, 0) = Me.Range("G3") ausprobiert und da wurden mir die weitere Zellen durch Target.Offset ausgefüllt.
Zielführend war am Schluss folgender Zweizeiler mit Intersect ... is Nothing
If Not Intersect(Target, Me.Range("D4")) Is Nothing Then
If Me.Range("G3") "" Then Me.Range("D3").Value = Me.Range("G3")
Gruß Olli
AW: 'If Target.Address = ("$D$4") Then' ist so ...
14.09.2016 14:10:41
Daniel
Hi
im Change und Selection-Change-Event kann Target auch mehrere Zellen groß sein.
Gruß Daniel

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige