Marko: Daten aus mehreren Datein zusammenfügen

Servus wiedermal.

Ich bin halt am Aufbau einer besseren Planung, daher des öfters auf Hilfe angewiesen. Dazu herzlichen Dank im voraus.

Ich habe:
A’ Jahresplan (1 Tabellenblatt) und B’ Systemsplan (auch 1 TB) - diese pflegen alle Mitarbeiter.
Sowie einen detailierten C’ Monatsplan für die MA-Auslastungen - der wird von mir gehütet.

Ich möchte:
Aus dem A’ Jahresplan Zellen kopieren, falls diese die Farbe „Rot“ oder „violett“ haben, und im C’ Monatsplan reinkopieren. (Anm. Rot steht für Ferien, Violett für Spezialeinsatz).
Aus dem B’ Systemsplan ebenfalls Zellen kopieren, falls diese die Farbe „Grün“ aufweisen.

Das knifflige:

  1. Da ich im C’ Monatsplan wöchentlich Einträge mache (Farb+Text). dürfen diese nur überschrieben werden, wenn die obigen Bedingungen gesetzt sind.
  2. Muss ich jeweils die anderen Files offen haben, um das Makro ausführen zu können?

Das soll doch eine Herausforderung sein :wink:
Ich hoffe es ist genug verständlich geschrieben, danke für die Vorschläge.

Gruss Christian

Hi Christian,
wurden die Farben manuell oder mittels bedingter Formatierung erzeugt?
Nur im ersteren Fall kann man per vba die Farben direkt auslesen…

Grundsätzlich kann man nur aus geöffneten Dateien Zellwerte auslesen.
Mal von nem alten XL4-Makro abgesehen.
Gruß
Reinhard

Hi Christian,
wurden die Farben manuell oder mittels bedingter Formatierung
erzeugt?
Nur im ersteren Fall kann man per vba die Farben direkt
auslesen…

das kann man so ganz nicht sagen…
Beispiel:
sub test()
MsgBox Selection.FormatConditions(1).Interior.ColorIndex
end sub

das gibt - wenn bedingte Formatierung vorhanden ist die Farbe aus, die es anzeigt, wenn true zurückgeliefert wird.
Problem dabei ist allerdings, dass ich nicht weiss, wie man prüfen kann, ob die bedingung auch true ist :wink:
Wenn allerdings keine Formatierung da ist ists auch doof weil dann debuggt was *g*

Gruß
Munich

Hi Munich,

das gibt - wenn bedingte Formatierung vorhanden ist die Farbe
aus, die es anzeigt, wenn true zurückgeliefert wird.
Problem dabei ist allerdings, dass ich nicht weiss, wie man
prüfen kann, ob die bedingung auch true ist :wink:

tja, das ist das Problem, schon bei einer Bedingung, könnten ja 3 sein. Deshalb muss man jede Bedingung mit dem Zellinhalt verhleichen usw.

Wenn allerdings keine Formatierung da ist ists auch doof weil
dann debuggt was *g*

Nö, kannste vorher überprüfen mit
if …Formatconditions.count > 0 then

Aus dem Inet habe ich folgenden Code. Angenommen A1 hat die bed. Formatierung „=B1=10“ dann funktioniert wenn man ihn mit einer Schaltfläche startet.
Aber in einer Zelle als Funktion wie „=GetCellColor(A1)“ bringt der Code „#Wert“. Hängt irgendwie mit dem Nmaen definieren zusammen oder so.
Wenn man die Funktion über Einfügen Funktion Bentzerdefiniert, wird angezeigt dass diese Funktion braucht keine Argumente. !?

Gruß
Reinhard

Sub TestCellColor()
 MsgBox "Meine Farbe ist: " & GetCellColor(ActiveCell)
End Sub

