Excel 2013 VBA: Mal wieder Doppelklick
#1
Hallo verehrtes Forum,
würde gerne mal wieder um Eure Hilfe bei folgender Aufgabe bitten.

Ich habe eine Tabelle die folgendermaßen aufgebaut ist:

Tabelle1
ABC
11713
22814
33915
441016
551117
661218
7215793
8171

 verbundene Zellen
A8:C8

verwendete Formeln
Zelle Formel Bereich N/A
A7:C7=SUMME(A1:A6)
A8=SUMME(A7:C7)
Excel-Inn.de
Hajo-Excel.de
XHTML-Tabelle zur Darstellung in Foren, einschl. der neuen Funktionen ab Version 2007
Add-In-Version 21.01 einschl. 64 Bit


Bei einem Doppelklick in eine der Spalten, in Zeile 7, sollen automatisch alle Zellinhalte der Spalte aufaddiert werden.
Als zweite und bevorzugte Variante sollte bei einem Doppelklick in die verbundene Zelle A8:C8 in der jeweiligen darüberliegenden Zelle wiederum die Spaltensumme eingetragen werden und anschließend die Gesamtsumme aller Spalten in der verbundenen Zelle A8:C8 eingetragen werden.

Die Anzahl der Spalten kann aber variieren und somit auch die Länge der verbundenen Zelle z.B A8:J8

Vielleicht habt Ihr eine Idee wie man das mittels VBA umsetzen kann?

Vielen Dank!
Mit freundlichen Grüßen / Best regards
                          //
----------o00o---°(_)°---o00o----------------------

Erich
Antworten Top
#2
Hallo Erich,

vielleicht so?

Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

   Cancel = True
   If Not Intersect(Rows(7), Target) Is Nothing Then
      Target = Application.WorksheetFunction.Sum(Target.Offset(-6).Resize(6))
   End If
   If Target.Address(0, 0) = "A8" Then
      Target = Application.WorksheetFunction.Sum(Cells(7, 1).Resize(, Cells(7, 1).End(xlToRight)))
   End If
End Sub
Gruß Stefan
Win 10 / Office 2016
[-] Folgende(r) 1 Nutzer sagt Danke an Steffl für diesen Beitrag:
  • sharky51
Antworten Top
#3
Moin,

ich habe das etwas anders verstanden. Darum meine Version, die automatisch die belegten Spalten berechnet:


Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  Dim lCol As Integer
  Dim rngZe7 As Range, rngZe8 As Range, c As Range
 
  lCol = Cells(1, Columns.Count).End(xlToLeft).Column
  'Alternative, falls Zeile 1 nicht immer die längste ist
'   lCol = Cells.Find(What:="*", SearchOrder:=xlByColumns, _
   SearchDirection:=xlPrevious).Column
  Set rngZe7 = Range(Cells(7, 1), Cells(7, lCol))
  Set rngZe8 = Range(Cells(8, 1), Cells(8, lCol))
 
  If Not Intersect(rngZe8, Target) Is Nothing Then
     For Each c In rngZe7
        c = WorksheetFunction.Sum(Range(Cells(1, c.Column), Cells(6, c.Column)))
     Next c
     Cells(8, 1) = WorksheetFunction.Sum(Range(Cells(7, 1), Cells(7, lCol)))
  End If
  Cancel = True
End Sub
Beste Grüße
  Günther

Excel-ist-sexy.de
  …schau doch mal rein!
Der Sicherheit meiner Daten wegen lade ich keine *.xlsm bzw. *.xlsb- Files mehr herunter! -> So geht's ohne!
Antworten Top
#4
Hallo Stefan,
nein so habe ich mir das nicht vorgestellt.
Trotzdem danke für Deinen Vorschlag.

Hallo Günther,
das sieht gut aus. Ich möchte aber noch ein bisschen testen.
Melde mich dann wieder.

Vielen Dank!
Mit freundlichen Grüßen / Best regards
                          //
----------o00o---°(_)°---o00o----------------------

Erich
Antworten Top
#5
Hallo Günther,

eine Frage noch:
Warum das "Cancel = True" am Ende der Routine? Ist das notwendig?
Nach einem Doppelklick ist keine weitere Aktion möglich, d.h. es ist irgendwie blockiert.

Kommentiere ich die Zeile aus erfolgt wie gewünscht die Berechnung.
Mit freundlichen Grüßen / Best regards
                          //
----------o00o---°(_)°---o00o----------------------

Erich
Antworten Top
#6
Moin Erich,

der Aufruf der Prozedur lautet ja so:

Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

es wird also Cancel als Bool'scher Wert automatisch übergeben. Und ich habe das aus Gewohnheit wieder auf True gesetzt, aber es muss bzw. sollte hier nicht nicht sein. Also: Raus damit ...
Beste Grüße
  Günther

Excel-ist-sexy.de
  …schau doch mal rein!
Der Sicherheit meiner Daten wegen lade ich keine *.xlsm bzw. *.xlsb- Files mehr herunter! -> So geht's ohne!
Antworten Top
#7
Nochmals sorry,
solch ein Lapsus (mit dem Cancel) sollte mir nicht passieren. Ich war leider ziemlich abgelenkt durch die sich immer wieder aktualisierenden schrecklichen Nachrichten aus Paris ...
Beste Grüße
  Günther

Excel-ist-sexy.de
  …schau doch mal rein!
Der Sicherheit meiner Daten wegen lade ich keine *.xlsm bzw. *.xlsb- Files mehr herunter! -> So geht's ohne!
Antworten Top
#8
(14.11.2015, 12:22)GMG-CC schrieb: Nochmals sorry,
solch ein Lapsus (mit dem Cancel) sollte mir nicht passieren. Ich war leider ziemlich abgelenkt durch die sich immer wieder aktualisierenden schrecklichen Nachrichten aus Paris ...

Hi Günther,

einen "Lapsus" würde ich höchstens darin sehen, das Cancel = True unabhängig von der Bedingung generell gesetzt wird. Wink

Gruß Uwe
Antworten Top
#9
Hallo Günther,

darf ich Dich nochmal löchern?

Wenn ich jetzt mehrere Bereiche habe die ich auf die gleiche Weise (Addition per Doppelklick) bearbeiten will, wie müsste das Makro abgeändert werden.
Die Bereiche habe ich mit Namen benannt. Siehe dazu die angehängte Datei.

Wäre toll wenn Du mir da weiterhelfen könntest.

Vielen Dank!


Angehängte Dateien
.xlsm   TestDklick.xlsm (Größe: 16,54 KB / Downloads: 3)
Mit freundlichen Grüßen / Best regards
                          //
----------o00o---°(_)°---o00o----------------------

Erich
Antworten Top
#10
Moin Erich,

dieser Code sollte deinen Wünschen entsprechen:

Code:
Option Explicit

'Const anzSumBereich = 3 'Anzahl der benannten Summenbereiche

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  Dim lCol As Integer
  Dim rngUnion As Range
 
  lCol = Cells(1, Columns.Count).End(xlToLeft).Column
  Set rngUnion = Application.Union(Range("SumErgebnis1"), Range("SumErgebnis2"), Range("SumErgebnis3"))
  If Not Intersect(rngUnion, Target) Is Nothing Then Call SpaltenSumme(Target.Row - 1, lCol)
End Sub


Sub SpaltenSumme(Zeile, lCol)
  Dim rngSubSum As Range, c As Range, rngData As Range
 
  Select Case Zeile
   Case 7
     Set rngData = Range("Bereich1")
   Case 20
     Set rngData = Range("Bereich2")
   Case Else
     Set rngData = Range("Bereich3")
  End Select
 
  Set rngSubSum = Range(Cells(Zeile, 1), Cells(Zeile, lCol))
  For Each c In rngSubSum
     Cells(Zeile, c.Column) = WorksheetFunction.Sum(rngData.Columns(c.Column))
  Next c
  Cells(Zeile + 1, 1) = WorksheetFunction.Sum(rngSubSum)
End Sub
Beste Grüße
  Günther

Excel-ist-sexy.de
  …schau doch mal rein!
Der Sicherheit meiner Daten wegen lade ich keine *.xlsm bzw. *.xlsb- Files mehr herunter! -> So geht's ohne!
[-] Folgende(r) 1 Nutzer sagt Danke an GMG-CC für diesen Beitrag:
  • sharky51
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste