Lösungsvorschlag
05.10.2024 14:53:59
ralf_b
Ich weis zwar nicht ob das am Ende so aussehen soll, aber du kannst es dir ja mal ansehen.
Option Explicit
Sub CopyDiagnostik()
Dim x As Long, FinalRow1 As Long
Dim wsTab1 As Worksheet
Dim wsTab2 As Worksheet
Dim rng As Range, FilterRange As Range
Application.ScreenUpdating = False 'Zeitgewinn durch Abschalten der Bildschirmaktualisierung
Application.Calculation = xlCalculationManual 'Zeitgewinn durch Abschalten der Zellberechnung
Set wsTab1 = Worksheets("BTs Biodiv") 'objectvariable auf blatt1 gesetzt
Set wsTab2 = Worksheets("BTs Ausw. Diagn.")
x = 18 'Beginn Schleife ab Spalte "R"
With wsTab1
Do While wsTab1.Cells(1, x).Value > vbNullString ' schleife bis kein wert in zeile 1 spalte x
'Spalten x in "BTs Biodiv" filtern
.AutoFilterMode = False 'evtl.Filter ausschalten
Set FilterRange = Range(.Range("A3"), .UsedRange.SpecialCells(xlCellTypeLastCell))
FilterRange.Rows(1).AutoFilter Field:=x, Criteria1:=">" 'filter auf Spalte setzen
'Spalten 1 in "BTs Ausw. Diagn." kopieren
On Error Resume Next
Set rng = FilterRange.Offset(1).Resize(FilterRange.Rows.Count - 1, FilterRange.Columns.Count).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If rng Is Nothing Then
.AutoFilterMode = False 'Filter ausschalten
Else
'erste leere zelle in "BTs Ausw. Diagn." Spalte 1 ermitteln
FinalRow1 = wsTab2.Cells(Rows.Count, 1).End(xlUp).Row + 1
wsTab2.Cells(FinalRow1, 1).Resize(rng.Rows.Count, 1).Value = .Cells(3, 17)
wsTab2.Cells(FinalRow1, 2).Resize(rng.Rows.Count, 1).Value = .Cells(2, 17)
wsTab2.Cells(FinalRow1, 3).Resize(rng.Rows.Count, 1).Value = .Cells(1, x)
wsTab2.Cells(FinalRow1, 4).Resize(rng.Rows.Count, 1).Value = .Cells(3, x)
wsTab2.Cells(FinalRow1, 5).Resize(rng.Rows.Count, 1).Value = WorksheetFunction.Index(rng, 0, 1)
wsTab2.Cells(FinalRow1, 6).Resize(rng.Rows.Count, 1).Value = WorksheetFunction.Index(rng, 0, x)
End If
'Filter ausschalten
.AutoFilterMode = False
x = x + 1 'spaltenzähler hochsetzen
Loop
End With
wsTab2.UsedRange.Columns.AutoFit
'Zurücksetzen der Zeitgewinnoptionen
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True 'unnötig, wird automatisch zurückgesetzt
End Sub