Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1508to1512
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA - Matrixl mit mehreren Ergebnissen optimieren

VBA - Matrixl mit mehreren Ergebnissen optimieren
29.08.2016 22:02:06
Kasimir
Hallo zusammen,
ich habe eine Excelfile mit zwei Tabellenbittern. Im ersten Tabellenblatt sind Veranstaltungen aufgelistet mit Anfangsdatum und Enddatum.
Auf dem zweiten ist ein Jahreskalender. Hier sollen pro Tag überprüft werden, ob eine Veranstaltung ansteht für diesen Tag.
Meine jetzige erfüllt zwar seinen Zweck. Aber er ist sehr sehr schlecht und langsam. Meine VBA Kenntnisse haben nicht für mehr angepasst. Kann den Code optimieren, damit er schneller wird? Pro Tag sind es aktuell max. 4 Veranstaltungen.
Eine Beispielsdatei folgt gleich.
Hier ein Auszug aus der Formel - exemplarisch für die ersten Januartage
Sub Januar()
Cells(3, 2).FormulaArray = _
"=IFERROR(INDEX(Veranstaltung,SMALL(IF(Anfangsdatum=RC[-1],ROW(R1:R999)),ROW(Veranstaltungen!R1C2))),"""")
&CHAR(10)&IFERROR(INDEX(Veranstaltung,SMALL(IF(Anfangsdatum=RC[-1],ROW(R1:R999)),ROW(Veranstaltungen!R2C2))),"""")"
Cells(3, 2).Copy
Cells(3, 2).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Cells(3, 3).FormulaArray = _
"=IFERROR(INDEX(Veranstaltung,SMALL(IF(Anfangsdatum=RC[-2],ROW(R1:R999)),ROW(Veranstaltungen!R3C2))),"""")
&CHAR(10)&IFERROR(INDEX(Veranstaltung,SMALL(IF(Anfangsdatum=RC[-2],ROW(R1:R999)),ROW(Veranstaltungen!R4C2))),"""")"
Cells(3, 3).Copy
Cells(3, 3).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Cells(4, 2).FormulaArray = _
"=IFERROR(INDEX(Veranstaltung,SMALL(IF(Anfangsdatum=RC[-1],ROW(R1:R999)),ROW(Veranstaltungen!R1C2))),"""")
&CHAR(10)&IFERROR(INDEX(Veranstaltung,SMALL(IF(Anfangsdatum=RC[-1],ROW(R1:R999)),ROW(Veranstaltungen!R2C2))),"""")"
Cells(4, 2).Copy
Cells(4, 2).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Cells(4, 3).FormulaArray = _
"=IFERROR(INDEX(Veranstaltung,SMALL(IF(Anfangsdatum=RC[-2],ROW(R1:R999)),ROW(Veranstaltungen!R3C2))),"""")
&CHAR(10)&IFERROR(INDEX(Veranstaltung,SMALL(IF(Anfangsdatum=RC[-2],ROW(R1:R999)),ROW(Veranstaltungen!R4C2))),"""")"
Cells(4, 3).Copy
Cells(4, 3).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Cells(5, 2).FormulaArray = _
"=IFERROR(INDEX(Veranstaltung,SMALL(IF(Anfangsdatum=RC[-1],ROW(R1:R999)),ROW(Veranstaltungen!R1C2))),"""")
&CHAR(10)&IFERROR(INDEX(Veranstaltung,SMALL(IF(Anfangsdatum=RC[-1],ROW(R1:R999)),ROW(Veranstaltungen!R2C2))),"""")"
Cells(5, 2).Copy
Cells(5, 2).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Cells(5, 3).FormulaArray = _
"=IFERROR(INDEX(Veranstaltung,SMALL(IF(Anfangsdatum=RC[-2],ROW(R1:R999)),ROW(Veranstaltungen!R3C2))),"""")
&CHAR(10)&IFERROR(INDEX(Veranstaltung,SMALL(IF(Anfangsdatum=RC[-2],ROW(R1:R999)),ROW(Veranstaltungen!R4C2))),"""")"
Cells(5, 3).Copy
Cells(5, 3).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Cells(6, 2).FormulaArray = _
"=IFERROR(INDEX(Veranstaltung,SMALL(IF(Anfangsdatum=RC[-1],ROW(R1:R999)),ROW(Veranstaltungen!R1C2))),"""")
&CHAR(10)&IFERROR(INDEX(Veranstaltung,SMALL(IF(Anfangsdatum=RC[-1],ROW(R1:R999)),ROW(Veranstaltungen!R2C2))),"""")"
Cells(6, 2).Copy
Cells(6, 2).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Cells(6, 3).FormulaArray = _
"=IFERROR(INDEX(Veranstaltung,SMALL(IF(Anfangsdatum=RC[-2],ROW(R1:R999)),ROW(Veranstaltungen!R3C2))),"""")
&CHAR(10)&IFERROR(INDEX(Veranstaltung,SMALL(IF(Anfangsdatum=RC[-2],ROW(R1:R999)),ROW(Veranstaltungen!R4C2))),"""")"
Cells(6, 3).Copy
Cells(6, 3).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Gruß
Kasimir

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA - Matrixl mit mehreren Ergebnissen optimieren
30.08.2016 11:55:28
baschti007
Hey Kasimir
Ich habe hier ein kleines Bsp.

Sub Create()
Application.DisplayAlerts = False
Dim Ws1 As Worksheet
Dim Ws2 As Worksheet
Dim x As Date
Dim i As Long
Dim c As Range
i = 2
ThisWorkbook.Worksheets("Overview").Delete
Set Ws1 = ThisWorkbook.Worksheets("Veranstaltungen")
Set Ws2 = Worksheets.Add
Ws2.Name = "Overview"
Call Jahreskalender_anlegen
Do
If Ws1.Cells(i, 2).Value = "" Then Exit Do
For x = Ws1.Cells(i, 2) To Ws1.Cells(i, 3)
Set c = Ws2.UsedRange.Find(Format(x, "DDD DD.MM.YYY"), LookIn:=xlFormulas, LookAt:=xlWhole)
If c Is Nothing Then Exit Sub
If c.Offset(0, 1) = "" Then
c.Offset(0, 1) = Ws1.Cells(i, 6)
Else
c.Offset(0, 1) = c.Offset(0, 1) & " , " & Ws1.Cells(i, 6)
End If
c.Offset(0, 1).Interior.ColorIndex = 45
Next
i = i + 1
Loop
Ws2.UsedRange.Cells.EntireColumn.AutoFit
End Sub
Sub Jahreskalender_anlegen()
'legt für das aktuelle Jahr einen Kalender an
Dim Jahr As String
Dim Monat As Integer, Tag As Integer, AnzTage As Integer
Dim d As Date
On Error GoTo Fehler
Jahr = Year(Date)
For Monat = 1 To 24 ' Hier anzahl der Monate anpassen wenn 12 dann dieses Jahr wenn 24 dann  _
Dieses Jahr und 2017
'Anzahl Tage des Monats
AnzTage = DateSerial(Year(Now), Monat + 1, 1) _
- DateSerial(Year(Now), Monat, 1)
Cells(1, Monat + i) = Format(DateSerial(Year(Now), Monat, 1), "MMM YYYY")
Cells(1, Monat + i + 1) = "Veranstaltungen"
For Tag = 1 To AnzTage
With Cells(1 + Tag, Monat + i)
d = DateSerial(Jahr, Monat, Tag)
.Value = Format(d, "DDD DD.MM.YYY")
If (Format(d, "DDD") = "Sa" Or Format(d, "DDD") = "So") Then .Interior.ColorIndex =  _
15
End With
Next Tag
Tag = 1
i = i + 1
Next Monat
Exit Sub
Fehler:
MsgBox "FehlerNr.: " & Err.Number & vbNewLine & vbNewLine _
& "Beschreibung: " & Err.Description _
, vbCritical, "Fehler"
End Sub
Gruß Basti
Anzeige
AW: VBA - Matrixl mit mehreren Ergebnissen optimieren
30.08.2016 12:59:32
kasimir
Hi Basti,
vielen vielen Dank für den Code.
Er auf jedenfall schöner und schneller. Aber irgendwas mache ich noch falsch.
Hier mal ein Auszug vom Ergebnis. Unter Veranstaltung wird nicht aufgeführt :(
Jan 16 Veranstaltungen
Fr 01.01.2016
Sa 02.01.2016
So 03.01.2016
Mo 04.01.2016
Di 05.01.2016
Ich muss mir mal heute abend deinen Code in Ruhe anschauen.
Gruß
kasimir
AW: VBA - Matrixl mit mehreren Ergebnissen optimieren
30.08.2016 13:05:23
baschti007
Hey du musst den Code "Create" Starten nicht "Jahreskalender_anlegen"
Gruß Basti

Sub Create()
Application.DisplayAlerts = False
Dim Ws1 As Worksheet
Dim Ws2 As Worksheet
Dim x As Date
Dim i As Long
Dim c As Range
i = 2
ThisWorkbook.Worksheets("Overview").Delete
Set Ws1 = ThisWorkbook.Worksheets("Veranstaltungen")
Set Ws2 = Worksheets.Add
Ws2.Name = "Overview"
Call Jahreskalender_anlegen
Do
If Ws1.Cells(i, 2).Value = "" Then Exit Do
For x = Ws1.Cells(i, 2) To Ws1.Cells(i, 3)
Set c = Ws2.UsedRange.Find(Format(x, "DDD DD.MM.YYYY"), LookIn:=xlFormulas, LookAt:=xlWhole)
If c Is Nothing Then Exit Sub
If c.Offset(0, 1) = "" Then
c.Offset(0, 1) = Ws1.Cells(i, 6)
Else
c.Offset(0, 1) = c.Offset(0, 1) & " , " & Ws1.Cells(i, 6)
End If
c.Offset(0, 1).Interior.ColorIndex = 45
Next
i = i + 1
Loop
Ws2.UsedRange.Cells.EntireColumn.AutoFit
Call rahmen
End Sub
Sub Jahreskalender_anlegen()
'legt für das aktuelle Jahr einen Kalender an
Dim Jahr As String
Dim Monat As Integer, Tag As Integer, AnzTage As Integer
Dim d As Date
On Error GoTo Fehler
Jahr = Year(Date)
For Monat = 1 To 24 ' Hier anzahl der Monate anpassen wenn 12 dann dieses Jahr wenn 24 dann  _
Dieses Jahr und 2017
'Anzahl Tage des Monats
AnzTage = DateSerial(Year(Now), Monat + 1, 1) _
- DateSerial(Year(Now), Monat, 1)
With ActiveSheet.Cells(1, Monat + i)
.Value = Format(DateSerial(Year(Now), Monat, 1), "MMM YYYY")
.Offset(0, 1) = "Veranstaltungen"
.Font.Bold = True
.Offset(0, 1).Font.Bold = True
.Font.Size = 12
.Offset(0, 1).Font.Size = 12
End With
For Tag = 1 To AnzTage
With Cells(1 + Tag, Monat + i)
d = DateSerial(Jahr, Monat, Tag)
.Value = Format(d, "DDD DD.MM.YYYY")
If (Format(d, "DDD") = "Sa" Or Format(d, "DDD") = "So") Then .Interior.ColorIndex =  _
15
End With
Next Tag
Tag = 1
i = i + 1
Next Monat
Exit Sub
Fehler:
MsgBox "FehlerNr.: " & Err.Number & vbNewLine & vbNewLine _
& "Beschreibung: " & Err.Description _
, vbCritical, "Fehler"
End Sub

Anzeige
AW: VBA - Matrixl mit mehreren Ergebnissen optimieren
30.08.2016 14:04:06
kasimir
Hi,
ja das mache ich auch. Allerding ist im "Create" der Befehl "Call Jahreskalender_anlegen"
Ein Frage noch. Du hast hier jetzt ein Call rahmen eingebaut. Für was ist der
Loop
Ws2.UsedRange.Cells.EntireColumn.AutoFit
Call rahmen
End Sub
AW: VBA - Matrixl mit mehreren Ergebnissen optimieren
30.08.2016 14:30:10
baschti007
Ja Sorry den Rahmen hatte ich bei mir aber einfach rauslöschen dann läuft das Makro.
Gruß Basti
AW: VBA - Matrixl mit mehreren Ergebnissen optimieren
30.08.2016 14:59:16
kasimir
hi,
danke. Ich teste es heute abend nochmal in ruhe.
Gruß
kasimir
AW: VBA - Matrixl mit mehreren Ergebnissen optimieren
30.08.2016 15:37:28
kasimir
top geht :)
AW: VBA - Matrixl mit mehreren Ergebnissen optimieren
30.08.2016 15:42:50
baschti007
Super =D
Schönen Tag noch
AW: VBA - Matrixl mit mehreren Ergebnissen optimieren
31.08.2016 22:42:48
kasimir
Hallo zusammen,
eine kleine Frage hätte ich noch. Beim Jahreskalender werden bei mir die Tagen als Format "Text" angelegt. Wie müsste ich den Code umschreiben, damit die Wert als Datumsformat sind?
VG
kasimir
Anzeige
AW: VBA - Matrixl mit mehreren Ergebnissen optimieren
01.09.2016 10:19:39
kasimir
Hi,
anbei die Beispieldatei mit dem leicht modifizierten Code.
Ich würde gerne Bedingteformatierungen verwenden. Allerding werden die Werte im Kalender als "Text" eingetragen, weshalb die Bedingte Formatierung nicht funktioniert.
https://www.herber.de/bbs/user/107935.xlsm
Gruß
kasimir
AW: VBA - Matrixl mit mehreren Ergebnissen optimieren
01.09.2016 12:38:39
baschti007
Hey Mach das doch einfach gleich beim Kalender anlegen .

Sub Jahreskalender_anlegen()
'legt für das aktuelle Jahr einen Kalender an
Dim Jahr As String
Dim Monat As Integer, Tag As Integer, AnzTage As Integer
Dim d As Date
Dim c As Range
Dim dict As Object
Set dict = CreateObject("scripting.Dictionary")
With dict
.CompareMode = BinaryCompare
On Error GoTo Fehler
For Each c In Range("Feiertag")
If Not .Exists(c.Value) Then
.Add c.Value, 1
End If
Next
End With
Jahr = Year(Date)
i = 1
For Monat = 1 To 24 ' Hier anzahl der Monate anpassen wenn 12 dann dieses Jahr wenn 24  _
dann _
Dieses Jahr und 2017
'Anzahl Tage des Monats
AnzTage = DateSerial(Year(Now), Monat + 1, 1) _
- DateSerial(Year(Now), Monat, 1)
Cells(2, Monat + i) = Format(DateSerial(Year(Now), Monat, 1), "MMM YYYY")
Cells(2, Monat + i + 1) = " "
For Tag = 1 To AnzTage
With Cells(2 + Tag, Monat + i)
d = DateSerial(Jahr, Monat, Tag)
.Value = Format(d, "DDD DD.MM.YYYY")
If (Format(d, "DDD") = "Sa" Or Format(d, "DDD") = "So") Then .Interior.ColorIndex =  _
15
If dict.Exists(d) Then .Interior.ColorIndex = 3 ' Hier Farbe für Feiertage
End With
Next Tag
Tag = 1
i = i + 1
Next Monat
Exit Sub
Fehler:
MsgBox "FehlerNr.: " & Err.Number & vbNewLine & vbNewLine _
& "Beschreibung: " & Err.Description _
, vbCritical, "Fehler"
End Sub
Gruß Basti
Anzeige

307 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige