Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1888to1892
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

Wenn Spalte Wert enthält dann...

Wenn Spalte Wert enthält dann...
27.06.2022 12:55:00
Thomas
Hallo,
ich habe in einer Tabelle3 (Arbeitsmappe im Anhang) in der in der Zeile 2 von Spalte Q bis AB Monate stehen 01-12, in C1 wird immer der aktuelle Monat eingetragen. Alle Werte die in Zeile 2 jetzt kleiner (links von dem Wert der auch in C1 steht)sind, sollen in den folgenden Zeilen(4 und) Werte aus Tabelle 1 eingetragen Werden. Ab der Spalte wo der Monatswert gleich dem Wert in C1 ist, sollen dann Werte aus Tabelle 2 in der richtigen spalte eingetragen werden, wie kann ich das erreichen?
Es muss dynamisch sein, da sich der Wert in C1 jeden Monat ändert.
Da es noch mehrere anderen Aktion gibt muss es in VBA gelöst werden. Leider fehlt mir grade komplett der Ansatz.
Danke
https://www.herber.de/bbs/user/153783.xlsm

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

Betreff
Datum
Anwender
Anzeige
AW: Wenn Spalte Wert enthält dann...
27.06.2022 13:44:01
UweD
Hallo
- Rechtsclick auf den Tabellenblattreiter von Tabelle3
- Code anzeigen
- Diesen Code rechts reinkopieren
Löst automatisch aus, bei Änderungen in C1

Private Sub Worksheet_Change(ByVal Target As Range)
Const APPNAME = "Worksheet_Change"
On Error GoTo Fehler
Dim LR As Integer, i As Integer, Z1 As Integer
Dim SpZ As Integer, Sp1 As Integer, SpN As Integer
Dim Tb1 As Worksheet, Tb2 As Worksheet, Monat As Integer, Zeile As Integer
If Not Intersect(Target, Range("C1")) Is Nothing Then
Monat = Range("C1")
SpZ = 17 'Zieldaten ab Q
Set Tb1 = Sheets("Tabelle1")
Set Tb2 = Sheets("Tabelle2")
Z1 = 4 'erste Datenzeile in Tab3
Sp1 = 7 'Quelldaten ab Spalte G
SpN = 5 'Namensspalte E in Tab 1+2
LR = Cells(Rows.Count, "A").End(xlUp).Row 'letzte Zeile der Spalte
For i = Z1 To LR
'prüfen ob Name in TB1 vorhanden
If WorksheetFunction.CountIf(Tb1.Columns(SpN), Cells(i, 1)) > 0 Then
'in welcher Zeile
Zeile = WorksheetFunction.Match(Cells(i, 1), Tb1.Columns(SpN), 0)
Application.EnableEvents = False
If Monat > 1 Then 'nur ab Monat 02
Cells(i, SpZ).Resize(1, Monat - 1).Value = Tb1.Cells(Zeile, Sp1).Resize(1, Monat - 1).Value
End If
Else
MsgBox Cells(i, 1) & ": in " & Tb1.Name & " nicht gefunden"
Exit Sub
End If
'prüfen ob Name in TB2 vorhanden
If WorksheetFunction.CountIf(Tb2.Columns(SpN), Cells(i, 1)) > 0 Then
'in welcher Zeile
Zeile = WorksheetFunction.Match(Cells(i, 1), Tb2.Columns(SpN), 0)
Application.EnableEvents = False
Cells(i, SpZ).Offset(0, Monat - 1).Resize(1, 13 - Monat).Value = _
Tb2.Cells(Zeile, Sp1).Offset(0, Monat - 1).Resize(1, 13 - Monat).Value
Else
MsgBox Cells(i, 1) & ": in " & Tb2.Name & " nicht gefunden"
Exit Sub
End If
Next
End If
'*** Fehlerbehandlung
Err.Clear
Fehler:
Application.EnableEvents = True
If Err.Number  0 Then MsgBox "Fehler in Sub """ & APPNAME & """" & vbCrLf _
& "Fehlernummer: " & Err.Number & vbLf & Err.Description: Err.Clear
End Sub
LG UweD
Anzeige
AW: Wenn Spalte Wert enthält dann...
27.06.2022 16:09:57
Thomas
Hallo UweD,
vielen Dank für die schnelle und sehr ausführliche Hilfe, die sehr gut funktioniert, ich habe sie für mein Vorhaben entsprechend angepasst, da ich kein Worksheet_Change Event möchte an der stelle.
Ich bin aber ehrlich gesagt noch nicht so ganz dahinter gestiegen was hier genau passiert:

 Cells(i, SpZ).Offset(0, Monat - 1).Resize(1, 13 - Monat).Value = _
Tb2.Cells(Zeile, Sp1).Offset(0, Monat - 1).Resize(1, 13 - Monat).Value

AW: Wenn Spalte Wert enthält dann...
27.06.2022 16:42:04
UweD
das ist der Zielbereich
Cells(i, SpZ).Offset(0, Monat - 1).Resize(1, 13 - Monat)
Bezogen auf Müller und Monat 06
also:
- in der entsprechenden Zeile 4 (i) beginnend an SpZ (Spalte Q)
- von dort 0 nach unten, aber 5 Spalten nach rechts verschoben
=&GT Ergibt die Zelle V4
- von dort beginnend den Zellbereich vergrößern auf 1 Zeile und 7 Spalten (13-6)
=&GT ergibt V4:AB4
In diesen Bereich die Werte aus dem Quellbereich übernehmen
Quellbereich:
Tb2.Cells(Zeile, Sp1).Offset(0, Monat - 1).Resize(1, 13 - Monat).
- gefunden wurde Müller in Zeile 2
- Startspalte ist 7 = G
=&GT G2
- von dort 0 nach unten, aber 5 Spalten nach rechts verschoben
=&GT Ergibt die Zelle L2
- analog zu oben.. den Bereich erweitern.
LG UweD
Anzeige
AW: Wenn Spalte Wert enthält dann...
28.06.2022 07:19:28
Thomas
Hallo UweD,
super vielen Dank für die erklärung, jetzt hab ich es verstanden!
MFG
Thomas
AW: Wenn Spalte Wert enthält dann...
28.06.2022 09:13:46
Thomas
Muss dann leider doch noch mal fragen,
wie kann ich denn jetzt noch die Zellen die vor dem aktuellen Monat sind sperren, so das keine Eingaben mehr möglich sind?
Danke
AW: Wenn Spalte Wert enthält dann...
28.06.2022 10:00:25
UweD
Hallo
Der Schutz ist aber nur wirksam, wenn das BLATT geschützt ist.
Dazu müssen erstmal die Zellen, die bearbeitet werden dürfen entsperrt werden (auch C1 und Spalte A etc.)
- Zelle markieren
- Rechtsclick
- Zellen formatieren
- Bei Schutz dann den Haken bei "Gesperrt" rausnehmen
Das Sperren / Entsperren der Monatbereiche habe ich dann im Makro eingebaut.

Private Sub Worksheet_Change(ByVal Target As Range)
Const APPNAME = "Worksheet_Change"
On Error GoTo Fehler
Dim LR As Integer, i As Integer, Z1 As Integer
Dim SpZ As Integer, Sp1 As Integer, SpN As Integer
Dim Tb1 As Worksheet, Tb2 As Worksheet, Monat As Integer, Zeile As Integer
If Not Intersect(Target, Range("C1")) Is Nothing Then
Monat = Range("C1")
SpZ = 17 'Zieldaten ab Q
Set Tb1 = Sheets("Tabelle1")
Set Tb2 = Sheets("Tabelle2")
Z1 = 4 'erste Datenzeile in Tab3
Sp1 = 7 'Quelldaten ab Spalte G
SpN = 5 'Namensspalte E in Tab 1+2
LR = Cells(Rows.Count, "A").End(xlUp).Row 'letzte Zeile der Spalte
'Sperrung aufheben
ActiveSheet.Unprotect 'DeinPasswort
For i = Z1 To LR
'prüfen ob Name in TB1 vorhanden
If WorksheetFunction.CountIf(Tb1.Columns(SpN), Cells(i, 1)) > 0 Then
'in welcher Zeile
Zeile = WorksheetFunction.Match(Cells(i, 1), Tb1.Columns(SpN), 0)
Application.EnableEvents = False
If Monat > 1 Then 'nur ab Monat 02
With Cells(i, SpZ).Resize(1, Monat - 1)
.Value = Tb1.Cells(Zeile, Sp1).Resize(1, Monat - 1).Value
.Locked = True
End With
End If
Else
MsgBox Cells(i, 1) & ": in " & Tb1.Name & " nicht gefunden"
Exit Sub
End If
'prüfen ob Name in TB2 vorhanden
If WorksheetFunction.CountIf(Tb2.Columns(SpN), Cells(i, 1)) > 0 Then
'in welcher Zeile
Zeile = WorksheetFunction.Match(Cells(i, 1), Tb2.Columns(SpN), 0)
Application.EnableEvents = False
With Cells(i, SpZ).Offset(0, Monat - 1).Resize(1, 13 - Monat)
.Value = Tb2.Cells(Zeile, Sp1).Offset(0, Monat - 1).Resize(1, 13 - Monat).Value
.Locked = False
End With
Else
MsgBox Cells(i, 1) & ": in " & Tb2.Name & " nicht gefunden"
Exit Sub
End If
Next
'Sperren
ActiveSheet.Protect 'DeinPasswort
End If
'*** Fehlerbehandlung
Err.Clear
Fehler:
Application.EnableEvents = True
If Err.Number  0 Then MsgBox "Fehler in Sub """ & APPNAME & """" & vbCrLf _
& "Fehlernummer: " & Err.Number & vbLf & Err.Description: Err.Clear
End Sub
LG UweD
Anzeige
AW: Wenn Spalte Wert enthält dann...
28.06.2022 10:46:32
Thomas
Hallo Uwe,
super vielen Dank, ich hatte es in der Zwischenzeit gelöst, allerdings nicht so "schön" wie du

'Range(Cells(lngA, Spz), Cells(lngA, Spz + Monat - 2)).Locked = True

Daumen hoch
28.06.2022 10:52:32
UweD

338 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige