Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1536to1540
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
Zahlenreihe bei Änderung anpassen
03.02.2017 13:07:20
Peter
Ich habe eine Projektliste mit Prioritäten.
In Bereich A15:A500 werden die Projekte mit diesen Prioritäten versehen.
z.B. A15 = 3 / B15 = Projekt X
A16 = 1 / B16 = Projekt J
A17 = 2 / B17 = Projekt Z usw.
Mein Anforderung: wenn ich dem Projekt Z jetzt die Priorität 1 zuweise sollten sich
die Prioritäten aller anderen Projekte automatisch anpassen (Reihenfolge beibehalten) also: Projekt J = 2 Projekt X = 3
Kann mir da jemand weiterhelfen?

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zahlenreihe bei Änderung anpassen
03.02.2017 15:16:50
UweD
Hallo
das ginge so...
- Rechtsclick auf den Tabellenblattreiter
- Code anzeigen
- Diesen Code dort reinkopieren
Private Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo Fehler
    Dim PrioAlt As Integer, PrioNeu As Integer
    Dim SP As Integer: SP = 1 'Spalte A 
    Dim Z
    If Not Intersect(Columns(SP), Target) Is Nothing Then
        If Target.Count <> 1 Then
            MsgBox "Bitte einzeln ändern"
            Application.EnableEvents = False
            Application.Undo
        Else
            Application.EnableEvents = False
            Application.Undo
            PrioAlt = Target
            Application.Undo
            PrioNeu = Target
            For Each Z In Columns(SP).SpecialCells(xlCellTypeConstants, 1)
                If Z < PrioAlt And Z.Address <> Target.Address Then
                    Z.Value = Z.Value + 1
                End If
            Next
        End If
    End If
    Err.Clear
Fehler:
    Application.EnableEvents = True
    If Err.Number <> 0 Then MsgBox "Fehler: " & _
        Err.Number & vbLf & Err.Description: Err.Clear
End Sub
Gruß UweD
Über Rückmeldungen würde ich mich freuen
Anzeige
AW: Zahlenreihe bei Änderung anpassen
06.02.2017 09:21:03
Peter
Hallo UweD,
Sorry für meine verspätete Antwort und danke für deine schnelle Antwort.
Ich habe den Code getestet mit Zahlen von 1 bis 5 in A15:A19. Wenn ich z.B 3 in A17 durch 2 ersetzte, passt sich die Reihenfolge nicht richtig an, bzw. eine Zahl kommt dann doppelt vor. Ich kann aber nicht genau sagen warum.
Es sollte eine Zahl nur immer 1mal vorkommen, der Rest sollte sich anpassen.
Danke
For each c in r zickt... Wer weiß, warum?
03.02.2017 15:18:57
Michael
Hi,
gibt es da Randbedingungen?
Sind die Prioriäten immer nur einmal vorhanden oder mehrfach?
Liegen die Daten sortiert vor bzw. schadet es, sie nach Prioritäten zu sortieren?
Wie soll das bedient werden?
Ereignisgesteuert bei der Eingabe eines Werts? Dann ist aber der vorher vorhandene Wert "nicht bekannt" bzw. nur über einen Umweg mit "undo" zu ermitteln.
Doppelklick auf Zelle mit Input-Box zur Eingabe des neuen Werts? Dann sind sowohl der alte als auch der neue Wert "bekannt" - das dürfte am einfachsten zu programmieren sein und ist sehr flexibel: es geht auch ohne Sortierung und mit mehrfach vorkommenden Zahlen.
Hier ein Versuch zur zweiten Variante: https://www.herber.de/bbs/user/111154.xlsm
Bei der Entwicklung bin ich über einen seltsamen Effekt gestolpert:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim c As Range, r As Range
Dim alt&, neu&
If Target.Value  "" Then
Stop
Set r = Target.CurrentRegion.Columns(1)
alt = Cells(Target.Row, r.Column).Value
neu = Application.InputBox(prompt:="neue Zahl", Type:=1)
If neu > 0 Then
For Each c In r
If c.Row  Target.Row Then
MsgBox c.Address ' & ": " & c.Value
' Hier dann Fehler, weil c.address = ganzer Bereich
' warum ? ***************************************
If c.Value = neu Then _
c.Value = c.Value + 1
End If
Next
Cells(Target.Row, r.Column).Value = neu
Else
MsgBox "Eingabe  Abbruch"
End If
Cancel = True
End If
End Sub

aber mit Array geht's dann doch:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim a, r As Range
Dim alt&, neu&, i&
If Target.Value  "" Then
' Stop
Set r = Target.CurrentRegion.Columns(1)
a = r.Value
alt = Cells(Target.Row, r.Column).Value
neu = Application.InputBox(prompt:="neue Zahl", Type:=1)
If neu > 0 Then
For i = 1 To UBound(a)
If a(i, 1) = neu Then a(i, 1) = a(i, 1) + 1
Next
r = a
Cells(Target.Row, r.Column).Value = neu
End If
Cancel = True
End If
End Sub
Gruß,
Michael
Anzeige
AW: For each c in r zickt... Wer weiß, warum?
03.02.2017 17:42:30
Mullit
Hallo,
c.Value 

...klare Sache mit c.Value vergleichst Du ein Array mit einem einzelnen Wert, das geht nicht...
Gruß, Mullit
AW: For each c in r zickt... Wer weiß, warum?
03.02.2017 18:22:27
Mullit
Hallo nochmal,
..ah sorry, hab erst jetzt geblickt, Du willst wissen warum c.Value überhaupt ein Array abbildet:
Weil Du r hier setzt:
Set r = Target.CurrentRegion.Columns(1)

durchläuft c die Columns-Collection und gibt eine ganze Column zurück, Du müsstest schreiben:
Set r = Target.CurrentRegion.Columns(1).Cells
Gruß, Mullit
Anzeige
@Mullit: vielen Dank,
03.02.2017 18:37:42
Michael
das war's.
Ich hatte schon sooo oft die Schleife für "irgendwelche" Ranges verwendet, ohne mir jemals ernsthaft Gedanken darüber zu machen.
Wieder 0,5 Em (Excimeter) weiter auf dem Weg zur "Excelheit n-ter Ordnung" geschafft...
Schöne Grüße,
Michael
Wenn Du ein Objekt, das eine ganze Zeile ...
03.02.2017 21:55:45
Luc:-?
…oder Spalte referenziert, als Laufvariable eines For Each-Zyklus benutzt, Michael,
kannst bzw musst Du auf deren Einzelzellen mit laufvariable.Cells(i) zugreifen. Mit einem analog aufgebauten Variant-Array des „Arrays-in-an-array-Typs geht das auch. Die Variant-Laufvariable kann dann im Zyklus (nicht in seinem Kopf!) indiziert wdn.
🙈 🙉 🙊 🐵 Gruß, Luc :-?
Besser informiert mit …
Anzeige
@Luc:-?
09.02.2017 14:26:19
Michael
Hi,
danke natürlich auch für Deine Nachricht...
Bin krank und melde mich gleich wieder ab,
Gruß,
Michael
Gute Besserung! owT
09.02.2017 17:15:04
Luc:-?
:-?
AW: For each c in r zickt... Wer weiß, warum?
06.02.2017 09:57:31
Peter
Hi Michael,
danke für deine Hilfe.
Sorry für die verspätete Antwort.
Prioritäten dürfen nur einmal vorhanden sein.
Die Liste kann bei bedarf durch Filter sortiert werden.
Ich habe deinen Code in meiner Liste getestet, funktioniert einwandfrei.
"Ereignisgesteuert bei der Eingabe eines Werts?" Das wäre noch super.
An das hatte ich bis jetzt auch noch nicht gedacht: wenn z.B. das Projekt mit Priorität 3 entfällt, und deshalb statt 3 ein "X" eingetragen wird, dass dann die Projekte mit den Prioritäten 4 bis 10 jeweils um 1 kleiner werden. Ebenso , wenn z.B Projekt mit Priorität 1 entfällt...
Danke
Gruß Peter
Anzeige
AW: Zahlenreihe bei Änderung anpassen
03.02.2017 16:44:40
ChrisL
Hi Peter
Hier noch eine Variante mit Userform.
https://www.herber.de/bbs/user/111158.xlsm
Bedingt, dass die Prioritäten ab 1 ohne Unterbruch durchnummeriert sind. Mehrere Projekte mit gleicher Priorität darf es nicht geben (ansonsten wäre die Ausgangslage falsch d.h. es könnte nur noch manuell bestimmt werden, ob eine Umpriorisierung eine neue Nummerierung erfordert).
Übrigens eine ganz einfach Lösung wäre, nach Prio zu sortieren und die Prio mit =ZEILE() anzugeben. Bei einer Umpriorisierung verschiebst du einfach die Zeile.
cu
Chris
Private Sub CommandButton1_Click()
Dim lAnzahl As Long, lPos As Long, i As Long
With Worksheets("Tabelle1")
lAnzahl = .Cells(Rows.Count, 1).End(xlUp).Row - 1
lPos = ListBox1.ListIndex + 1
ReDim ar1(1 To lAnzahl)
ReDim ar2(1 To lAnzahl)
ar1 = Application.Transpose(.Range("A2:A" & lAnzahl + 1))
For i = 1 To lAnzahl
If ar1(i) = lPos - 1 Then
ar2(i) = ar1(i) + 1
ElseIf ar1(i) = lPos Then
ar2(i) = ar1(i) - 1
Else
ar2(i) = ar1(i)
End If
Next i
.Range("A2:A" & lAnzahl + 1) = Application.Transpose(ar2)
End With
Call UserForm_Initialize
ListBox1.ListIndex = lPos - 2
End Sub