Function GetCellColor(cell As Range) As Integer
 Dim i
 Dim myVal
 Dim myColor As Integer
 Dim done As Boolean

 On Error Resume Next
 Names("testname").Delete
 On Error GoTo 0

 Application.ReferenceStyle = xlR1C1
 myVal = cell.Value
 myColor = cell.Interior.ColorIndex
 done = False

 For i = 1 To cell.FormatConditions.Count
 With cell.FormatConditions.Item(i)
 If .Type = 1 Then
 Select Case .Operator
 Case xlBetween
 If myVal \>= Evaluate(.Formula1) And myVal Evaluate(.Formula1) Then
 myColor = .Interior.ColorIndex
 done = True
 End If
 Case xlGreaterEqual
 If myVal \>= Evaluate(.Formula1) Then
 myColor = .Interior.ColorIndex
 done = True
 End If
 Case xlLess
 If myVal Evaluate(.Formula2) Then
 myColor = .Interior.ColorIndex
 done = True
 End If
 Case xlNotEqual
 If myVal Evaluate(.Formula1) Then
 myColor = .Interior.ColorIndex
 done = True
 End If
 End Select
 ElseIf .Type = 2 Then
 Names.Add Name:="testname", RefersToR1C1Local:=.Formula1
 If Evaluate("testname") Then
 myColor = .Interior.ColorIndex
 done = True
 End If
 Names("testname").Delete
 Else
 MsgBox "Unbekannter Formattyp: " & .Type
 Exit Function
 End If
 End With
 If done Then Exit For
 Next
 Application.ReferenceStyle = xlA1
 GetCellColor = myColor
End Function

Guten Morgen,

Also ich verstehe nur Bahnhof was Ihr da diskutiert habt.
In den Tabellen „Jahresplan“ und „Systemsplan“ werden die Zellen manuell gefärbt.

Mit dem angehängten Marko-Code habe ich noch nichts anfangen können, weil ich den Bezug zu den einzelnen Files (namentlich „Jahresplan“ + „Systemsplan“) nicht eruieren kann.

Gruss Christian

Hi Christian,

Also ich verstehe nur Bahnhof was Ihr da diskutiert habt.

es ging um die problematik die Farbe von per bed. Formatierung gefärbten Zellen auszulesen.

In den Tabellen „Jahresplan“ und „Systemsplan“ werden die
Zellen manuell gefärbt.

Diese Info ist wichtig.

Mit dem angehängten Marko-Code habe ich noch nichts anfangen
können, weil ich den Bezug zu den einzelnen Files (namentlich
„Jahresplan“ + „Systemsplan“) nicht eruieren kann.

Es fehlen noch Infos von dir zur Struktur der Dateien. In „Jahresplan“ und/oder „Systemsplan“ sind z.B. A13 G34 U12 bunt, wohin damit in der Datei C? In die gleichen Zelladressen? Was tun wenn A13 in A und B gefärbt ist, welcher Wert soll dann nach C?
Gruß
Reinhard

Hallo Reinhard

oke, ich versuchs aufzuzählen:

Wenn im Jahresplan die Zellen D50:smiley:65 - DV50:smiley:V65 Rot oder Violett sind, soll es diese im Monatsplan in D50:smiley:65 - DV50:smiley:V65 reinpinseln.
Wenn im Systemsplan die Zellen C50:C65 - DU50:smiley:U65 Grün formatiert sind, soll es im Monatsplan in D50:smiley:65 - DV50:smiley:V65 reinpinseln.

Wobei hier der Jahresplan die höhere Priorität hat, als der Systemsplan.

Hoffe somit die nötigen Daten „geliefert“ zu haben.

Dankeschön.

Gruss Christian

Hallloooo (Echooo) Reinhard???

Gibts Dich noch?

Wenn im Jahresplan die Zellen D50:smiley:65 - DV50:smiley:V65 Rot oder
Violett sind, soll es diese im Monatsplan in D50:smiley:65 -
DV50:smiley:V65 reinpinseln.
Wenn im Systemsplan die Zellen C50:C65 - DU50:smiley:U65 Grün
formatiert sind, soll es im Monatsplan in D50:smiley:65 - DV50:smiley:V65
reinpinseln.
Wobei hier der Jahresplan die höhere Priorität hat, als der
Systemsplan.

