Anzeige
Archiv - Navigation
1544to1548
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

Makro mit Cursorpositionswechsel aufrufen

Makro mit Cursorpositionswechsel aufrufen
16.03.2017 15:55:50
Christian
Hallo Zusammen,
ich bin leider aufgrund meiner geringen VBA Kenntnisse auf ein Problem gestoßen.
Gerne würde ich mit der Positionsänderung des Cursors ein Makro aufrufen.
Da die Position Alt völlig variabel sein kann komm ich leider nicht auf die passende Lösung um dann mit einem Vergleich Position Alt zu Neu das gewünschte Ergebnis zu erzielen.
Hier mein VBA Code versuch:
Public Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim bln As Boolean
Dim Zeile As Integer
Dim Spalte As Integer
Spalte = ActiveCell.Column
Zeile = ActiveCell.Row
Dim rng As Range
Set rng = Range(Zeile, Spalte)
If Target.Address = rng.Address Then bln = True
If bln = True And Target.Address  rng.Address Then
Call Refresch
bln = False
End If
End Sub

Vielen Dank und Grüße
Christian

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Makro mit Cursorpositionswechsel aufrufen
16.03.2017 16:05:36
ChrisL
Hi Christian
Ein Change/Änderung Ereignis wird ja nur ausgelöst, wenn auch wirklich eine Änderung der Auswahl vorliegt. Insofern ist es unnötig mit der letzten Selektion zu vergleichen, um festzustellen ob die Selektion geändert wurde.
Falls es andere Gründe gibt, weshalb du die Adresse der letzten Selektions-Änderung zwischenspeichern willst, dann müsstest du eine Public Variable (ausserhalb der Prozedur) definieren.
cu
Chris
AW: Makro mit Cursorpositionswechsel aufrufen
16.03.2017 16:13:27
Christian
Hi ChrisL,
die Idee war wie folgt:
Cursor steht in Excel an Stelle (x,y) und bewegt sich durch drücken der Pfeiltasten an eine beliebige andere Stelle (xNeu,yNeu) aufgrund dessen soll ein bestehendes Programm erneut aufgerufen werden.
Gruß
Christian
Anzeige
AW: Makro mit Cursorpositionswechsel aufrufen
16.03.2017 16:17:07
Matthias
Hallo
Dann reicht aber das:
Option Explicit
Public Sub Worksheet_SelectionChange(ByVal Target As Range)
Call Refresch
End Sub
Gruß Matthias
AW: Makro mit Cursorpositionswechsel aufrufen
16.03.2017 16:31:01
Christian
Hallo Matthias,
das läuft so leider noch nicht.
Hier mal alle VBA codes:
Public Sub ChartVorschau()
'Bei Knopfdruck aus Ribbon aktivieren bis Knopf AUS gedrückt wird.
'Variablen deklarieren
Dim Zeile As Integer
Dim Spalte As Integer
Dim Werte As Integer
Dim i As Integer 'Anzahl der Werte bzw. max. 50 Stück
Dim AnzahlWerte As Integer
Dim AnzahlLetzteBefüllteZeile As Integer
Dim Anzahl_iO As Integer
Dim Anzahl_niO As Integer
Dim x As Integer 'Zeilenindex für die Position an der eingefügt werden soll
Dim ZuKopierendeZeile As Integer
Dim c As Integer 'Zeilenindex an der Position die kopiert werden soll
x = 9 'in diesem Zeilenindex befindet sich die Startposition
'Cursorposition feststellen um aus dieser Spalte die Werte zu übertragen
Spalte = ActiveCell.Column
Zeile = ActiveCell.Row
'überttrage Werte laut Cursorposition
Application.ScreenUpdating = False
ActiveSheet.Cells(8, Spalte).Copy 'Nennmaß
Sheets("ChartSource").Select
Range("B9").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Massblatt").Select
Cells(Zeile, Spalte).Select
'OTG festlegen
ActiveSheet.Cells(9, Spalte).Copy
Sheets("ChartSource").Select
Range("H7").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Massblatt").Select
Cells(Zeile, Spalte).Select
'UTG festlegen
ActiveSheet.Cells(10, Spalte).Copy
Sheets("ChartSource").Select
Range("I7").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Massblatt").Select
Cells(Zeile, Spalte).Select
'Letzte befüllte Zelle finden in der Spalte laut Cursor Position & iO und niO Werte  _
ausschließen
AnzahlLetzteBefüllteZeile = ActiveSheet.Cells(Rows.Count, Spalte).End(xlUp).Row - 16
Anzahl_iO = Application.WorksheetFunction.CountIf(ActiveSheet.Columns(Spalte), "i.O.")
Anzahl_niO = Application.WorksheetFunction.CountIf(ActiveSheet.Columns(Spalte), "n.i.O.")
'    MsgBox AnzahlLetzteBefüllteZeile
'    MsgBox ("Anzahl iO " & Anzahl_iO & _
'    " Anzahl niO " & Anzahl_niO)
AnzahlWerte = AnzahlLetzteBefüllteZeile ' - (Anzahl_iO + Anzahl_niO)
'    MsgBox AnzahlWerte
If AnzahlWerte  0
c = ZuKopierendeZeile - i
'      MsgBox c
ActiveSheet.Cells(c, Spalte).Select
If IsNumeric(ActiveSheet.Cells(c, Spalte)) Then
ActiveSheet.Cells(c, Spalte).Copy
Sheets("ChartSource").Select
Cells(x, 5).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Massblatt").Select
Cells(Zeile, Spalte).Select
i = i - 1
x = x + 1
Else
i = i - 1
End If
Loop
'Chart auf Messblatt anzeigen
Sheets("ChartSource").Select
ActiveSheet.ChartObjects("Diagramm 1").Activate
Application.CutCopyMode = False
ActiveChart.Location Where:=xlLocationAsObject, Name:="Massblatt"
ActiveSheet.ChartObjects("Diagramm 1").Activate
ActiveSheet.Shapes("Diagramm 1").Left = 10
ActiveSheet.Shapes("Diagramm 1").Top = 40
ActiveSheet.Shapes("Diagramm 1").Height = 200
ActiveSheet.Shapes("Diagramm 1").Width = 350
Sheets("Massblatt").Select
Cells(Zeile, Spalte).Select
End Sub

'Refresh bei Cursorbewegung
'vor dem Refresch Befehl "ChartSource" Range("E9:E58") leer machen.
'Bei Refresch Befehl Chart Übertragung überspringen
Public Sub Refresch()
ActiveSheet.ChartObjects("Diagramm 1").Activate
Application.CutCopyMode = False
ActiveChart.Location Where:=xlLocationAsObject, Name:="ChartSource"
ActiveSheet.ChartObjects("Diagramm 1").Activate
ActiveSheet.Shapes("Diagramm 1").Left = 500
ActiveSheet.Shapes("Diagramm 1").Top = 200
ActiveSheet.Shapes("Diagramm 1").Height = 200
ActiveSheet.Shapes("Diagramm 1").Width = 350
Range("E9:E58").Value = ""
Sheets("Massblatt").Select
Call ChartVorschau
End Sub

Public Sub Worksheet_SelectionChange(ByVal Target As Range)
Call Refresch
End Sub

Danke
Anzeige
AW: Makro mit Cursorpositionswechsel aufrufen
16.03.2017 18:45:06
ChrisL
Hi Christian
Es gibt spannendere Bücher zum Lesen, bitte wenigstens eine Beispieldatei dazu.
Ohne den Code genau studiert zu haben, meine ich folgenden Konflikt entdeckt zu haben. Die Selektion wird geändert, dadurch werden die beiden Makros, Refresh (von mir aus auch Refresch ;) und ChartVorschau abgespielt. Innerhalb dieser Makros änderst du erneut mehrfach die Selektion (liesse sich übrigens vermeiden, siehe diverse Archivbeiträge). Diese lösen dann wieder ein SelectionChange Ereignis aus usw. = Endlos-Schleife. Darum vorher die Events deaktivieren:
Public Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.EnableEvents = False
Call Refresch
Application.EnableEvents = True
End Sub
cu
Chris
PS: In Zusammenhang mit EnableEvents ist eine Fehlerbehandlung zu empfehlen, weil nach einem Abbruch bleiben die Events sonst ausgeschaltet. Quick & Dirty: "On Error Resume Next" oder...
On Error Goto ErrorHandler
Application.EnableEvents = False
Call Refresch
Application.EnableEvents = True
Exit Sub
ErrorHandler:
Application.EnableEvents = True
MsgBox "Fehler blabla"

Anzeige
AW: Makro mit Cursorpositionswechsel aufrufen
17.03.2017 09:14:10
Christian
Hallo ChrisL,
danke dir. Das werde ich ausprobieren.
Hier mal ne Test Datei:
https://www.herber.de/bbs/user/112240.xlsm
Gruß
Christian
AW: Makro mit Cursorpositionswechsel aufrufen
17.03.2017 09:45:10
ChrisL
Hi Christian
Das Change-Ereignis muss ins Modul der entsprechenden Tabelle (nicht in ein Standardmodul) und EnableEvents.
cu
Chris
AW: Makro mit Cursorpositionswechsel aufrufen
17.03.2017 11:20:56
Christian
Hallo ChrisL,
Danke dir für deinen Hinweis. :)
Ich habe eben noch wenig Erfahrung im Programmieren.
Das ganze läuft jetzt sauber Dank eurer Hilfe.
Gruß
Christian
AW: Makro mit Cursorpositionswechsel aufrufen
16.03.2017 16:12:43
Matthias
Hallo
Spätestens hier läuftst Du doch auf einen Fehler
Set rng = Range(Zeile, Spalte)
Was soll da rauskommen? Da müsstest Du Cells(Zeile, Spalte) benutzen.
Ist aber eh alles Quatsch
Schau Di mal den Debugger an!
$B$2 - $B$2 - Wahr
$A$2 - $A$2 - Wahr
$B$2 - $B$2 - Wahr
$A$2 - $A$2 - Wahr
$A$3 - $A$3 - Wahr
$B$3 - $B$3 - Wahr
$A$3 - $A$3 - Wahr
$B$3 - $B$3 - Wahr
$A$3 - $A$3 - Wahr
Da kommst Du nie zum Makro"Refresch" , weil
Target.Address ist immer auch rng.Address.
Probiers aus:
If Target.Address = rng.Address Then bln = True
Debug.Print Target.Address & " - " & rng.Address & " - " & bln
Gruß Matthias
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige