[VBA] Zellinhalt kopieren mit Bedingungen
#1
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?
Top
#2
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
[Bild: attachment-190.gif]
Gruß Günter
aus der Helden-, Messe-, Musik-, Buch-, Universitäts- und Autostadt Leipzig
Top
#3
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?!
lg Chris
Feedback nicht vergessen.
[Bild: v.gif]
3a2920576572206973742064656e20646120736f206e65756769657269672e
Top
#4
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
Top


Gehe zu:


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