Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1716to1720
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 Schleifen zur Identifizierung von Vertragslaufzeiten pro Seriennummer

VBA Schleifen zur Identifizierung von Vertragslaufzeiten pro Seriennummer
27.10.2019 14:01:04
Vertragslaufzeiten
Hallo,
ich habe eine Exceldatei die sich bis zur letzten zeile erstreckt mit Equipment Nr. 1-1000. Die Nr. 1-1000 kommen öfters vor und in der zelle daneben steht ein Start und ein ende Datum.
Bsp.: Nr. 1 Start datum 01.01.2012 ende datum 31.12.2014
Nr. 1 start datum 01.01.2017 ende datum 31.12.2017 usw. siehe link zur datei.
https://www.herber.de/bbs/user/132792.xlsx
Jetzt würde ich gerne ein Makro schreiben das alle 1er findet mit start datum und ende datum bsp oben und mir bei den jahren, die stehen daneben 2012, 2013, 2014 usw. ein x in die zelle darunter schreibt wenn die jahre bei Nr. 1 entahlten sind.
Bsp. von oben müsste ein x eingetragen werden bei 2012, 2013, 2014, 2017. bei 2015, 2016 müsste eine 0 eingetragen werden, da in diesen jahren keine Nr. mit 1 vorhanden ist. wenn er das mit der Nr. 1 gemacht hat soll er das gleiche mit Nr. 2 usw. wiederholen.
Ich hoffe das ist verständlich. Über Hilfe wäre ich sehr dankbar.
Gruß
Dominik

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Schleifen zur Identifizierung von Vertragslaufzeiten pro Seriennummer
27.10.2019 14:03:46
Vertragslaufzeiten
Halo Dominik,
das geht nicht, da eine XLSX Datei kein Makro enthalten kann.
Ich sehe keinen Grund eine Datei 2x zu speichern und den Code einzufügen.
Ich führe keine Liste unter welchem Dateinamen ich die Datei aus dem Forum gespeichert habe gespeichert habe.
Der Name steht ja im Beitrag.

AW: VBA Schleifen zur Identifizierung von Vertragslaufzeiten pro Seriennummer
27.10.2019 14:27:48
Vertragslaufzeiten
Wenn du statt 0 und X z.B. Farben nimmst, brauchst du gar kein Makro.
https://www.herber.de/bbs/user/132794.xlsx
AW: VBA Schleifen zur Identifizierung von Vertragslaufzeiten pro Seriennummer
27.10.2019 15:08:59
Vertragslaufzeiten
[Zitat]Jetzt würde ich gerne ein Makro schreiben[/Zitat]
Dann tue es doch!
Und es geht gewiss auch vollkommen ohne Makro/VBA, sogar ohne große Änderungen der Daten; aber Fragesteller, die so wenig Respekt vor eventuellen Helfern haben, dass sie sich keinerlei Mühe in Sachen Orthografie geben, die bekommen von mir keinen einzigen Tipp ...
ohne Gruß
Günther
Anzeige
AW: VBA Schleifen zur Identifizierung von Vertragslaufzeiten pro Seriennummer
27.10.2019 15:21:16
Vertragslaufzeiten
Hallo Dominik,
teste mal:
Option Explicit

Private Const START_YEAR As Long = 2012
Private Const END_YEAR As Long = 2022

Private Type DATA
    Number As Integer
    Years(START_YEAR To END_YEAR) As String
End Type

Public Sub Auswertung()
    Dim audtData() As DATA
    Dim avntValues As Variant
    Dim ialngIndex As Long, ialngCount As Long, lngRow As Long, lngColumn As Long
    Dim intYear As Integer
    Dim objDictionary As Object
    With Worksheets("Tabelle1")
        avntValues = .Range(.Cells(2, 2), .Cells(Rows.Count, 4).End(xlUp)).Value
    End With
    Set objDictionary = CreateObject(Class:="Scripting.Dictionary")
    With objDictionary
        For ialngIndex = LBound(avntValues) To UBound(avntValues)
            If Not .Exists(Key:=avntValues(ialngIndex, 1)) Then
                ialngCount = ialngCount + 1
                Redim Preserve audtData(1 To ialngCount)
                With audtData(ialngCount)
                    .Number = avntValues(ialngIndex, 1)
                    For intYear = START_YEAR To END_YEAR
                        .Years(intYear) = "0"
                    Next
                End With
                Call .Add(Key:=avntValues(ialngIndex, 1), Item:=ialngCount)
            End If
            With audtData(ialngCount)
                For intYear = Year(avntValues(ialngIndex, 2)) To Year(avntValues(ialngIndex, 3))
                    .Years(intYear) = "x"
                Next
            End With
        Next
    End With
    Set objDictionary = Nothing
    lngRow = 2
    Application.ScreenUpdating = False
    With Worksheets("Tabelle1")
        .Range(.Cells(2, 6), .Cells(.Rows.Count, 17)).ClearContents
        For ialngIndex = LBound(audtData) To UBound(audtData)
            .Cells(lngRow, 6).Value = audtData(ialngIndex).Number
            .Range(.Cells(lngRow, 7), .Cells(lngRow, 17)).Value = audtData(ialngIndex).Years
            lngRow = lngRow + 1
        Next
        For lngColumn = 7 To 17
            Call .Columns(lngColumn).TextToColumns(Destination:=.Cells(1, lngColumn), FieldInfo:=Array(1, 1))
        Next
    End With
    Application.ScreenUpdating = True
End Sub

Gruß
Nepumuk
Anzeige
AW: VBA Schleifen zur Identifizierung von Vertragslaufzeiten pro Seriennummer
27.10.2019 15:28:17
Vertragslaufzeiten
Oooooooops,
da ist noch ein Fehler drin. Wenn die Nummern nicht sortiert sind kann das zu falschen Ergebnissen führen. Daher:
Option Explicit

Private Const START_YEAR As Long = 2012
Private Const END_YEAR As Long = 2022

Private Type DATA
    Number As Integer
    Years(START_YEAR To END_YEAR) As String
End Type

Public Sub Auswertung()
    Dim audtData() As DATA
    Dim avntValues As Variant
    Dim ialngIndex As Long, ialngCount As Long, lngRow As Long, lngColumn As Long
    Dim intYear As Integer
    Dim objDictionary As Object
    With Worksheets("Tabelle1")
        avntValues = .Range(.Cells(2, 2), .Cells(Rows.Count, 4).End(xlUp)).Value
    End With
    Set objDictionary = CreateObject(Class:="Scripting.Dictionary")
    With objDictionary
        For ialngIndex = LBound(avntValues) To UBound(avntValues)
            If Not .Exists(Key:=avntValues(ialngIndex, 1)) Then
                ialngCount = ialngCount + 1
                Redim Preserve audtData(1 To ialngCount)
                With audtData(ialngCount)
                    .Number = avntValues(ialngIndex, 1)
                    For intYear = START_YEAR To END_YEAR
                        .Years(intYear) = "0"
                    Next
                End With
                Call .Add(Key:=avntValues(ialngIndex, 1), Item:=ialngCount)
            End If
            With audtData(.Item(Key:=avntValues(ialngIndex, 1)))
                For intYear = Year(avntValues(ialngIndex, 2)) To Year(avntValues(ialngIndex, 3))
                    .Years(intYear) = "x"
                Next
            End With
        Next
    End With
    Set objDictionary = Nothing
    lngRow = 2
    Application.ScreenUpdating = False
    With Worksheets("Tabelle1")
        .Range(.Cells(2, 6), .Cells(.Rows.Count, 17)).ClearContents
        For ialngIndex = LBound(audtData) To UBound(audtData)
            .Cells(lngRow, 6).Value = audtData(ialngIndex).Number
            .Range(.Cells(lngRow, 7), .Cells(lngRow, 17)).Value = audtData(ialngIndex).Years
            lngRow = lngRow + 1
        Next
        For lngColumn = 7 To 17
            Call .Columns(lngColumn).TextToColumns(Destination:=.Cells(1, lngColumn), FieldInfo:=Array(1, 1))
        Next
    End With
    Application.ScreenUpdating = True
End Sub

Gruß
Nepumuk
Anzeige
AW: VBA Schleifen zur Identifizierung von Vertragslaufzeiten pro Seriennummer
27.10.2019 19:05:29
Vertragslaufzeiten
Hallo Dominik,
ich habe es nochmal umgebaut. Jetzt musst du nur noch die zwei Konstanten START_YEAR und END_YEAR anpassen, den Rest macht das Programm von selbst.
Option Explicit

Private Const START_YEAR As Long = 2012
Private Const END_YEAR As Long = 2022

Private Type DATA
    Number As Long
    Years(START_YEAR To END_YEAR) As Variant
End Type

Public Sub Auswertung()
    Dim audtData() As DATA
    Dim avntValues As Variant
    Dim ialngIndex As Long, ialngCount As Long, ialngYear As Long
    Dim objDictionary As Object
    With Worksheets("Tabelle1")
        avntValues = .Range(.Cells(2, 2), .Cells(Rows.Count, 4).End(xlUp)).Value
    End With
    Set objDictionary = CreateObject(Class:="Scripting.Dictionary")
    With objDictionary
        For ialngIndex = LBound(avntValues) To UBound(avntValues)
            If Not .Exists(Key:=avntValues(ialngIndex, 1)) Then
                Redim Preserve audtData(ialngCount)
                With audtData(ialngCount)
                    .Number = avntValues(ialngIndex, 1)
                    For ialngYear = START_YEAR To END_YEAR
                        .Years(ialngYear) = 0
                    Next
                End With
                Call .Add(Key:=avntValues(ialngIndex, 1), Item:=ialngCount)
                ialngCount = ialngCount + 1
            End If
            With audtData(.Item(Key:=avntValues(ialngIndex, 1)))
                For ialngYear = Year(avntValues(ialngIndex, 2)) To Year(avntValues(ialngIndex, 3))
                    .Years(ialngYear) = "x"
                Next
            End With
        Next
    End With
    Set objDictionary = Nothing
    Redim avntValues(LBound(audtData) To UBound(audtData), START_YEAR To END_YEAR + 1)
    For ialngIndex = LBound(audtData) To UBound(audtData)
        With audtData(ialngIndex)
            avntValues(ialngIndex, START_YEAR) = .Number
            For ialngYear = START_YEAR To END_YEAR
                avntValues(ialngIndex, ialngYear + 1) = .Years(ialngYear)
            Next
        End With
    Next
    Application.ScreenUpdating = False
    With Worksheets("Tabelle1")
        .Range(.Cells(2, 6), .Cells(.Rows.Count, END_YEAR - START_YEAR + 7)).ClearContents
        .Range(.Cells(2, 6), .Cells(UBound(avntValues, 1) + 2, END_YEAR - START_YEAR + 7)).Value = avntValues
    End With
    Application.ScreenUpdating = True
End Sub

Gruß
Nepumuk
Anzeige
AW: VBA Schleifen zur Identifizierung von Vertragslaufzeiten pro Seriennummer
29.10.2019 18:25:12
Vertragslaufzeiten
Hallo Nepumuk,
vielen vielen Dank ich bin Sprachlos das ist genau das was ich gesucht habe. Du bist genial ;)
Da ich nicht so bewandert bin in VBA, würde ich dich gerne noch fragen, wenn es dir keine Umstände bereitet mir ein paar Erklärungen dazu zu schreiben, damit ich es nachvollziehen kann. Ich weiß deine Hilfe wirklich sehr zu schätzen. Vielen Dank nochmal.
Bei den anderen möchte ich mich für meine Schreibweise und den falschen Eindruck entschuldigen. Es war nicht meine Absicht jemand zu beleidigen oder eure Hilfe nicht wert zuschätzen.
Gruß
Dominik
AW: VBA Schleifen zur Identifizierung von Vertragslaufzeiten pro Seriennummer
29.10.2019 18:52:17
Vertragslaufzeiten
Hallo Dominik,
genügt das? Für weitere Erklärungen bitte nachfragen.
Option Explicit

Private Const START_YEAR As Long = 2012
Private Const END_YEAR As Long = 2022

'benutzerdefinierten Datentyp deklarieren
Private Type DATA
    Number As Long
    Years(START_YEAR To END_YEAR) As Variant
End Type

Public Sub Auswertung()
    'leeres Array des benutzerdefinierten Datentyps deklarieren
    Dim audtData() As DATA
    Dim avntValues As Variant
    Dim ialngIndex As Long, ialngCount As Long, ialngYear As Long
    Dim objDictionary As Object
    With Worksheets("Tabelle1")
        'Daten der Spalte B-D ab Zeile 2 bis zur letzten benutzten Zeile einlesen
        avntValues = .Range(.Cells(2, 2), .Cells(Rows.Count, 4).End(xlUp)).Value
    End With
    'Dictionary-Objekt erzeugen (ist ein Array mit eindeutigen Schlüssel und Wert)
    Set objDictionary = CreateObject(Class:="Scripting.Dictionary")
    'Verweis auf das Dictionary-Objekt öffnen
    With objDictionary
        'Schleife über die Werte von spalte B-D
        For ialngIndex = LBound(avntValues) To UBound(avntValues)
            'Wenn der Schlüssel noch nicht existiert
            If Not .Exists(Key:=avntValues(ialngIndex, 1)) Then
                'Array des benutzerdefinierten Datentyps erweitern
                Redim Preserve audtData(ialngCount)
                'Verweis auf diesen Arrayeintrag öffnen
                With audtData(ialngCount)
                    'Equipment-Nummer speichern
                    .Number = avntValues(ialngIndex, 1)
                    'Schleife über die Jahre
                    For ialngYear = START_YEAR To END_YEAR
                        'eine 0 in jedes Jahr schreiben
                        .Years(ialngYear) = 0
                    Next
                End With
                'Schlüssel und Zähler im Dictionary speichern
                Call .Add(Key:=avntValues(ialngIndex, 1), Item:=ialngCount)
                'Zähler hochsetzen
                ialngCount = ialngCount + 1
            End If
            'Verweis auf den Arrayeintrag mit dem endsprechenden Schlüssel öffnen
            With audtData(.Item(Key:=avntValues(ialngIndex, 1)))
                'Schleife über die Jahre aus Spalte C und D
                For ialngYear = Year(avntValues(ialngIndex, 2)) To Year(avntValues(ialngIndex, 3))
                    'im entsprechenden Jahr ein x eintragen
                    .Years(ialngYear) = "x"
                Next
            End With
        Next
    End With
    'Objekt zurücksetzen
    Set objDictionary = Nothing
    'Ausgabearray für jeden Eintrag im benutzerdefinierten Array in Zeilen
    'und für jedes Jahr + 1 für die Equipment-Nummer in Spalten anlegen
    Redim avntValues(LBound(audtData) To UBound(audtData), START_YEAR To END_YEAR + 1)
    'Schleife ber das benutzerdefinierten Array
    For ialngIndex = LBound(audtData) To UBound(audtData)
        With audtData(ialngIndex)
            'Equipment-Nummer in das Ausgabearray schreiben
            avntValues(ialngIndex, START_YEAR) = .Number
            'Schleife über die Jahre
            For ialngYear = START_YEAR To END_YEAR
                'Eintrag 0 oder x in das Ausgabearray schreiben
                avntValues(ialngIndex, ialngYear + 1) = .Years(ialngYear)
            Next
        End With
    Next
    'Bildschirmaktualisierung ausschalten
    Application.ScreenUpdating = False
    With Worksheets("Tabelle1")
        'Ausgabebereich löschen
        .Range(.Cells(2, 6), .Cells(.Rows.Count, END_YEAR - START_YEAR + 7)).ClearContents
        'Ausgabearray ausgeben
        .Range(.Cells(2, 6), .Cells(UBound(avntValues, 1) + 2, END_YEAR - START_YEAR + 7)).Value = avntValues
    End With
    Application.ScreenUpdating = True
End Sub

Gruß
Nepumuk
Anzeige

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige