Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Zellen in Schleife variabel ansprechen

Zellen in Schleife variabel ansprechen
11.04.2014 16:29:38
Heinz
Hallo Gemeinde,
ih habe ein Workbook, in dem es in allen Sheets verschiedene fest definierte Pflichtfelder gibt. Nun möchte ich über eine Schleife diese Zellen ansprechen um abzufragen, ob diese befüllt sind. Klingt simpel und ist es auch, aber ich hab n Brett vorm Kopf :o
SO funktioniert es natürlich immer nur für den ersten Range ("B6"). Ich wollte die Variable "Zelle(n)" "variabel" machen, hab es aber nicht hingekriegt:
Set Wb = ActiveWorkbook
Dim n As Integer, Anz As Integer
' PRÜFUNG PFLICHTEINTRÄGE ALLE
Anz = 3 'Anzahl Pflichtfelder im sheet
Zelle1 = "B6"
Zelle2 = "C11"
Zelle3 = "C12"
For Each Sh In Wb.Worksheets
For n = 1 To Anz
If Sh.Range(Zelle1).Value = "" Then
MsgBox "Pflichteintrag fehlt in: " & Sh.Name & " " & Sh.Range(Zelle1).Address
End If
Next n
Next Sh
Vielleicht denk ich auch völlig quer.. Danke schonmal!
Heinz

Anzeige

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zellen in Schleife variabel ansprechen
11.04.2014 17:27:20
Tino
Hallo,
hier mal eine Variante.
Sub test()
Dim n As Integer
Dim Wb As Workbook, Sh As Worksheet
Dim sFehler$, rngRange As Range
Dim Zellen(1 To 3) As String 'Array an Pflichtfelder anpassen
Set Wb = ActiveWorkbook
' PRÜFUNG PFLICHTEINTRÄGE ALLE
Zellen(1) = "B6"
Zellen(2) = "C11"
Zellen(3) = "C12"
For Each Sh In Wb.Worksheets
For n = LBound(Zellen) To UBound(Zellen)
If Sh.Range(Zellen(n)).Value = "" Then
If rngRange Is Nothing Then
Set rngRange = Sh.Range(Zellen(n))
Else
Set rngRange = Union(rngRange, Sh.Range(Zellen(n)))
End If
End If
Next n
If Not rngRange Is Nothing Then
sFehler = sFehler & Sh.Name & " " & rngRange.Address & vbCr
Set rngRange = Nothing
End If
Next Sh
If sFehler  "" Then
MsgBox "Pflichteintrag fehlt in: " & vbCr & vbCr & Left$(sFehler, Len(sFehler) - 1)
End If
End Sub
Gruß Tino

Anzeige
AW: Zellen in Schleife variabel ansprechen
14.04.2014 14:45:02
Heinz
Schön, großen Dank dafür! Das funktioniert auch recht schick. Einzig hinderlich ist nur der feste Array. Denn: Die Pflichtfelder sind von sheet zu sheet unterschiedlich. Also wollte ich diese "Zellen(1), ..." in einer vorgeschalteten Prozedur für jeden sheet definieren und dann in der einen Schleife darauf Bezug nehmen. Das geht aber nicht, da der zusammengesetzte String (Array) innerhalb der Schleifenprozedur deklariert werden muß, richtig? Hmm.. Viell. gibt ja doch eine Möglichkeit, den Array aus der "Vor"-Prodezur an die Schleifenprozedur zu übergeben? Da ich hier nicht weitergekommen bin, habe ich auch noch in eine andere Richtung gedacht:
Jedes Pflichtfeld in meinem Wb ist bedingt formatiert mit der Regel: Ausfüllen=Rot, wenn Eintrag=0. Also hab ich eine Schleife gebastelt, die diese Zellen aufspürt und meldet wenn kein Eintrag drin steht: Diese hat nur den Nachteil, dass sie eben unperformant ist, weil sie Zeile für Zeile und Spalte für Spalte durchläuft:
Sub Test1() 'TEST Bedingte Formate für Plausiprüfung benutzen (Zellenschleife)
'(Bedingtes Format Ausfüllen=ROT muß an Prio(1) stehen)
Dim AnzBedF As Integer, z As Integer
zGes = 104 'diese Werte würde ich aus der "Vorprozedur" übergeben
sGes = 42
Application.ScreenUpdating = False 'das machts zwar etwas fixer, aber bei vielen sheets...
AnzBedF = Cells.FormatConditions.Count
If AnzBedF > 0 Then
For z = 1 To zGes
For s = 1 To sGes
If Cells(z, s).FormatConditions.Count > 0 Then
Cells(z, s).Select
With Cells(z, s).FormatConditions(1)
If .Interior.Color = 255 And .Formula1 = "=0" And _
Cells(z, s).Value = "" Then
MsgBox "Leeres Pflichtfeld in: " & s & "/" & z
Exit Sub
End If
End With
End If
Next s
Next z
End If
Application.ScreenUpdating = True
End Sub
So dachte ich mir, dass ich die Bedingt formatierten Zellen eines sheets direkt anspreche. Aber das geht nur bis zur Nummer eben. Welche Zellen dahinter stehen, quasi an den "wird angewendet auf .." - Zellbezug komm ich nicht ran, oder?
Sub Test2() 'TEST Bedingte Formate für Plausiprüfung benutzen
Set bedf = Cells.FormatConditions
For bedf = 1 To AnzBedF
With Cells.FormatConditions(bedf)
If .Interior.Color = 255 And .Formula1 = "=0" Then
MsgBox "Bed.Format-Nr.: " & bedf
End If
End With
Next bedf
End Sub
Die bessere Variante wäre sicher die erste oben über den Array, zumal das Ganze auch unter Excel 11 laufen soll und ich weiß. dass ab Excel 2007 die Bedingten Formatierungen ganz schön angebohrt wurden.
Gruß Heinz

Anzeige
AW: Zellen in Schleife variabel ansprechen
15.04.2014 10:23:29
Tino
Hallo,
wenn die Zellen bekannt sind, könnte man dies auch so machen.
In der Zeile "PRÜFUNG PFLICHTEINTRÄGE ALLE" muss für jede Tabelle
der Zellebereich einzeln angegeben werden.
Sub test()
Dim n As Integer
Dim Wb As Workbook, Sh As Worksheet
Dim sFehler$, rngRange As Range, rngTmp As Range
Dim Zellen(), varTemp 'Array an Pflichtfelder anpassen
Set Wb = ActiveWorkbook
' PRÜFUNG PFLICHTEINTRÄGE ALLE
Zellen = Array("Tabelle1!C7:C9,D9,E11:E13", "Tabelle2!B6,C11:C12,A2", "Tabelle3!A5")
For n = LBound(Zellen) To UBound(Zellen)
varTemp = Split(Zellen(n), "!")
For Each rngTmp In Wb.Sheets(varTemp(0)).Range(varTemp(1)).Cells
If rngTmp.Value = "" Then
If rngRange Is Nothing Then
Set rngRange = rngTmp
Else
Set rngRange = Union(rngRange, rngTmp)
End If
End If
Next rngTmp
If Not rngRange Is Nothing Then
sFehler = sFehler & rngRange.Parent.Name & " " & rngRange.Address(0, 0) & vbCr
Set rngRange = Nothing
End If
Next n
If sFehler  "" Then
MsgBox "Pflichteintrag fehlt in: " & vbCr & vbCr & Left$(sFehler, Len(sFehler) - 1)
End If
End Sub
Gruß Tino
Anzeige
;

Forumthreads zu verwandten Themen

Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Zellen in Schleife variabel ansprechen


Schritt-für-Schritt-Anleitung

Um Zellen in einer Schleife variabel anzusprechen, kannst Du folgende Schritte befolgen:

  1. Workbook und Variablen deklarieren:

    Dim Wb As Workbook
    Set Wb = ActiveWorkbook
    Dim n As Integer
    Dim Zellen(1 To 3) As String
  2. Pflichtfelder definieren: Weisen Sie den Zellen die entsprechenden Range-Referenzen zu:

    Zellen(1) = "B6"
    Zellen(2) = "C11"
    Zellen(3) = "C12"
  3. Schleife über die Worksheets:

    For Each Sh In Wb.Worksheets
       For n = LBound(Zellen) To UBound(Zellen)
           If Sh.Range(Zellen(n)).Value = "" Then
               MsgBox "Pflichteintrag fehlt in: " & Sh.Name & " " & Sh.Range(Zellen(n)).Address
           End If
       Next n
    Next Sh
  4. Code ausführen: Führe das Makro aus, um die Pflichtfelder in allen Sheets zu überprüfen.


Häufige Fehler und Lösungen

  • Fehler: "Typen unverträglich": Dieser Fehler tritt auf, wenn Du versuchst, einen Wert in einer falschen Variablen zu speichern. Stelle sicher, dass die Variablen korrekt deklariert sind.

  • Fehler: "Zelle nicht gefunden": Achte darauf, dass die Zellen, die Du ansprichst, tatsächlich in den jeweiligen Worksheets vorhanden sind.

  • Lösung für leere Zellen: Wenn Du mehrere leere Zellen in einem Sheet überprüfen möchtest, stelle sicher, dass Du die Schleife richtig konfiguriert hast, um alle Zellen zu erfassen.


Alternative Methoden

Eine weitere Möglichkeit, um Zellen variabel anzusprechen, ist die Verwendung eines Arrays. Beispielsweise kannst Du die Zellen in einem Array definieren und dann durch dieses Array iterieren.

Dim Zellen() As String
Zellen = Array("B6", "C11", "C12")

Du kannst auch die Range-Methoden anpassen, um ganze Bereiche zu überprüfen:

For Each rng In Sh.Range("B6:C12")
    If rng.Value = "" Then
        ' Deine Logik hier
    End If
Next rng

Praktische Beispiele

Hier ist ein praktisches Beispiel, um alle Pflichtfelder in einem Workbook zu überprüfen:

Sub CheckMandatoryFields()
    Dim Wb As Workbook
    Set Wb = ActiveWorkbook
    Dim Zellen As Variant
    Zellen = Array("B6", "C11", "C12")

    Dim Sh As Worksheet
    For Each Sh In Wb.Worksheets
        Dim n As Integer
        For n = LBound(Zellen) To UBound(Zellen)
            If Sh.Range(Zellen(n)).Value = "" Then
                MsgBox "Pflichtfeld fehlt in: " & Sh.Name & " " & Sh.Range(Zellen(n)).Address
            End If
        Next n
    Next Sh
End Sub

Tipps für Profis

  • Verwendung von Union: Wenn Du mehrere leere Zellen auf einmal überprüfen möchtest, kannst Du die Union-Methode nutzen, um alle leeren Zellen zu sammeln und dann eine Nachricht auszugeben.

  • Bedingte Formatierungen: Nutze bedingte Formatierungen, um visuelle Hinweise für leere Pflichtfelder zu erstellen. Dies kann die Benutzerfreundlichkeit erhöhen.

  • Optimierung der Schleifen: Reduziere die Anzahl der Schleifen, um die Leistung Deines Codes zu verbessern, insbesondere bei großen Workbooks.


FAQ: Häufige Fragen

1. Wie kann ich die Pflichtfelder dynamisch anpassen?
Du kannst die Pflichtfelder in einer separaten Prozedur definieren und dann an Deine Schleife übergeben.

2. Funktioniert dieser Code in Excel 2010?
Ja, dieser Code sollte in Excel 2010 und neueren Versionen funktionieren. Beachte jedoch die Unterschiede in den Funktionen von bedingten Formatierungen in älteren Versionen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige