Clever-Excel-Forum

Normale Version: [VBA] Zellinhalt kopieren mit Bedingungen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hi,

ich schaue im Blatt Controlling, ob in der Zelle ein Datum, ein "x" oder nix steht.

Bei Datum oder "x" soll dieses stehen bleiben, sonst ein "-" oder leer.

Alles klappt, nur das x wird überschrieben, bzw. gelöscht, siehe der Code:
   With Sheets("Controlling")
      .Unprotect 'Passwort 
      .Range("A4:A103").ClearContents
      .Range("A4:A103").Value = Sheets("Ergebnis").Range("A4:A103").Value
      .Range("B3:CW3").Value = Sheets("Ergebnis").Range("B3:CW3").Value
      
      'Leeren aller Zellen mit "-", hier müßte eigentlich die Zelle mit "x" ebenfalls bestehen bleiben 
      .Range("B4:CW103").SpecialCells(xlCellTypeConstants, xlTextValues).ClearContents
      
      'Übertragen der Inhalte der Hilfstabelle 
      For j = 2 To 101                             '100 Spalten: B bis CW 
         For i = loMatrixStart To loMatrixEnde     '100 Zeilen: 4 bis 103 
            'wenn im Controlling-Blatt ein Datum oder ein x steht, soll der Inhalt bleiben 
            If Not (IsDate(.Cells(i, j)) Or .Cells(i, j) = "x") Then
               'wenn eine Zahl in der Hilfstabelle steht, soll der Zellinhalt beibehalten werden, bei 0 ein "-" 
               If Sheets("Hilfstabelle").Cells(i, j).Value > 0 Then
                  .Cells(i, j).Value = .Cells(i, j).Value
               Else
                  .Cells(i, j).Value = "-"
               End If
            End If
         Next i
      Next j
      .Protect 'Passwort 
   End With

Wie kann ich das verhindern?
Hallo Ralf,

mit dieser Zeile

If Not (IsDate(Sheets("Controlling").Cells(i, j)) Or Sheets("Controlling").Cells(i, j) = "x") Then

entscheidest du, dass entweder eine Zahl übernommen oder ein "-" eingetragen wird, damit ist das "x" weg!
Laß einmal den Teil

Or Sheets("Controlling").Cells(i, j) = "x")

weg oder du musst die Bedingung anders formulieren, evtl. so:

If IsDate(Sheets("Controlling").Cells(i, j)) = True Or Sheets("Controlling").Cells(i, j) = "x" Then
Hi,
Ich verstehe auch nicht die Angabe  Blush

Zitat:ich schaue im Blatt Controlling, ob in der Zelle ein Datum, ein "x" oder nix steht.

Bei Datum oder "x" soll dieses stehen bleiben, sonst ein "-" oder leer.

Du willst das was eigentlich schon vorliegt programmieren, damit wieder das gleiche rauskommt wie im Ausgangszustand?

.Range("B4:CW103").SpecialCells(xlCellTypeConstants, xlTextValues).ClearContents
da löscht du auch schon alle x oder nicht?
den x ist ja auch Text....
und warum sollten "-" in die Zellen? neben + und = das denkbar schlechteste Zeichen, ich hoffe mal keiner macht in solchen Zellen einen Doppelklick.
Wie wäre es mit formatieren?
Oder ist dies nicht möglich?!
Hallo,

nun zur Erläuterung die Vorgehensweise:

Ich habe im Blatt Ergebnis eine Matrix an Maßnahmen (Spalten) gegenüber Personen (Zeilen), die durch MMULT() automatisch erstellt wird. Da stehen in den Zellen Zahlen von 0 bis ?? (wird durch das MMULT eingetragen) drin.
Es gibt ein Controllingblatt mit denselben Zeilen- und Spaltenköpfen, in dem der Bearbeiter manuell das Datum der stattgefundenen Maßnahme einträgt.

Nun erstelle ich mit dem geänderten Makro (siehe unten) im Controlling-Blatt ebenfalls die Matrix.
Wenn im Ergebnis-Blatt eine Zahl > 0 drin steht, dann lösche die entsprechende Zelle im Controlling-Blatt, es sei denn, dort steht ein Datum oder ein anderes Zeichen (momentan das x). Das Löschen aller Zellen im Controlling-Blatt erfolgt, damit bei Änderungen nicht die alten Werte stehen bleiben.
Wenn im Ergebnis-Blatt eine 0 steht, dann trage im Controlling-Blatt ein "-" ein, denn ich brauche ein Zeichen, damit nicht die 0 als Datum angezeigt wird.
Legende Controlling:
Datum: Maßnahme hat stattgefunden
Leer: Maßnahme muß noch stattfinden
- : keine Maßnahme erforderlich

