Anzeige
Archiv - Navigation
1056to1060
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

Check auf #-Fehler über mehrere Dateien

Check auf #-Fehler über mehrere Dateien
10.03.2009 08:45:09
Bernd
Hallo,
ich würde gerne ein Verzeichnis (ohne Unterverzeichnisse) mit Exceldateien auf jegliche Art von #-Fehlern "durchchecken lassen". Evtl. Fehler sollten dann in einem Tabellenblatt aufgelistert werden mit Angabe von Dateiname und Register, evtl. noch ergänzt um Zellbezug (welche Spalte/Zeile). Die Auswahl des zu untersuchenden Ordners sollte flexibel sein, d.h die Auswahl sollte übr einer Art Auswahlfenster erfolgen und nicht im Code fixiert sein. Schön wäre es, wenn man sogar nur einzelne Dateien innerhalb des ordners auswählen könnte.
Gruß
Bernd

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

Betreff
Datum
Anwender
Anzeige
Top-Lösung, besten Dank!
11.03.2009 10:07:39
Bernd
Hallo Sepp,
perfekter gehts es wohl nicht mehr! Danke Dir. Da ich gerade Qualitätssicherung meiner Exceldateien "perfektionieren"möchte und "aller Guten Ding ja 3 sind ", habe ich nochmals was in ähnliche Richtung geht (Dateiauswahl und Auflistung von Feldern) eingestellt. Wäre schön, wenn Du da nochmal reinschauen könntest!
Vielen Dank und beste Grüße
Bernd
Anzeige
Check auf #-Fehler nur innerhalb einer Datei
12.03.2009 08:45:13
Bernd
Hallo Sepp,
ich hätte doch noch mal einen Wunsch, nachdem Deine Lösung sich als so komfortabel erwiesen hat, bin ich nun auf den Geschmack gekommen...
ich würde gerne den Code in mehrere meiner Exceldateien einbauen, so dass beim Start der Datei automatisch das Makro abläuft und ein Registerblatt innerhalb der Datei anlegt wird n der Form wie Du es ja schon in 1. Lösung eingebaut hattest (Registerblatt sollte z. B. "Check" heissen). Die Suche nach Fehlern sollte also nur innerhalb dieser Datei und dort aber auf allen Tabellen-/Registerblättern ablaufen.
Könnte man außer nach #-Fehlern ergänzend auch noch nach anderen Kriterien suchen (mit und Bedingung). Wie/wo könnte ich ich das im Code manuell editieren?
Wäre schön, wenn Dir noch was einfallen würde!
Vielen Dank im Voraus,
Gruß
Bernd
Anzeige
AW: Check auf #-Fehler nur innerhalb einer Datei
12.03.2009 09:22:49
Josef
Hallo Bernd,
kein Problem, allerdings müsstest du genauer definieren, was du mit "anderen Bedingungen" meinst.
Die Fehler werden so aufgelistet.
' **********************************************************************
' Modul: DieseArbeitsmappe Typ: Element der Mappe(Sheet, Workbook, ...)
' **********************************************************************

Option Explicit

Private Sub Workbook_Open()
  searchError
End Sub

' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub searchError()
  Dim objWS As Worksheet
  Dim lngR As Long
  Dim rng As Range, rngF As Range
  
  On Error GoTo ErrExit
  GMS
  If Not SheetExist("Check") Then
    ThisWorkbook.Worksheets.Add after:=Sheets(Sheets.Count)
    With Sheets(Sheets.Count)
      .Name = "Check"
      .Cells(1, 1) = "Tabelle"
      .Cells(1, 2) = "Zelle"
      .Cells(1, 3) = "Zellwert"
      .Cells(1, 4) = "Formel"
      .Cells(1, 5) = "Link"
      .Rows(1).Font.Bold = True
    End With
  End If
  
  With Sheets("Check")
    .Range("A2:E" & Rows.Count).ClearContents
    lngR = 2
    For Each objWS In ThisWorkbook.Worksheets
      On Error Resume Next
      Set rng = Nothing
      Set rng = objWS.UsedRange.SpecialCells(xlCellTypeFormulas, xlErrors)
      On Error GoTo ErrExit
      If Not rng Is Nothing Then
        For Each rngF In rng
          .Cells(lngR, 1) = objWS.Name
          .Cells(lngR, 2) = rngF.Address(0, 0)
          .Cells(lngR, 3) = rngF.Value
          .Cells(lngR, 4) = "'" & rngF.FormulaLocal
          .Hyperlinks.Add Anchor:=.Cells(lngR, 5), _
            Address:="", _
            SubAddress:="'" & objWS.Name & "'!" & rngF.Address, _
            TextToDisplay:="Go!"
          lngR = lngR + 1
        Next
      End If
    Next
    If lngR > 2 Then .Activate
  End With
  
  ErrExit:
  With Err
    If .Number <> 0 Then MsgBox .Number & vbLf & vbLf & .Description, vbExclamation, "Fehler"
  End With
  GMS True
  Set objWS = Nothing
  Set rng = Nothing
  Set rngF = Nothing
End Sub

Private Sub GMS(Optional ByVal Modus As Boolean = False)
  
  Static lngCalc As Long
  
  
  With Application
    .ScreenUpdating = Modus
    .EnableEvents = Modus
    .DisplayAlerts = Modus
    .EnableCancelKey = IIf(Modus, 1, 0)
    If Not Modus Then lngCalc = .Calculation
    If Modus And lngCalc = 0 Then lngCalc = -4105
    .Calculation = IIf(Modus, lngCalc, -4135)
    .Cursor = IIf(Modus, -4143, 2)
    
  End With
  
  
End Sub

Private Function SheetExist(ByVal sheetName As String, Optional WbName As String) As Boolean
  Dim wks As Worksheet
  On Error GoTo ERRORHANDLER
  If WbName = "" Then WbName = ThisWorkbook.Name
  For Each wks In Workbooks(WbName).Worksheets
    If wks.Name = sheetName Then SheetExist = True: Exit Function
  Next
  ERRORHANDLER:
  SheetExist = False
End Function

Das Blatt "Check" wird, wenn nicht vorhanden, automatisch angelegt.
Achte darauf, wo, welcher Codeteil eingefügt werden muss.
Gruß Sepp

Anzeige
AW: Check auf #-Fehler nur innerhalb einer Datei
12.03.2009 09:52:16
Bernd
Hallo Sepp,
z. B. könnte ich mir vorstellen sowohl nach einem bestimmten Text zu suchen UND nach den besagten #-Fehlern!
Viele Grüße
Bernd
Konfusion: Nicht und- sonder oder-Bedingung
12.03.2009 09:56:24
Bernd
Hallo Sepp,
jetzt ist mir doch ein kleiner Fehler unterlaufen: Es handelt sich natürlich um eine Oder-Bedingung.
Also: #-Fehler oder bestimmter Text sollte erfüllt sein, damit es in der Liste aufgeführt wird.
Gruß
Bernd
AW: Konfusion: Nicht und- sonder oder-Bedingung
12.03.2009 10:54:30
Josef
Hallo Bernd,
dann so.
' **********************************************************************
' Modul: DieseArbeitsmappe Typ: Element der Mappe(Sheet, Workbook, ...)
' **********************************************************************

Option Explicit

Private Sub Workbook_Open()
  searchError
End Sub

' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub searchError()
  Dim objWS As Worksheet
  Dim lngR As Long, lngE As Long
  Dim rng As Range, rngF As Range
  Dim strFind As String, strFirst As String
  
  On Error GoTo ErrExit
  GMS
  If Not SheetExist("Check") Then
    ThisWorkbook.Worksheets.Add after:=Sheets(Sheets.Count)
    With Sheets(Sheets.Count)
      .Name = "Check"
      .Cells(1, 1) = "Tabelle"
      .Cells(1, 2) = "Zelle"
      .Cells(1, 3) = "Zellwert"
      .Cells(1, 4) = "Formel"
      .Cells(1, 5) = "Link"
      .Rows(1).Font.Bold = True
    End With
  End If
  
  With Sheets("Check")
    .Range("A2:E" & Rows.Count).ClearContents
    lngR = 2
    For Each objWS In ThisWorkbook.Worksheets
      If Not objWS.Name = .Name Then
        On Error Resume Next
        Set rng = Nothing
        Set rng = objWS.UsedRange.SpecialCells(xlCellTypeFormulas, xlErrors)
        On Error GoTo ErrExit
        If Not rng Is Nothing Then
          For Each rngF In rng
            .Range(.Cells(lngR, 1), .Cells(lngR, 4)).Font.ColorIndex = 3
            .Cells(lngR, 1) = objWS.Name
            .Cells(lngR, 2) = rngF.Address(0, 0)
            .Cells(lngR, 3) = rngF.Value
            .Cells(lngR, 4) = "'" & rngF.FormulaLocal
            .Hyperlinks.Add Anchor:=.Cells(lngR, 5), _
              Address:="", _
              SubAddress:="'" & objWS.Name & "'!" & rngF.Address, _
              TextToDisplay:="Fehler!"
            lngR = lngR + 1
          Next
        End If
      End If
    Next
    
    'Textsuche
    strFind = InputBox("Die Fehlerprüfung dieser Datei ist abgeschlossen." & vbLf & _
      "Es wurde(n) " & CStr(lngR - 2) & " Fehler gefunden!." & vbLf & vbLf & _
      "Wollen Sie auch nach Inhalten suchen?", "Errorcheck - Suche", "suchtext")
    
    If strFind <> "Falsch" Then
      lngE = lngR
      For Each objWS In ThisWorkbook.Worksheets
        If Not objWS.Name = .Name Then
          Set rng = Nothing
          strFirst = ""
          Set rng = objWS.UsedRange.Find(What:=strFind, LookAt:=xlPart, LookIn:=xlValues, _
            MatchCase:=False, MatchByte:=False, SearchFormat:=False)
          If Not rng Is Nothing Then
            strFirst = rng.Address
            Do
              .Cells(lngR, 1) = objWS.Name
              .Cells(lngR, 2) = rng.Address(0, 0)
              .Cells(lngR, 3) = rng.Value
              .Cells(lngR, 4) = "'" & rng.FormulaLocal
              .Hyperlinks.Add Anchor:=.Cells(lngR, 5), _
                Address:="", _
                SubAddress:="'" & objWS.Name & "'!" & rng.Address, _
                TextToDisplay:="Suche!"
              lngR = lngR + 1
            Loop While Not rng Is Nothing And strFirst <> rng.Address
          End If
        End If
      Next
      If lngR > lngE Then
        MsgBox "Die Suche ergab " & CStr(lngR - lngE) & " Treffer", vbInformation, "Errorcheck - Suche"
      Else
        MsgBox "Die Suche ergab keine Treffer", vbInformation, "Errorcheck - Suche"
      End If
    End If
    
    If lngR > 2 Then .Activate
  End With
  
  ErrExit:
  With Err
    If .Number <> 0 Then MsgBox .Number & vbLf & vbLf & .Description, vbExclamation, "Fehler"
  End With
  GMS True
  Set objWS = Nothing
  Set rng = Nothing
  Set rngF = Nothing
End Sub

Private Sub GMS(Optional ByVal Modus As Boolean = False)
  
  Static lngCalc As Long
  
  
  With Application
    .ScreenUpdating = Modus
    .EnableEvents = Modus
    .DisplayAlerts = Modus
    .EnableCancelKey = IIf(Modus, 1, 0)
    If Not Modus Then lngCalc = .Calculation
    If Modus And lngCalc = 0 Then lngCalc = -4105
    .Calculation = IIf(Modus, lngCalc, -4135)
    .Cursor = IIf(Modus, -4143, 2)
    
  End With
  
  
End Sub

Private Function SheetExist(ByVal sheetName As String, Optional WbName As String) As Boolean
  Dim wks As Worksheet
  On Error GoTo ERRORHANDLER
  If WbName = "" Then WbName = ThisWorkbook.Name
  For Each wks In Workbooks(WbName).Worksheets
    If wks.Name = sheetName Then SheetExist = True: Exit Function
  Next
  ERRORHANDLER:
  SheetExist = False
End Function

Gruß Sepp

Anzeige
Klappt vorzüglich! Danke!
12.03.2009 11:51:08
Bernd
Hallo Sepp,
wie immer perfekt! Nochmals vielen, vielen Dank!
Gruss
Bernd
kleiner Fehler
12.03.2009 11:55:10
Josef
Hallo Bernd,
ich habe noch einen Fehler gefunden, nimm diesen Code.
' **********************************************************************
' Modul: DieseArbeitsmappe Typ: Element der Mappe(Sheet, Workbook, ...)
' **********************************************************************

Option Explicit

Private Sub Workbook_Open()
  searchError
End Sub

' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub searchError()
  Dim objWS As Worksheet
  Dim lngR As Long, lngE As Long
  Dim rng As Range, rngF As Range
  Dim strFind As String, strFirst As String
  
  On Error GoTo ErrExit
  GMS
  If Not SheetExist("Check") Then
    ThisWorkbook.Worksheets.Add after:=Sheets(Sheets.Count)
    With Sheets(Sheets.Count)
      .Name = "Check"
      .Cells(1, 1) = "Tabelle"
      .Cells(1, 2) = "Zelle"
      .Cells(1, 3) = "Zellwert"
      .Cells(1, 4) = "Formel"
      .Cells(1, 5) = "Link"
      .Rows(1).Font.Bold = True
    End With
  End If
  
  With Sheets("Check")
    .Range("A1").AutoFilter
    .Range("A2:E" & Rows.Count).ClearContents
    .Range("A2:E" & Rows.Count).Font.ColorIndex = xlAutomatic
    lngR = 2
    For Each objWS In ThisWorkbook.Worksheets
      If Not objWS.Name = .Name Then
        On Error Resume Next
        Set rng = Nothing
        Set rng = objWS.UsedRange.SpecialCells(xlCellTypeFormulas, xlErrors)
        On Error GoTo ErrExit
        If Not rng Is Nothing Then
          For Each rngF In rng
            .Range(.Cells(lngR, 1), .Cells(lngR, 4)).Font.ColorIndex = 3
            .Cells(lngR, 1) = objWS.Name
            .Cells(lngR, 2) = rngF.Address(0, 0)
            .Cells(lngR, 3) = rngF.Value
            .Cells(lngR, 4) = "'" & rngF.FormulaLocal
            .Hyperlinks.Add Anchor:=.Cells(lngR, 5), _
              Address:="", _
              SubAddress:="'" & objWS.Name & "'!" & rngF.Address, _
              TextToDisplay:="Fehler!"
            lngR = lngR + 1
          Next
        End If
      End If
    Next
    
    'Textsuche
    strFind = InputBox("Die Fehlerprüfung dieser Datei ist abgeschlossen." & vbLf & _
      "Es wurde(n) " & CStr(lngR - 2) & " Fehler gefunden!." & vbLf & vbLf & _
      "Wollen Sie auch nach Inhalten suchen?", "Errorcheck - Suche", "suchtext")
    
    If strFind <> "Falsch" Then
      lngE = lngR
      For Each objWS In ThisWorkbook.Worksheets
        If Not objWS.Name = .Name Then
          Set rng = Nothing
          strFirst = ""
          Set rng = objWS.UsedRange.Find(What:=strFind, LookAt:=xlPart, LookIn:=xlValues, _
            MatchCase:=False, MatchByte:=False, SearchFormat:=False)
          If Not rng Is Nothing Then
            strFirst = rng.Address
            Do
              .Cells(lngR, 1) = objWS.Name
              .Cells(lngR, 2) = rng.Address(0, 0)
              .Cells(lngR, 3) = rng.Value
              .Cells(lngR, 4) = "'" & rng.FormulaLocal
              .Hyperlinks.Add Anchor:=.Cells(lngR, 5), _
                Address:="", _
                SubAddress:="'" & objWS.Name & "'!" & rng.Address, _
                TextToDisplay:="Suche!"
              lngR = lngR + 1
              Set rng = objWS.UsedRange.FindNext(rng)
            Loop While Not rng Is Nothing And strFirst <> rng.Address
          End If
        End If
      Next
      If lngR > lngE Then
        MsgBox "Die Suche ergab " & CStr(lngR - lngE) & " Treffer", vbInformation, "Errorcheck - Suche"
      Else
        MsgBox "Die Suche ergab keine Treffer", vbInformation, "Errorcheck - Suche"
      End If
    End If
    
    If lngR > 2 Then
      .Activate
      .Range("A1").AutoFilter Field:=5, Criteria1:="=" & IIf(lngE > 2, "Fehler!", "Suche!")
    End If
  End With
  
  ErrExit:
  With Err
    If .Number <> 0 Then MsgBox .Number & vbLf & vbLf & .Description, vbExclamation, "Fehler"
  End With
  GMS True
  Set objWS = Nothing
  Set rng = Nothing
  Set rngF = Nothing
End Sub

Private Sub GMS(Optional ByVal Modus As Boolean = False)
  
  Static lngCalc As Long
  
  
  With Application
    .ScreenUpdating = Modus
    .EnableEvents = Modus
    .DisplayAlerts = Modus
    .EnableCancelKey = IIf(Modus, 1, 0)
    If Not Modus Then lngCalc = .Calculation
    If Modus And lngCalc = 0 Then lngCalc = -4105
    .Calculation = IIf(Modus, lngCalc, -4135)
    .Cursor = IIf(Modus, -4143, 2)
    
  End With
  
  
End Sub

Private Function SheetExist(ByVal sheetName As String, Optional WbName As String) As Boolean
  Dim wks As Worksheet
  On Error GoTo ERRORHANDLER
  If WbName = "" Then WbName = ThisWorkbook.Name
  For Each wks In Workbooks(WbName).Worksheets
    If wks.Name = sheetName Then SheetExist = True: Exit Function
  Next
  ERRORHANDLER:
  SheetExist = False
End Function

Gruß Sepp

Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige