1.2k Aufrufe
Gefragt in Tabellenkalkulation von acr Mitglied (215 Punkte)
Hallo liebe Exelgemeinde
Ich habe ein Problem, in einen bestehenden VBA-Code eine weitere Prüfung für die Spalten A und B einzufügen.
Der nachfolgende Code1 funktioniert in seiner Aufgabe einwandfrei. Der zweite Code, die gewünschte Überprüfung der beiden Spalten, wird allerdings nicht mit ausgeführt. Als alleiniger Code funktioniert auch dieser.
Ich benutze noch Exel 2003



Private Sub worksheet_Change(ByVal Target As Range)
' Zeilen überprüfen und kopieren sowie Verschieben der entsprechenden pdf-Datei

Dim rngBer As Range
Dim rngObj As Range
Dim Sh As Worksheet
Dim objFSO As Object
Dim datei As String


On Error GoTo Err_Handler
' Datei verschieben "aktuell" --> "zur Zeit in Abrechnung"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Application.EnableEvents = False 'in diesem Code nicht nötig (zu Testzwecken eingeschaltet)
If Not Application.Intersect(Target, Range("M8:M1000")) Is Nothing Then
If IsDate(Target) = True Then
datei = "X:\Programme\Abrechnung\aktuell\" & Cells(Target.Row, 1) & " " & Cells(Target.Row, 2) & ".pdf"
If objFSO.FileExists(datei) = True Then
objFSO.MoveFile datei, "X:\Programme\Abrechnung\zur Zeit in Abrechnung\"
MsgBox ("Datei " & Cells(Target.Row, 2) & ".pdf" & " wurde verschoben") ' kann bei Bedarf eingeschaltet werden
Else
MsgBox ("ACHTUNG: Datei ist im Ordner AKTUELL nicht vorhanden")
End If
End If
End If
Application.EnableEvents = True



' zu prüfende Zellen als Gesamtbereich festlegen
With Me
Set rngBer = Union(.Range("F8:F1000"), .Range("G8:G1000"), .Range("I8:I1000"), .Range("J8:J1000"), .Range("N8:N1000"), .Range("M8:M1000"))
End With

' gucken ob change im Zielbereich liegt
If Not Intersect(Target, rngBer) Is Nothing Then
With Target

' wenn ja, Abfrage ob alle Zellen gefüllt sind, wenn eine leer dann raus aus sub
For Each rngObj In rngBer

' nur wenn Zeile stimmt Inhalt prüfen
If rngObj.Row = .Row Then

' wenn Zeile stimmt, aber einer der 5 Checkbereiche leer, dann exit
If rngObj.Value = "" Then
GoTo Exit_This
End If
End If
Next rngObj

' sheetauswahl nach Angabe im Tabellenblatt, Spalte l
' nicht existent wird im err_handler abgearbeitet
Set Sh = Sheets(Right(Cells(.Row, 12), 4))

Application.EnableEvents = False
Application.ScreenUpdating = False
Sh.Unprotect
Me.Unprotect

' Zeile kopieren ins neue Sheet
Rows(.Row).Copy Destination:=Sh.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)

' Zeile im Ursprungssheet löschen
Rows(.Row).Delete
Me.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Sh.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End With

Cells(ActiveCell.Row, 1).Select ' Rücksprung nach Spalte 1 (wurde am 15.7.14 geändert, da Rücksprung immer stattfand)
End If



Exit_This:
Application.EnableEvents = True
Application.ScreenUpdating = True
Set rngBer = Nothing
Set rngObj = Nothing
Set Sh = Nothing

Exit Sub

' Fehlerprüfroutine
Err_Handler:
Select Case Err.Number
Case 9
MsgBox "Das angegebene Tabellenblatt existiert nicht!"
Case Else
MsgBox "Fehler: " & Err.Number & vbLf & Err.Description
End Select
Resume Exit_This

' End Sub





' BIS HIER FUNKTIONIERT DER CODE1 oben.
' Der nachfolgende Code müßte jedoch in Code1 mit eingebunden werden
' damit eine Überprüfung der Spalten A und B stattfindet.
' Vielen Dank schon mal für eure Bemühungen



Private Sub worksheet_Change(ByVal Target As Range)
Dim strPfad As String
Dim strDateiname As String
Dim Antwort

strPfad = "X:\Programme\Abrechnung\aktuell\"

'Prüfen, ob Eingabe in Spalten A oder B erfolgt ist, falls nicht, dann Makro beenden
If Intersect(Target, Range("A:B")) Is Nothing Then Exit Sub

'Prüfen, ob in Eingaben sowohl in Zelle A als auch in Zelle B erfolgt sind
If IsEmpty(Cells(Target.Row, 1)) = False And IsEmpty(Cells(Target.Row, 2)) = False Then
'Falls beide Spalten ausgefüllt sind, dann Variable für Überprüfung erstellen - Leerzeichen ggf. löschen
strDateiname = Cells(Target.Row, 1).Value & " " & Cells(Target.Row, 2) & ".pdf"
strDatei = strPfad & strDateiname
'prüfen ob Datei bereits vorhanden ist, falls nicht dann Nachfrage
If Dir(strDatei) = "" Then
Antwort = MsgBox("Eine Datei mit dem Namen " & strDateiname & " existiert nicht! Soll die Datei per Scanner erzeugt werden?", 68, "Datei existiert nicht")
'Falls die Antwort Ja ausgewählt wird, dann Scan-Programm starten
If Antwort = vbYes Then Shell ("D:\Program Files (x86)\ScannerInterface 7\Scanner-Interface.exe"), vbNormalFocus
End If
End If
End Sub


' Aufruf eines Kalenders

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)

Me.Unprotect
Range("A8:O885").Interior.ColorIndex = xlNone
ActiveCell.Interior.ColorIndex = 6
Me.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True


Dim RaBereich As Range
If Target.Count > 1 Then Exit Sub
' Bereich der Wirksamkeit
Set RaBereich = Range("A8:A1000, D6, J8:J1000, M8:M1000, N8:N1000")

If Not Intersect(Target, RaBereich) Is Nothing Then
FRM_Kalender.Show
ElseIf Target.Row >= 4 And Target.Row <= 7 And Target.Column <= 12 Then
Kalender.Show
End If
' ActiveSheet.protect ("xxxxxx")
Set RaBereich = Nothing


End Sub




Mit freunlichen Grüßen
Horst

4 Antworten

0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)
Hallo Horst,

wenn du den zweiten Code hinter den bestehenden ersten Code einfügst, kann dieser nicht ausgeführt werden, da in deinem ersten Code vor der Fehlerroutine ein Exit Sub steht.

Füge also den zweiten Code vor dem ersten ein. Allderdings musst du die Prüfung, ob die Eingabe in Spalte A oder B erfolgt ist ändern:

Private Sub worksheet_Change(ByVal Target As Range)
Dim strPfad As String
Dim strDateiname As String
Dim Antwort
Dim rngBer As Range
Dim rngObj As Range
Dim Sh As Worksheet
Dim objFSO As Object
Dim datei As String

strPfad = "X:\Programme\Abrechnung\aktuell\"

'Prüfen, ob Eingabe in Spalten A oder B erfolgt ist, falls nicht, dann Makro beenden - Achtung hier Änderung des Codes!!!
If Not Intersect(Target, Range("A:B")) Is Nothing Then
'Prüfen, ob in Eingaben sowohl in Zelle A als auch in Zelle B erfolgt sind
If IsEmpty(Cells(Target.Row, 1)) = False And IsEmpty(Cells(Target.Row, 2)) = False Then
'Falls beide Spalten ausgefüllt sind, dann Variable für Überprüfung erstellen - Leerzeichen ggf. löschen
strDateiname = Cells(Target.Row, 1).Value & " " & Cells(Target.Row, 2) & ".pdf"
strDatei = strPfad & strDateiname
'prüfen ob Datei bereits vorhanden ist, falls nicht dann Nachfrage
If Dir(strDatei) = "" Then
Antwort = MsgBox("Eine Datei mit dem Namen " & strDateiname & " existiert nicht! Soll die Datei per Scanner erzeugt werden?", 68, "Datei existiert nicht")
'Falls die Antwort Ja ausgewählt wird, dann Scan-Programm starten
If Antwort = vbYes Then Shell ("D:\Program Files (x86)\ScannerInterface 7\Scanner-Interface.exe"), vbNormalFocus
End If
End If
End If
'und hier nun dein anderer Code...
On Error GoTo Err_Handler
' Datei verschieben "aktuell" --> "zur Zeit in Abrechnung"
....
End Sub


Gruß

M.O.
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi all ^^

aufruf von 2 makros mit uebergabe einer variablen

gruss nighty

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Dim ÜbergabeVariable As String
ÜbergabeVariable = Target
Call Makro1(ÜbergabeVariable)
Call Makro2(ÜbergabeVariable)
Application.EnableEvents = True
End Sub


Sub Makro1(ÜbergabeVariable As String)

End Sub

Sub Makro2(ÜbergabeVariable As String)

End Sub
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi all ^^

oder als uebergabe

Target.Address

gruss nighty
0 Punkte
Beantwortet von acr Mitglied (215 Punkte)
Hallo Exelfreunde

Vielen Dank für eure Lösungsvorschläge, die mir sehr geholfen haben.
Code läuft jetzt so, wie ich es haben wollte.

M.f.G.
Horst
...