Dies führt dann zu folgendem Bild:
Arbeitsblatt mit dem Namen 'Controlling'
QR
4-01.11.2017
5-
6-01.11.2017
7-
8-01.11.2017

Zellebedingte Formatierung...Format
Q41: Q4=""abc
Q42: Zellwert ist gleich =0abc
Q43: Q4>0+Q4<>"-"abc
Verwendete Systemkomponenten: [Windows (32-bit) NT 6.01] MS Excel 2013
Diese Tabelle wurde mit Tab2Html (v2.6.0) erstellt. ©Gerd alias Bamberg

Zum Test habe ich gerade das Hilfsblatt im Makro entfernt bzw. durch "Ergebnis" ersetzt. Daraus folgt bisher das selbe Aussehen.

Hier das geänderte Makro:
Sub ControllingBlatt_anlegen()
  '
  'Variablen im mdl_Variablen
  '
  'Konstanten
  loMatrixStart = 4
  loMatrixEnde = 103
  loMaßnahmeStart = 9
  '
  With Application
     .ScreenUpdating = False
     .EnableEvents = False
  End With
 
'   With Sheets("Hilfstabelle")
'      For j = 2 To 101                          '100 Spalten: B bis CW
'         For i = loMatrixStart To loMatrixEnde  '100 Zeilen: 4 bis 103
'            .Cells(i, j).Value = Sheets(strErgebnis).Cells(i, j).Value
'         Next i
'      Next j
'   End With
 
  With Sheets("Controlling")
     .Unprotect 'Passwort
     .Range("A4:A103").ClearContents
     .Range("A4:A103").Value = Sheets("Ergebnis").Range("A4:A103").Value
     .Range("B3:CW3").Value = Sheets("Ergebnis").Range("B3:CW3").Value
     
     'Leeren aller Zellen mit "-"
     .Range("B4:CW103").SpecialCells(xlCellTypeConstants, xlTextValues).ClearContents
     
     'Übertragen der Inhalte des Ergebnis-Blatts
     For j = 2 To 101                             '100 Spalten: B bis CW
        For i = loMatrixStart To loMatrixEnde     '100 Zeilen: 4 bis 103
           'wenn im Controlling-Blatt ein Datum oder ein x steht, soll der Inhalt bleiben
           If Not (IsDate(.Cells(i, j))) Then ' Or .Cells(i, j) = "x") Then
              'wenn eine Zahl im Ergebnis-Blatt steht, soll das Datum oder das x oder leer bestehen bleiben, bei 0 ein "-"
              If Sheets("Ergebnis").Cells(i, j).Value > 0 Then
                 .Cells(i, j).Value = .Cells(i, j).Value
              Else
                 .Cells(i, j).Value = "-"
              End If
           End If
        Next i
     Next j
     .Protect 'Passwort
  End With
  'Sheets("Hilfstabelle").Range("B3:CW103").ClearContents
 
  With Application
     .ScreenUpdating = True
     .EnableEvents = True
  End With
 
End Sub


edit:
Ich glaube, ich habe durch umbauen der If-Schleifen die richtigen Eintragungen erreicht. Da alle Zellen angefasst und beschrieben werden, kann das komplette Löschen entfallen:
      'Leeren aller Zellen mit "-" 
     '      .Range("B4:CW103").SpecialCells(xlCellTypeConstants, xlTextValues).ClearContents
     
     'Übertragen der Inhalte des Ergebnis-Blatts unter Beachtung der Controlling-Einträge
     For j = 2 To 101                             '100 Spalten: B bis CW
        For i = loMatrixStart To loMatrixEnde     '100 Zeilen: 4 bis 103
           'wenn eine Zahl >0 im Ergebnis-Blatt steht, soll in Controlling das Datum oder das x oder leer bestehen bleiben, bei 0 ein "-"
           If Sheets("Ergebnis").Cells(i, j).Value > 0 Then
              'wenn im Controlling-Blatt ein Datum oder ein x steht, soll der Inhalt bleiben
              If IsDate(.Cells(i, j)) Or .Cells(i, j) = "x" Then
                 'Maßnahme hat schon stattgefunden
                 .Cells(i, j).Value = .Cells(i, j).Value
              Else
                 'Maßnahme muß durchgeführt werden
                 .Cells(i, j).Value = ""
              End If
           Else
              'Maßnahme muß nicht durchgeführt werden
              .Cells(i, j).Value = "-"
           End If
        Next i
     Next j