Sorry Christian,
hatte dich vergessen :smile:

ungetestet habe ich mal was zusammen gebastelt. In deiner Monatstabelle:
Alt+F11, Einfügen Modul , in diese Modul den Code kopieren, Editor schliessen. Im Bereich A1:A3 die zellen nach Wunsch färben. Dann über Extras–Makro–Makro–Ausführen das Makro „farbe“ ausführen, somit hast du die Werte für rot, violett, grün.
Mit Extras–Makro–Makro–bearbeiten das Makro tt bearbeiten, also die Farbwerte 10,12,14 durch deine ermitteltenersetzen, Editor schliessen.
Dann extras–Makro-Makro–tt–Ausführen.

ups, Code vergessen:smile:

Option Explicit

Sub tt()
Dim wsJ As Worksheet, wsS As Worksheet, zei As Long, spa As Integer
Workbooks.Open "c:\GenauePfadAngabe\Jahresplan.xls"
Set wsJ = ActiveWorkbook.Worksheets("Tabelle1")
Workbooks.Open "c:\GenauePfadAngabe\Systemplan.xls"
Set wsS = ActiveWorkbook.Worksheets("Tabelle1")
With ThisWorkbook.Worksheets("Tabelle1")
 For zei = 50 To 65
 For spa = 4 To .Range("DU65").Column
 If wsJ.Cells(zei, spa).Interior.ColorIndex = 10 Or wsJ.Cells(zei, spa).Interior.ColorIndex = 12 Then
 .Cells(zei, spa) = wsJ.Cells(zei, spa).Value
 .Cells(zei, spa).Interior.ColorIndex = wsJ.Cells(zei, spa).Interior.ColorIndex
 ElseIf wsS.Cells(zei, spa - 1).Interior.ColorIndex = 14 Then
 .Cells(zei, spa) = wsS.Cells(zei, spa - 1).Value
 .Cells(zei, spa).Interior.ColorIndex = wsS.Cells(zei, spa - 1).Interior.ColorIndex
 Else
 'tu nix
 End If
 Next spa
 Next zei
Workbooks("Jahresplan.xls").Close
Workbooks("Systemplan.xls").Close
End With
End Sub

Sub farbe()
Dim n
For n = 1 To 3
 MsgBox Cells(n, 1).Interior.ColorIndex
Next n
End Sub

Gruß
Reinhard

Wow! Es klappt!
Jupiiii…!

Danke vielmals Reinhard.

Du Reinhard, jetzt habe ich noch eine Zusatzfrage. (Wenn es erlaubt ist?)
In einem weiteren Schritt möchte ich die Betriebsmittelverfügbarkeit in meiner Auftragsübersicht darstellen.
Simpel mit hellgrüner oder rosafarbener Zellenschattierung.
Hierfür habe ich in Tabellenblatt2 die nötigen verknüpfungen erichtet (wenn - dann zähler).

Meine Bedingung nun (im gleichem Worksheet):
Tabelle1 - Spalte 3 ab Zeile 4 bis n > wenn der Name „Data“ steht, dann prüfe in Tabelle2 ob in Zelle 10 eine 1 oder eine 0 steht.
Wenn 1 dann fülle in Spalte 4 ab Zeile 4 bis n mit hellgrüner Farbe aus, wenn 0 steht, dann mit rosafarbe.

Ich habe versucht Dein „VorlageMarko“ umzuändern, aber mit den Bedingungen klappt dies nicht.

Kannst Du mir nochmals bitte helfen Master?
Herzlichen Dank und Gruss
Christian

Hi Christian,

Tabelle1 - Spalte 3 ab Zeile 4 bis n

ist klar

Tabelle2 ob in Zelle 10

ist unklar, 10 - n ?, welche Spalte?

Spalte 4 ab Zeile 4 bis n

in Tabelle1 oder 2?

Wie sind denn die 2 Farbwerte?

Gruß
Reinhard

Hi Reinhard

Sorry !! ->

In der Tabelle2 soll es in der Zelle C10 (und nur dort, also keine mehrauswahl) nachschauen.

In der Tabelle1 soll er ab Spalte 4 und Zeile 4 bis n die Zellen ausfüllen, wenn in der Tabelle 2 Zelle C10 eine 1 steht = Farbcode 35 (hellgrün) und bei einer 0 den Farbcode 22 (Rosa).

Kann man statt des vollständigen Namen „Data“ auch bezwecken, dass es dies macht, wenn der Name „Data“ enthalten ist. Also nicht 1:1 übersetzt, sondern nur beinhaltet ist? (Bsp: Data #039-63)

(Weil ich die Serialnummern jeweils im Namen anfüge als #039XXX)

Ich hoffe Dir meine Gedanken näher gebracht zu haben. Wünsche Dir ein schönes Wochenende,
Cheers Christian

In der Tabelle2 soll es in der Zelle C10 (und nur dort, also
keine mehrauswahl) nachschauen.
In der Tabelle1 soll er ab Spalte 4 und Zeile 4 bis n die
Zellen ausfüllen, wenn in der Tabelle 2 Zelle C10 eine 1 steht
= Farbcode 35 (hellgrün) und bei einer 0 den Farbcode 22
(Rosa).

Kann man statt des vollständigen Namen „Data“ auch bezwecken,
dass es dies macht, wenn der Name „Data“ enthalten ist. Also
nicht 1:1 übersetzt, sondern nur beinhaltet ist? (Bsp: Data
#039-63)

k.A. ob ich noch mit den Spalten und Bedingungen durchblicke *g

Option Explicit

Sub tt()
Dim Zei As Long, Wert
Wert = Worksheets("Tabelle2").Range("C10")
If CStr(Wert) "1" And CStr(Wert) "0" Then Exit Sub
With Worksheets("Tabelle1")
 For Zei = 1 To .Range("D65536").End(xlUp).Row
 If .Cells(Zei, 3) Like "Data\*" Then .Cells(Zei, 4).Interior.ColorIndex = IIf(CStr(Wert) = "1", 35, 22)
 Next Zei
End With
End Sub

Gruß
Reinhard

Hoi Reinhard

danke ich habs probiert, es geht nicht. Meine Frage zu Dem Makro:

  • If CStr(Wert) „1“ And CStr(Wert) „0“ Then Exit Sub => Wie ist das gemeint? Ich lese daraus, dass wenn ich 1 oder 0 habe soll es beenden?!
  • If .Cells(Zei, 3) Like „Data*“ => Ich lese, immer vorausgesetzt ich bin laie, dass es in Zeile 3 den Wert Data* lesen soll. Richtig? Ich meinte dies in Spalte c, bzw. Spalte 3.

Sehe ich das falsch?

danke ich habs probiert, es geht nicht. Meine Frage zu Dem
Makro:

  • If CStr(Wert) „1“ And CStr(Wert) „0“ Then
    Exit Sub => Wie ist das gemeint? Ich lese daraus, dass wenn
    ich 1 oder 0 habe soll es beenden?!
  • If .Cells(Zei, 3) Like „Data*“ => Ich lese, immer
    vorausgesetzt ich bin laie, dass es in Zeile 3 den Wert Data*
    lesen soll. Richtig? Ich meinte dies in Spalte c, bzw. Spalte

Sehe ich das falsch?

Hallo Christian, nein du siehst das alles korrekt. Ich habe da wohl die falsche Logok gehabt mit 0 und 1.

Probiers mal so:

Sub tt()
Dim Zei As Long, Wert
Wert = Worksheets("Tabelle2").Range("C10")
If CStr(Wert) = "1" Or CStr(Wert) = "0" Then 
 With Worksheets("Tabelle1")
 For Zei = 1 To .Range("D65536").End(xlUp).Row
 If .Cells(Zei, 3) Like "Data\*" Then .Cells(Zei,4).Interior.ColorIndex = IIf(CStr(Wert) = "1", 35, 22)
 Next Zei
 End With
End If
End Sub

Gruß
Reinhard