aximand
Goto Top

VBA Target.Cell - Verständnisfrage

Mahlzeit,

bei meinen weiteren Basteleien habe ich heute mit Target.Cells(n,m) bei dem Worksheet_SelectionChange hantiert.
Und da verstehe ich Target.Cells nicht bzw. hoffe das sich das richtig interpretiere.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Zeile As Long
Dim Spalte As Long
Zeile = Target.Row            'einfach so  
Spalte = Target.Column   'einfach so  
For Zeile = 1 To Target.Rows.Count
If Target.Column = 5 then
Target.Cells (Zeile,2).Value = "Irgendwas"  
next Zeile
End if

Also:
Wenn ich in Spalte 5 bin und von dem markierten Feld 1 nach unten ziehe und die Felder auffülle soll der in Target.Cells(Zeile,2).Value = "irgendwas sein.

Spalte = 5, Zeile = 3
Nach unten gezogen auf Spalte =5, Zeile =4 dann wird in Spalte 6 des Tabellenblatts ein Wert eingetragen.

Ist also Target.Cells(1,1) die aktuelle Zelle, also Cells(3,5) und dann Target.Cells(1,2) die Zelle daneben Cells(3,6), ähnlich wie bei der Offset-Funktion.

Das verwirrt mich ein bissel. Stehe ich nämlich in Zelle (3,5) also "Spalte E" und möchte etwas in "Spalte H" einfügen lassen, dann wäre "Cells nicht 3,8", sondern Target.Cells(1,3), also gleiche Zeile 1 und 3 Spalten weiter rechts?

Ist die Denkweise richtig?

Content-ID: 569493

Url: https://administrator.de/contentid/569493

Ausgedruckt am: 25.11.2024 um 10:11 Uhr

emeriks
emeriks 04.05.2020, aktualisiert am 05.05.2020 um 09:46:24 Uhr
Goto Top
Hi,
ich verstehe jetzt Dein Problem nicht. Bei dieser Funktion sind Selection und Target identisch.
Wenn Du von E3 nach E4 "mit dem Kreuz ziehst", dann sind Selection und Target $E$3:$E$4. Target.Row ist dann aber immer noch 3, weil Target ein Bereich ist und in einem ausgewählten Bereich immer eine Zelle den Fokus hat. Target.Column und Target.Row beziehen sich also auf die Zelle mit dem Focus, also jene, welche "mit dem Kreuz gezogen" wurde.

E.
Aximand
Aximand 06.05.2020 um 10:48:32 Uhr
Goto Top
Ich versuch es mal anders zu erklären:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Zeile as integer

If Target.Column = 5 Then
    For Zeile = 1 To Target.Rows.Count
    Target.Cells(Zeile, 3).Value = "Wert " & Zeile  
    Next Zeile
End If
End Sub

Ich bin in Spalte 5 und Zeile 5, also $E$5 und trage dort "Sascha" ein und ziehe den Bereich nach $E$8 runter. Somit füllt sich jede markeirte Zelle in Spalte B mit "Sascha"
Gleichzeitig greift "Wenn in Spalte 5 dann" schreibe in Zeile 1 bis Anzahl selektierter Zeilen (also hier im Bild 1 to 4) in Target.Cells(Zeile,3) den Wert "Wert" & Zeile. Wobei Zeile 1 dann natürlich die richtige Zeile 5 im Tabellenblatt wäre, weil das die erste markierte Zeile ist.

tabellenauszug

Das Ergebnis daraus ist, dass in Spalte B "Sascha" steht und in Spalte G "Wert1 - Wert4"

Daher die Frage nach dem Target.Cells. Ist Target.Cells(1,1) dann im Tabellenblatt Zeile5, SpalteE, (1,2) Zeile5, SpalteF, (1,3) Zeile5, SpalteG und (2,2) Zeile6, SpalteF? Würde ich Spalte B mit einem Target.Cells(1,-2) ansprechen, weil (1,0) = Spalte D und (1,-1) = Spalte C

So stellt sich mir das nämlich da.

Eigentlich will ich nur erreichen, dass wenn ich in Spalte B herunterziehe und die Werte auffülle in Spalte G in der jeweiligen Zeile etwas passiert.
Zum Beispiel, dass ein Wert aus einem Feld AC dergleichen Zeile die ersten 8 Ziffern abgeschnitten und in G eingetragen werden.
Wie würde ich dann auf den Wert in Spalte AC zugreifen.

Wenn das, was gerade vielleicht komisch läuft, aus einem reinem Zufall heraus funktioniert, dann würde ich mich über einen richtigen Lösungsansatz freuen, auf den ich dann weiter aufbauen kann.


Danke face-smile
emeriks
emeriks 06.05.2020 um 11:51:32 Uhr
Goto Top
Zum einen:
Spalte E oder B? "Sascha" steht im Screenshot in E.

Wenn Du eine Zelle innerhalb der Spalte mit dem + ziehst, dann hat "Target" nur eine Range von 1 Spalte. Wenn Du dann aber die Range mit Spalte 3 ansprichst, dann macht er einen Offset, ja, falls Du das meinst. Und weil das 1-basiert ist, ist also innerhalb der Range Spalte 3 zwei Spalten daneben.

Aber Du erreichst damit keine Reaktion auf "Wert mit dem + runterziehen" sondern einfach nur eine Reaktion auf die Auswahl einer Zelle in der Spalte E.
Ich vermute, Du willst eher auf die Änderung eines Zellwerts reagieren. Dabei ist es ja dann egal, ob der Wert manuell oder programmatisch hineingeschrieben oder kopiert wird, z.B. durch "mit + ziehen". Und da frage ich mich, warum Du das dann nicht über das Event abfängst, was Du in einer Deiner letzten Fragen schon benutzt hast:
Excel Worksheet Change - Wertänderung nicht wie gewünscht
Worksheet_Change

Übrigens:
Antwortest Du auch mal auf die Kommentare in diesen anderen Fragen und/oder schließt diese auch?
Aximand
Aximand 06.05.2020 um 12:15:50 Uhr
Goto Top
Danke für die fixe Rückmeldung,

ich versuche die Anfragen zu schließen, wenn ich das ausführlich getestet und vor allem auch kapiert habe face-smile Das ist leider nicht immer gegeben und der Zeitversatz ist immens. VBA mache ich nicht hauptberuflich (dann wäre ich auch grottenschlecht) und muss immer das lösen, was mir gerade auf den Tisch gelegt wird. Von daher kann mal eine Woche ins Land ziehen bis ich mich wieder dem Thema widme. Trotzdem danke für den Hinweis - da werd ich zukünftig drauf achten.

Zum eigentlichen Thema zurück:

In der anderen Anfrage, die du ansprichst ging es darum, dass ich nur eine einzige Zelle ändere und sich dann was ergibt. Das Target als Range mit nur einer Zelle war da irgendwie 'leichter' zu verstehen und zu händeln.
Mir war bis zu dem Zeitpunkt nicht klar, dass ich dich das "mit + ziehen" auch darin abarbeiten lassen kann. Ich hatte das so verstanden, dass das nur über SelectionChange geht, weil erst dadurch bekannt ist, dass es neue Werte in neuen Zeilen gibt.

Vielleicht denke ich auch einfach zu kompliziert oder eher generell falsch.
Aximand
Aximand 06.05.2020 um 13:07:04 Uhr
Goto Top
Jetzt nochmal bezüglich Worksheet_Change:

Vielleicht stell ich mich dumm an aber darin bekomme ich das nicht abgebildet was mit Worksheet_SelectionChange funktioniert:

tabellenauszug

Ich nehme Spalte AA den Wert 300, der zur Folge hat, dass Spalte BT mit "K" gefüllt wird und ziehe runter - BT füllt sich dann nicht. Einzeln geht das. Dazu der Code aus Worksheet_Change:
'' Füllen Kennzeichen Gr. Mawi-Abschluss  
If Target.Column = 27 Then 'Spalte AA  
For Zeile = 1 To Target.Rows.Count 'hier sollte der heruntergezogene Bereich stehen, also 4  
MsgBox Target.Rows.Count
        If Left(Target.Value, 3) = "200" Then  
        Target.Offset(0, 45).Value = "A"  
            ElseIf Left(Target.Value, 3) = "700" Then  
            Target.Offset(0, 45).Value = "E"  
            ElseIf Left(Target.Value, 3) = "100" Or Left(Target.Value, 3) = "300" Then  
            Target.Offset(0, 45).Value = "K"  
        End If
        ' Nach Zuweisung Gruppe MaWi-Abschluss das Feld Artikelart auf 3 numerische Zeichen kürzen. Hintergrund: Da steht sowas wie "100 Verkauf"  
        If Len(Target.Value) > 3 Then Target.Value = Left(Target.Value, 3)
        Next Zeile
End If

hm - ich teste weiter
143728
Lösung 143728 06.05.2020 aktualisiert um 13:33:59 Uhr
Goto Top
Papperlapapp, hättest du Code (Link s unten) den ich hier gepostet habe genommen wäre das schon damit alles abgefackelt und berücksichtigt, du durchläufst zwar jede Zeile aber in der Foreach Schleife sprichst aber nämlich immer Target falsch an, denn das ist ein Range-Objekt, das eben bei einem Event-Trigger aus mehreren Areas und Zellen bestehen kann, du aber sprichst immer nur die gleiche Zelle mit Target.Value an!: Also z.B. SO
Dim cell as Range
for each cell in Target
   ' tu was mit dem cell object  
    MsgBox cell.Address
Next
Guck es dir hier ab
Excel Worksheet Change - Wertänderung nicht wie gewünscht
emeriks
emeriks 06.05.2020 um 13:29:25 Uhr
Goto Top
Mal am Rande: Schau Dir mal "Select Case" an. Damit kann man solche Abfragen übersichtlicher gestalten, z.B.
Select Case Left(Target.Value, 3)
  Case "200"  
     Target.Offset(0, 45).Value = "A"  
  Case "700"  
    Target.Offset(0, 45).Value = "E"  
  Case "100", "300"  
   Target.Offset(0, 45).Value = "K"  
  Case Else
Wobei "Target.Value" hier schon ungut gewählt ist. Du meinst sicher "Target.Cells(1,1).Value".
emeriks
emeriks 06.05.2020 aktualisiert um 14:21:05 Uhr
Goto Top
Zitat von @Aximand:
Mir war bis zu dem Zeitpunkt nicht klar, dass ich dich das "mit + ziehen" auch darin abarbeiten lassen kann.
Ich habe das mal getestet. Das Ausfüllen über "+ ziehen" löst tatsächlich kein Worksheet_Change aus.
Aber über das SelectionChange ist auch keine Lösung, weil das ja auch dann schon eintritt, wenn Du nur in die Zelle klickst.
143728
Lösung 143728 06.05.2020 aktualisiert um 14:16:51 Uhr
Goto Top
Zitat von @emeriks:
Ich habe das mal getestet. Das Ausfüllen über "+ ziehen" löst tatsächlich kein Worksheet_Change aus.
Doch das tut es einwandfrei, hier nochmal mehrfach getestet (Office 2010-2019)!
Damit werden auch alle Zellen entsprechend berücksichtigt:
Excel Worksheet Change - Wertänderung nicht wie gewünscht

Screencast / Drag Event
emeriks
Lösung emeriks 06.05.2020 um 14:20:20 Uhr
Goto Top
Zitat von @143728:
Doch das tut es einwandfrei, hier nochmal mehrfach getestet (Office 2010-2019)!
Ja, hast recht. Keine Ahnung, was ich da getestet habe ...
Aximand
Aximand 07.05.2020 um 08:03:08 Uhr
Goto Top
Danke für die produktive und lebhafte Diskussion sowie die Anleitungen und Beispiele. Ich werde das testen und schließe die Frag erst einmal face-smile
Aximand
Aximand 07.05.2020 um 08:09:06 Uhr
Goto Top
Ähm ja, stimmt. Tut ganz gut nochmal mit Abstand drüber zu schielen.
Auch target.Offset ist falsch, da das dann (zeile,45) heissen müsste.

Danke!