online 1
gast (50)

/ Forum / Tabellenkalkulation

TabellenkalkulationTabellenkalkulation

Fragevon thol vom 05.05.2020, 14:20 Options

Mit Hilfe von Gültigkeit Listen Begriffe Suchen und Finden

Hallo,

ich hoffe jemand kann mir helfen, nachdem ich erfolglos das gesamte WWW habe.

Ich habe mehrere Tabellenblätter. In einer (Summary) habe ich eine Zelle mit verschiedenen Projektnamen (über Gültigkeit/ Liste). Ich möchte über ein Makro den Projektname in einer anderen Tabelle (Risk Register) suchen (A:A), wenn gefunden , sollen verschiedene Zellen in der jeweiligen Reihe zurück ins Blatt (Summary kopiert werden.

Ich habe folgendes Code, nur funktioniert nicht über den DrowDown (Liste), sondern ich muß den Suchbegriff händisch in Code eingeben.

Weiß jemand was ich falsch mache?

thol

Sub CopyProjectRisk()
Worksheets("Risk Register").Activate
Dim DestSheet As Worksheet
Dim SourceSheet As Worksheet
Set DestSheet = Worksheets("Summary")
Set SourceSheet = Worksheets("Risk Register")


Dim sRow As Long 'row index on source worksheet
Dim dRow As Long 'row index on destination worksheet
Dim sCount As Long
sCount = 0
dRow = 17

For sRow = 1 To Range("a65536").End(xlUp).Row
'use pattern matching to find project "Changing the world" anywhere in cell
If Cells(sRow, "a") Like "Changing the world" Then
sCount = sCount + 1
dRow = dRow + 1
'copy cols A,F,E & D
DestSheet.Cells(dRow, "d") = SourceSheet.Cells(sRow, "b")
DestSheet.Cells(dRow, "e") = SourceSheet.Cells(sRow, "f")
DestSheet.Cells(dRow, "f") = SourceSheet.Cells(sRow, "s")
DestSheet.Cells(dRow, "g") = SourceSheet.Cells(sRow, "j")
DestSheet.Cells(dRow, "h") = SourceSheet.Cells(sRow, "r")
End If
Next sRow

MsgBox sCount & " Project Risks", vbInformation, "Transfer Done"

End Sub


Antwort schreiben

Antwort 1 von Beverly vom 05.05.2020, 18:13 Options

Hi,

ich weiß nicht, ob ich dein Anliegen richtig verstanden habe.

Versuchs mal so (angenommen dein DropDown-Listenfeld befindet sich in A1)

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim DestSheet As Worksheet
    Dim SourceSheet As Worksheet
    Dim sRow As Long 'row index on source worksheet
    Dim dRow As Long 'row index on destination worksheet
    Dim sCount As Long
    If Target.Address <> "$A$1" Then Exit Sub
    Worksheets("Risk Register").Activate
    Set DestSheet = Worksheets("Summary")
    Set SourceSheet = Worksheets("Risk Register")
    sCount = 0
    dRow = 17
    With SourceSheet
        For sRow = 1 To .Range("a65536").End(xlUp).Row
            'use pattern matching to find project "Changing the world" anywhere in cell
            If .Cells(sRow, "a") Like Target Then
                sCount = sCount + 1
                dRow = dRow + 1
                'copy cols A,F,E & D
                DestSheet.Cells(dRow, "d") = .Cells(sRow, "b")
                DestSheet.Cells(dRow, "e") = .Cells(sRow, "f")
                DestSheet.Cells(dRow, "f") = .Cells(sRow, "s")
                DestSheet.Cells(dRow, "g") = .Cells(sRow, "j")
                DestSheet.Cells(dRow, "h") = .Cells(sRow, "r")
            End If
        Next sRow
    End With
    MsgBox sCount & " Project Risks", vbInformation, "Transfer Done"
End Sub

Anstelle
.Range("a65536").End(xlUp).Row

würde ich für die letzte belegte Zelle dies verwenden:
IIf(IsEmpty(.Cells(.Rows.Count, 1)), .Cells(.Rows.Count, 1).End(xlUp).Row, .Rows.Count)

Wenn A65536 nicht leer ist, ergibt deine Codezile einen falschen Wert.

Bis später,
Karin

Antwort 2 von thol vom 06.05.2020, 13:29 Options

Karin, danke vielmals!

Ich habe deinen Code leider nicht benutzen können, ich bin ja eine Niete in VBA. Da es sich um eine "Private" Deklaration handelt, wo muß ich den Code schreiben, unter "Standardmodule oder in Tabellenblatt "Summary", "Risk Register"?
Weiters: brauche ich auch eine Prozedur, um es zu aktivieren? Wenn ich auf Ausführen gehe, wird es nämlich nicht einmal aufgelistet.

Danke nochmals"

thol

Antwort 3 von Beverly vom 06.05.2020, 13:39 Options

Hi,

du musst den Code ins Codemodul der Tabelle kopieren, in der sich das DropDown-Listenfeld befindet - also Summary. Der Code wird automatisch ausgeführt, sobald du eine neue Auswahl triffst.

Übrigens sollte der Code auch funktionieren wenn du diese Codezeile Worksheets("Risk Register").Activate löschst. Sie ist noch aus deinem Ursprungscode und ich habe vergessen, sie zu entfernen.

Bis später,
Karin

Antwort 4 von thol vom 06.05.2020, 14:59 Options

Karin, danke nochmals für die schnelle Antwort, leider funktioniert es bei mir nicht. Habe alles gemacht, wie du gesagt hast: Statt A1 habe ich den Name genommen "selected_project", wo sie es bei mir steht. Die Liste / Dropdown feld ist eine verbundenen Zelle in summary e5:F5. Glaubst du dass das Problem hier liegt?

Danke

thol

Antwort 5 von thol vom 06.05.2020, 16:03 Options

Karin, ich habe den Fehler gefunden!
Ich hatte für die Spalte eineKleinbuchstabe genommen, deshalb hat es nicht funktionieren wollen. Danke!

Ich hätte nur noch eine Frage: wenn ich unter E5 (wo die dropdown liste mit den Projektnamen sind) ein Projekt nehme, das nur 2 Risks hat, vorher aber ein Projekt mit 30 Risks stand, löscht diese Code nicht die Daten, die schon da waren.

Ich würde brauchen, dass mit Auswahl eines neuen Projektes, die Daten von Risk Register ab Zeile 18 kopiert werden, jedes mal neu, d.h. alte Daten sollen "gelöscht" werden.

Kannst du mir noch einmal helfen???

Danke!

thol

Antwort 6 von Beverly vom 06.05.2020, 16:21 Options

Hi,

so ganz klar ist mir nicht, was gelöscht werden soll.
Wenn du den Code vor der Zeile mit der With-Anweisung durch diese Zeilen ergänzt, wird der Inhalt des Bereichs A18:Hxx gelöscht:

    With DestSheet
        .Range("A18:H" & IIf(IsEmpty(.Cells(.Rows.Count, 1)), .Cells(.Rows.Count, 1).End(xlUp).Row, .Rows.Count)).ClearContents
    End With


Bis später,
Karin

Antwort 7 von thol vom 07.05.2020, 10:10 Options

Hallo Karin,

ich habe mit dem urspürnglichen Code ergänzt, aber irgendwas klappt nicht. Ich nehme an, dass ich mich nicht richtig ausgedruckt habe:

Der Code schaut so aus:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim DestSheet As Worksheet
Dim SourceSheet As Worksheet
Dim sRow As Long 'row index on source worksheet
Dim dRow As Long 'row index on destination worksheet
Dim sCount As Long

If Target.Cells.Address <> "$E$4" Then Exit Sub
Set DestSheet = Worksheets("Summary")
Set SourceSheet = Worksheets("Risk Register")
sCount = 0
dRow = 17

With SourceSheet
For sRow = 1 To .Range("a65536").End(xlUp).Row
'use pattern matching to find project "Changing the world" anywhere in cell
If .Cells(sRow, "a") Like Target Then
sCount = sCount + 1
dRow = dRow + 1
'copy cols A,F,E & D
DestSheet.Cells(dRow, "d") = .Cells(sRow, "b")
DestSheet.Cells(dRow, "e") = .Cells(sRow, "f")
DestSheet.Cells(dRow, "f") = .Cells(sRow, "s")
DestSheet.Cells(dRow, "g") = .Cells(sRow, "j")
DestSheet.Cells(dRow, "h") = .Cells(sRow, "r")

End If
Next sRow
End With
Application.ScreenUpdating = False
End Sub

Wenn ich in E4 / Summary (mittels dropdown) Project1 wähle, sucht er wie erwartet alle Risks in Risk Register und kopiert sie ab A18:H18. Wenn es angenommen 30 Risks sind, macht er das alles super. Aber wenn ich dann wieder ein neues Projekt nehme, Projekt2, das aber nur 5 Risks hat, kopiert er die Risks in den ersten 5 Reihen (ab A18, H18) lässt aber alle restlichen 25 Risks von Project1 drinnen. Die müssten eigentlich leer stehen. So jedes Mal wenn sich über dropdown das Projekt ändert.

Weiß du eine Lösung? Wäre für Hilfe sehr dankbar!

Danke
Thol

Antwort 8 von Beverly vom 07.05.2020, 10:25 Options

Hi,

in deinem Code sehe ich nicht, dass du ihn entsprechend meinem Beitrag vom 06.05.2008, 16:21 ergänzt hast.

Tipp: wenn du formatieren (eingerückten) Code in einen Beitrag kopierst, ihn anschließend markierst und den Schalter "Code" über dem Antwortfenster benutzt, wird der Code auch im Beitrag formatiert dargestellt und ist dadurch besser lesbar.

Bis später,
Karin

Antwort 9 von thol vom 07.05.2020, 10:52 Options

Sorry,

habe ich nicht gemacht, weil es nicht funktionierte. Wenn ich das einfüge (wie von dir gesagt vor dem ersten "with", löscht er alle Daten, die ab der ersten Reihe sind.

Es würde so ausschauen (wie ich das versucht habe:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim DestSheet As Worksheet
    Dim SourceSheet As Worksheet
    Dim sRow As Long 'row index on source worksheet
    Dim dRow As Long 'row index on destination worksheet
    Dim sCount As Long
    
    If Target.Cells.Address <> "$E$4" Then Exit Sub
    Set DestSheet = Worksheets("Summary")
    Set SourceSheet = Worksheets("Risk Register")
    sCount = 0
    dRow = 17
    With DestSheet
        .Range("D18:H" & IIf(IsEmpty(.Cells(.Rows.Count, 1)), .Cells(.Rows.Count, 1).End(xlUp).Row, .Rows.Count)).ClearContents
    End With
    
    With SourceSheet
        For sRow = 1 To .Range("a65536").End(xlUp).Row
            'use pattern matching to find project "Changing the world" anywhere in cell
            If .Cells(sRow, "a") Like Target Then
                sCount = sCount + 1
                dRow = dRow + 1
                'copy cols A,F,E & D
                DestSheet.Cells(dRow, "d") = .Cells(sRow, "b")
                DestSheet.Cells(dRow, "e") = .Cells(sRow, "f")
                DestSheet.Cells(dRow, "f") = .Cells(sRow, "s")
                DestSheet.Cells(dRow, "g") = .Cells(sRow, "j")
                DestSheet.Cells(dRow, "h") = .Cells(sRow, "r")
                                      
            End If
        Next sRow
    End With
  Application.ScreenUpdating = False
End Sub


Hoffe, du kannst mir helfen.
Bis gleich

Thol

Antwort 10 von Beverly vom 07.05.2020, 11:04 Options

Hi,

das habe ich ja auch geschrieben und gleichzeitig angemerkt, dass mir nicht ganz klar ist, was gelöscht werden soll. Das ist mir nun leider immer noch unklar.

Deine Beschreibung:
Zitat:
Ich würde brauchen, dass mit Auswahl eines neuen Projektes, die Daten von Risk Register ab Zeile 18 kopiert werden, jedes mal neu, d.h. alte Daten sollen "gelöscht" werden.

Zitat:
Aber wenn ich dann wieder ein neues Projekt nehme, Projekt2, das aber nur 5 Risks hat, kopiert er die Risks in den ersten 5 Reihen (ab A18, H18) lässt aber alle restlichen 25 Risks von Project1 drinnen. Die müssten eigentlich leer stehen. So jedes Mal wenn sich über dropdown das Projekt ändert.


und genau das macht der Code.

Bis später,
Karin

Antwort 11 von thol vom 07.05.2020, 11:34 Options

Hallo Karin,

danke, und gleichzeitig entschuldige, dass ich insistiere:

Wenn ich Projekt1 mit 30 Risks, werden Daten ab A18:H18 bis A47:H47 (d.h. die 30 Zeilen) kopiert. Wenn Projekt2 nur 5 Risks hat, müsste in diesen Range (den ich Summary_Selected genant habe, also A18:H18 bis zum Ende der Tabelle) nur die 5 Risks stehen, die alten von Projekt1 (also A18:H18 bis A22:H22) mit Risks von Projekt2 sollten überschrieben werden, ab A23:H23 sollten die alten Risks von Projekt1 "gelöscht" werden, sodass ich immer eine Übersicht mit den und nur mit den Risks von den "neuen Auswahl" sehe.

Hoffe, diesmal habe ich mich besser ausgedruckt.

Danke

Thol

Antwort 12 von thol vom 07.05.2020, 11:37 Options

Entschuldigung: es geht nicht um Spalte A sondern um Spalte D. Der Bereich beginnt in der Spalte D. Also zu meiner vorherige Anfrage: es ist immer D und nicht A.

Danke
Thol

Antwort 13 von Beverly vom 07.05.2020, 11:51 Options

Hi,

ändere in
IIf(IsEmpty(.Cells(.Rows.Count, 1)), .Cells(.Rows.Count, 1).End(xlUp).Row, .Rows.Count)).

die 1 in eine 4, dann wird in Spalte D letzte die belegte Zelle ermittelt.

Bis später,
Karin

Antwort 14 von thol vom 07.05.2020, 12:07 Options

DANKE!!! Jetzt hat es geklappt,

Thol

Ähnliche Themen

Xcard - Gültigkeit Abfrage
thxbest  14.05.2007 - 80 Hits -

Arbeitsblätter vergleichen
Uwe3  03.10.2007 - 110 Hits - 2 Antworten

mehrere Listen zusammenfassen
aufarbeit  29.11.2007 - 161 Hits - 1 Antwort

Hinweis

Diese Frage ist schon etwas älter, Sie können daher nicht mehr auf sie antworten. Sollte Ihre Frage noch nicht gelöst sein, stellen Sie einfach eine neue Frage im Forum..

Neue Einträge

Version: supportware 1.9.150 / 10.06.2022, Startzeit:Mon Jan 26 11:26:25 2026