Sub in private sub !?
#1
Anbei mein Quellcode.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim rFind As Range
On Error GoTo Fehler
If InStr(Target.Address, ":") Then Exit Sub
If Target.Column <> 4 Then Exit Sub
 
If Target.Value <> Empty Then
    Set rFind = Columns(4).Find(what:=Target, After:=[d3], LookIn:=xlFormulas, _
        lookat:=xlWhole, SearchDirection:=xlNext, MatchCase:=False)
    If Not rFind Is Nothing Then
    If rFind.Address <> Target.Address Then
      rFind.Offset(0, -1) = rFind.Offset(0, -1) + 1
      Target.Select:  Target.Value = ""
      Exit Sub
    End If
    End If
End If
    If Target.Value = Empty Then
      Target.Offset(0, -1) = ""
      Target.Select
    ElseIf Target.Offset(0, -1) = "" Then
      Target.Offset(0, -1) = 1
      Target.Offset(1, 0).Select
    End If
   
    With ActiveSheet
      .PageSetup.PrintArea = Range(Range("AA1").Text).Address
      End With
     
Exit Sub
Fehler:  MsgBox "Position gelöscht"
End Sub


Es geht um den Fett markierten Teil, der meinen Dynamischen Druckbereich festlegen soll.
Wenn ich diesen Teil in ein Sub setze gehts einwandfrei, aber da ich ja bereits den privat sub habe müsste ich diesen hier integrieren.
Das wiederrum führt aber nicht zum gewünschten Ergebnis.

Kann mir da jemand helfen?  16
Antworten Top
#2
Hallo,

(21.10.2021, 12:25)master2011 schrieb: Wenn ich diesen Teil in ein Sub setze gehts einwandfrei, aber da ich ja bereits den privat sub habe müsste ich diesen hier integrieren.
Das wiederrum führt aber nicht zum gewünschten Ergebnis.
Wie äußert sich denn das Problem genau? Gibt es eine Fehlermeldung? Wenn ja, welche und in welcher Zeile?

Dein Code sollte in beiden Subs korrekt funktionieren. Activesheet ist übrigens das aktive Tabellenblatt, also das, in dem die Änderung stattfindet.
Gruß
Michael
Antworten Top
#3
Hallo,

du musst natürlich dafür sorgen, dass die Programmausführung auch dorthin gelangen kann.
Wenn du diese mit "Exit Sub" frühzeitig verlässt, kann der Druckbereich nicht mehr festgelegt werden.
Ich habe statt dessen 3 unschöne Sprungbefehle eingebaut - aber sie sollten zumindest funktionieren.

Code:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
   Dim rFind As Range
   On Error GoTo Fehler
   If InStr(Target.Address, ":") Then Goto PrintArea_festlegen
   If Target.Column <> 4 Then Goto PrintArea_festlegen
   
   If Target.Value <> Empty Then
       Set rFind = Columns(4).Find(what:=Target, After:=[d3], LookIn:=xlFormulas, _
           lookat:=xlWhole, SearchDirection:=xlNext, MatchCase:=False)
       If Not rFind Is Nothing Then
         If rFind.Address <> Target.Address Then
           rFind.Offset(0, -1) = rFind.Offset(0, -1) + 1
           Target.Select:  Target.Value = ""
           GoTo PrintArea_festlegen
         End If
       End If
   End If
   If Target.Value = Empty Then
      Target.Offset(0, -1) = ""
      Target.Select
   ElseIf Target.Offset(0, -1) = "" Then
      Target.Offset(0, -1) = 1
      Target.Offset(1, 0).Select
   End If
  
PrintArea_festlegen:
   With ActiveSheet
      .PageSetup.PrintArea = Range(Range("AA1").Text).Address
   End With
       
   Exit Sub
Fehler:
   MsgBox "Position gelöscht"
End Sub

Und hoffentlich ist dir der Verwendungszweck der Callback-Routine für das Change-Event des Arbeitsblattes auch wirklich klar.
Mit lieben Grüßen
Anton.

Windows 10 64bit
Office365 32bit
Antworten Top
#4
(21.10.2021, 13:48)Der Steuerfuzzi schrieb: Hallo,

Wie äußert sich denn das Problem genau? Gibt es eine Fehlermeldung? Wenn ja, welche und in welcher Zeile?

Dein Code sollte in beiden Subs korrekt funktionieren. Activesheet ist übrigens das aktive Tabellenblatt, also das, in dem die Änderung stattfindet.

Das Problem äußert sich mir gegenüber leider nur mit Arbeitsverweigerrung.

Also kein Fehler, aber leider auch keine Funktion.

Activesheet ist so richtig, da die ich auf einem anderen Arbeitsblatt eine andere Funktion nutze.
Antworten Top
#5
Dein code wird wahrscheinlich nicht abgearbeitet.

Kleiner Tip: Gehe mal im Einzelschrittmodus durch das Makro und prüfe es Zeile für Zeile, ob es das macht, was es soll.
Noch ein Tip: Wirf Deine Suchmaschine an und suche mal, was Empty bedeutet bzw. wie man auf leere Zellen prüft.
Letzter Tip: Es gibt neben If und Then auch noch Else. Dein zweites If könnte man auch alse Else-Zweig schreiben. Les da nochmal nach.
Allerletzter Tip: GoTo macht Code schlecht lesbar und wird häufig als schlechter Stil gesehen. In 99% der Fälle braucht man kein GoTo
Gruß
Michael
Antworten Top
#6
(21.10.2021, 14:19)EA1950 schrieb: Hallo,

du musst natürlich dafür sorgen, dass die Programmausführung auch dorthin gelangen kann.
Wenn du diese mit "Exit Sub" frühzeitig verlässt, kann der Druckbereich nicht mehr festgelegt werden.
Ich habe statt dessen 3 unschöne Sprungbefehle eingebaut - aber sie sollten zumindest funktionieren.

Code:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
   Dim rFind As Range
   On Error GoTo Fehler
   If InStr(Target.Address, ":") Then Goto PrintArea_festlegen
   If Target.Column <> 4 Then Goto PrintArea_festlegen
   
   If Target.Value <> Empty Then
       Set rFind = Columns(4).Find(what:=Target, After:=[d3], LookIn:=xlFormulas, _
           lookat:=xlWhole, SearchDirection:=xlNext, MatchCase:=False)
       If Not rFind Is Nothing Then
         If rFind.Address <> Target.Address Then
           rFind.Offset(0, -1) = rFind.Offset(0, -1) + 1
           Target.Select:  Target.Value = ""
           GoTo PrintArea_festlegen
         End If
       End If
   End If
   If Target.Value = Empty Then
      Target.Offset(0, -1) = ""
      Target.Select
   ElseIf Target.Offset(0, -1) = "" Then
      Target.Offset(0, -1) = 1
      Target.Offset(1, 0).Select
   End If
  
PrintArea_festlegen:
   With ActiveSheet
      .PageSetup.PrintArea = Range(Range("AA1").Text).Address
   End With
       
   Exit Sub
Fehler:
   MsgBox "Position gelöscht"
End Sub

Und hoffentlich ist dir der Verwendungszweck der Callback-Routine für das Change-Event des Arbeitsblattes auch wirklich klar.

Leider funktioniert das auch nicht.
Der Druckbereich wird zwar gesetzt, aber verschiebt sich auch nicht nach unten, sobald ich eine neue zeile beschreibe.

Ich muss gestehen das ich VBA Neuling bin und mir einen Großteil der Codes selbst zusammengebaut habe oder von anderer Seite Hilfe bekommen habe.
Was die Callback-Routine ist !? Kein Plan ?

(22.10.2021, 09:27)Der Steuerfuzzi schrieb: Dein code wird wahrscheinlich nicht abgearbeitet.

Kleiner Tip: Gehe mal im Einzelschrittmodus durch das Makro und prüfe es Zeile für Zeile, ob es das macht, was es soll.
Noch ein Tip: Wirf Deine Suchmaschine an und suche mal, was Empty bedeutet bzw. wie man auf leere Zellen prüft.
Letzter Tip: Es gibt neben If und Then auch noch Else. Dein zweites If könnte man auch alse Else-Zweig schreiben. Les da nochmal nach.

Ich versuche das mal in meinem nichtvorhanden Wissen zu verarbeiten.

Ich denke, dass diese Fallback Routine dafür sorgt, immer und immerwieder die Schleife durchzulaufen.
Somit komme ich erst garnicht zu dem Punkt, dass er mir den Druckbereich dynamisch erweitern könnte , oder?

Aber leider hat das mit den 3 Schleifen ja auch nicht geklappt
Antworten Top
#7
Ich habe meinen Beitrag nochmal editiert. Bitte lies ihn nochmal durch.
Gruß
Michael
Antworten Top
#8
Hallo,

teste es mal so:
Code:

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim rFind As Range

  ' If InStr(Target.Address, ":") Then Exit Sub
  If Target.Cells.Count = 1 Then
     ' If Target.Column <> 4 Then Exit Sub
     If Target.Column = 4 Then
        On Error GoTo Fehler
        Application.EnableEvents = False
        ' If Target.Value <> Empty Then
        If Len(Target.Value) Then
           Set rFind = Columns(4).Find(what:=Target.Value, LookIn:=xlFormulas, _
           lookat:=xlWhole, SearchDirection:=xlNext, MatchCase:=False)
           If Not rFind Is Nothing Then
              If rFind.Address <> Target.Address Then
                 rFind.Offset(0, -1).Value = rFind.Offset(0, -1).Value + 1
                 Target.Select:  Target.Value = ""
                 ' Exit Sub
              End If
           End If
        ElseIf Target.Value = "" Then
           Target.Offset(0, -1) = ""
           Target.Select
        ElseIf Target.Offset(0, -1).Value = "" Then
           Target.Offset(0, -1).Value = 1
           Target.Offset(1, 0).Select
        End If
        Me.PageSetup.PrintArea = Range("AA1").Text
        Application.EnableEvents = True
        On Error GoTo 0
     End If
  End If
  Exit Sub
Fehler:
  Application.EnableEvents = True
  On Error GoTo 0
  MsgBox "Position gelöscht"
End Sub

'  VBA, XML, HTML => Forum-HTML, © 2018 by KHV (VBA) und Haklesoft (VB)

Gruß Uwe
 
Antworten Top


Gehe zu:


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