Fehler in Range?

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
Bild

Betrifft: Fehler in Range?
von: PQuest:-)
Geschrieben am: 27.10.2015 21:57:24

Hallo,
bei folgendem Code

Sub CalColor()
Dim CalRow As Long, CalLastRow As Long 'first/last Row Calendar
Dim CalCol As Long, CalLastCol As Long 'first/last Column Calendar
Dim LoPRow As Long, LoPLastRow As Long 'first/last Row LoP
Dim LoPCol As Long, LoPLastCol As Long 'first/last Column LoP
Dim wsLoP As Worksheet, wsCal As Worksheet
Dim CalDay As Range 'Date from Calendar
Dim Counter As Integer 'Counter for hits in LoP
Dim rngLoPDates As Range   'Date Area in LoP
Dim rngCalArea As Range 'Calendar Area
Dim rngValence As Range 'Row with valence of columns
Set wsLoP = Worksheets("ListOfPatients")
Set wsCal = Worksheets("Calendar")
CalRow = 3
CalCol = 1
CalLastRow = wsCal.Cells(Rows.Count, CalCol).End(xlUp).Row
CalLastCol = wsCal.Cells(CalRow, Columns.Count).End(xlToLeft).Column
Set rngCalArea = Range(Cells(CalRow, CalCol), Cells(CalLastRow, CalLastCol))
LoPRow = 8
LoPLastRow = wsLoP.Cells(Rows.Count, CalRow).End(xlUp).Row
LoPCol = 4
LoPLastCol = 20
Set rngValence = Range(Cells(6, LoPCol), Cells(6, LoPLastCol))
Set rngLoPDates = Range(Cells(LoPRow, LoPCol), Cells(LoPLastRow, LoPLastCol))
For Each CalDay In Range(rngCalArea)
    Counter = DaysCount(CalDay, rngLoPDates, rngValence)
If Counter > 1 Then
CalDay.Interior.ColorIndex = 1 'big mistake workamount overflow
ElseIf Counter = 0.9 Or Counter = 1 Then
CalDay.Interior.ColorIndex = 2
ElseIf Counter = 0.6 Then
CalDay.Interior.ColorIndex = 3
ElseIf Counter = 0.3 Then
CalDay.Interior.ColorIndex = 4
End If
Next 'CalDay
End Sub
Steigt Excel mit der Fehlermeldung
Laufzeitfehler 1004 Anwendungs oder objektdefinierter Fehler
in der Zeile For Each CalDay In Range(rngCalArea)
aus.
Könnte mal jemand schauen, ob ich da einen Syntaxfehler eingebaut habe, oder ob es mal wieder meine verquerte Logik ist, die mir da ins Kreuz tritt?
Danke,
PQuest:-)

Bild

Betrifft: AW: Fehler in Range?
von: Peter Feustel
Geschrieben am: 27.10.2015 22:21:07
Hallo PQuest,
ich würde es einmal mit einer genaueren Referenzierung insbesondere bei den Set Befehlen versuchen
Set rngCalArea = Range(Cells(CalRow, CalCol), Cells(CalLastRow, CalLastCol))
In welchem Tabellenblatt bist du denn da gerade?
Das trifft ebenso auf die anderen Set zu und auch in dem For Each calDay In Range könnte evtl. eine Worksheet-Angabe gebrauchen.
Gruß Peter

Bild

Betrifft: AW: Fehler in Range?
von: Luschi
Geschrieben am: 27.10.2015 22:45:15
Hallo PQuest,
Du mußt sauberer referenzieren:
With wsCal
   CalLastRow = .Cells(.Rows.Count, CalCol).End(xlUp).Row
   CalLastCol = .Cells(CalRow, .Columns.Count).End(xlToLeft).Column
   Set rngCalArea = .Range(.Cells(CalRow, CalCol), .Cells(CalLastRow, CalLastCol))
End With
Da mit 'rngCalArea' bereits ein Range-Objekt ist genügt:
For Each CalDay In rngCalArea
Gruß von Luschi
aus klein-Paris

Bild

Betrifft: AW: Fehler in Range?
von: PQuest:-)
Geschrieben am: 28.10.2015 11:52:32
Yepp, das war's. ABER:
Vielleicht erst mal kurz, was passieren soll:
Wenn im Tabellenblatt "ListofPatients" etwas geändert wird, soll die Sub ausgeführt werden.
Sub übergibt Wert an Funktion (danke für die Funktion nochmal an Daniel), Funktion liefert Ergebnis zurück und Zellen werden aufgrund des Ergebnisses eingefärbt.

Private Sub Worksheet_Change(ByVal Target As Range) 'CalColor()
Dim CalRow As Long, CalLastRow As Long 'first/last Row Calendar
Dim CalCol As Long, CalLastCol As Long 'first/last Column Calendar
Dim LoPRow As Long, LoPLastRow As Long 'first/last Row LoP
Dim LoPCol As Long, LoPLastCol As Long 'first/last Column LoP
Dim wsLoP As Worksheet, wsCal As Worksheet
Dim CalDay As Range 'Date from Calendar
Dim Counter As Integer 'Counter for hits in LoP
Dim rngLoPDates As Range   'Date Area in LoP
Dim rngCalArea As Range 'Calendar Area
Dim rngValence As Range 'Row with valence of columns
Set wsLoP = Worksheets("ListOfPatients")
Set wsCal = Worksheets("Calendar")
CalRow = 3
CalCol = 1
With wsCal
    CalLastRow = .Cells(Rows.Count, CalCol).End(xlUp).Row
    CalLastCol = .Cells(CalRow, Columns.Count).End(xlToLeft).Column
    Set rngCalArea = .Range(.Cells(CalRow, CalCol), .Cells(CalLastRow, CalLastCol))
End With
LoPRow = 8
LoPCol = 4
LoPLastCol = 20
With wsLoP
    LoPLastRow = .Cells(Rows.Count, CalRow).End(xlUp).Row
    Set rngValence = .Range(.Cells(6, LoPCol), .Cells(6, LoPLastCol))
    Set rngLoPDates = .Range(.Cells(LoPRow, LoPCol), .Cells(LoPLastRow, LoPLastCol))
End With
For Each CalDay In rngCalArea
    Counter = DaysCount(CalDay, rngLoPDates, rngValence)
'If Counter > 1 Then
'CalDay.Interior.ColorIndex = 1 'big mistake workamount overflow
If Counter = 0.9 Or Counter = 1 Then
CalDay.Interior.ColorIndex = 2
ElseIf Counter = 0.6 Then
CalDay.Interior.ColorIndex = 3
ElseIf Counter = 0.3 Then
CalDay.Interior.ColorIndex = 4
End If
Next 'CalDay
End Sub

Die Funktion macht was sie soll. Ich habe sie in einem Tabellenblatt in eine Zelle eingefügt und es wird das richtige Ergebnis angezeigt.
Function DaysCount(sDate, DateArea As Range, ColValence As Range) As Double
Dim arrDateArea
Dim arrColValence
Dim r As Long, c As Long 'c=Column, r=Row
Dim Val As Double
arrDateArea = DateArea.Value 'Array DateArea mit DateArea füllen (Datumsbereich im LoP)
arrColValence = ColValence.Value 'Array ColValence mit ColValence füllen (Spaltenwertigkeit)

For r = 1 To UBound(arrDateArea, 1)
Val = 0
For c = 1 To UBound(arrDateArea, 2)
If arrDateArea(r, c) = sDate Then _
Val = WorksheetFunction.Max(Val, arrColValence(1, c))
Next
DaysCount = DaysCount + Val
Next

End Function
Einziges Ergebnis, was ich bisher erreicht habe: Alle leeren Zellen im Bereich wurden schwarz gefärbt. Darum habe ich den entsprechenden Befehl rausgenommen.
Wo liegt mein Fehler? Warum werden die Zellen nicht eingefärbt?
Gruß,
PQuest:-)

Bild

Betrifft: Dim Counter As Integer
von: Luc:-?
Geschrieben am: 28.10.2015 15:23:03
Da liegt dein Fehler, Peter!
Du übergibst Counter aber Double-Werte! Alles, was <1 ist, wird deshalb auf 0 abgerundet.
Tipp: Außerdem arbeitest du mit Xl14/2010. Da solltest du .Color verwenden, wenn du nicht die eine der 56 VBA-StandardIndexFarben haben willst, was hier aber nicht der Fall zu sein scheint.
Gruß, Luc :-?

Besser informiert mit …

Bild

Betrifft: AW: Dim Counter As Integer
von: PQuest:-)
Geschrieben am: 28.10.2015 20:39:29
Hallo Luc:-?
besten Dank.
Da ich weiss, dass jede Lösung bei mir neue Fragen aufwirft, sage iuch an dieser Stelle mal: "Bis nachher." :-)
PQuest:-)

Bild

Betrifft: AW: Dim Counter As Integer
von: PQuest:-)
Geschrieben am: 29.10.2015 00:26:50
Sorry, Frage war natürlich beantwortet. Da hat sich ein Klick einfach so eingeschlichen :-)

 Bild

Beiträge aus den Excel-Beispielen zum Thema "Fehler in Range?"