Private Sub CommandButton2_Click()
Dim lAnzahl As Long, lPos As Long, i As Long
With Worksheets("Tabelle1")
lAnzahl = .Cells(Rows.Count, 1).End(xlUp).Row - 1
lPos = ListBox1.ListIndex + 1
ReDim ar1(1 To lAnzahl)
ReDim ar2(1 To lAnzahl)
ar1 = Application.Transpose(.Range("A2:A" & lAnzahl + 1))
For i = 1 To lAnzahl
If ar1(i) = lPos + 1 Then
ar2(i) = ar1(i) - 1
ElseIf ar1(i) = lPos Then
ar2(i) = ar1(i) + 1
Else
ar2(i) = ar1(i)
End If
Next i
.Range("A2:A" & lAnzahl + 1) = Application.Transpose(ar2)
End With
Call UserForm_Initialize
ListBox1.ListIndex = lPos
End Sub

Private Sub CommandButton3_Click()
Unload UserForm1
End Sub

Private Sub ListBox1_Click()
If ListBox1.ListIndex = 0 Then
CommandButton1.Enabled = False
CommandButton2.Enabled = True
ElseIf ListBox1.ListIndex = ListBox1.ListCount - 1 Then
CommandButton1.Enabled = True
CommandButton2.Enabled = False
Else
CommandButton1.Enabled = True
CommandButton2.Enabled = True
End If
End Sub

Private Sub UserForm_Initialize()
Dim lAnzahl As Long, i As Long
ListBox1.Clear
With Worksheets("Tabelle1")
lAnzahl = .Cells(Rows.Count, 1).End(xlUp).Row - 2
ReDim ar(lAnzahl)
For i = 0 To lAnzahl
ar(i) = .Cells(Application.Match(i + 1, .Columns(1), 0), 2)
Next i
End With
ListBox1.List = ar
End Sub

Anzeige

299 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige