AW: Array an funktion Übergeben/ Rückgabe im Array spe
06.06.2015 11:12:02
Sepp
Hallo Carlo,
Ausgabe auf fortlaufenden Blättern geht z. B. so.
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************
Option Explicit
Sub test()
Dim varGauss As Variant
Dim varX() As Variant, varY() As Variant
Dim lngXY As Long, lngI As Long
Dim lngLast As Long, lngRow As Long
Dim objSh As Worksheet, objSrc As Worksheet
Set objSrc = Sheets("Tabelle1") 'Tabellenname anpassen!
With objSrc
lngLast = Application.Max(2, .Cells(.Rows.Count, 1).End(xlUp).Row)
For lngRow = 2 To lngLast
If .Cells(lngRow, 2) > 0.1 And (.Cells(lngRow + 1, 2) > 0.1 Or lngRow = lngLast) Then
Redim Preserve varX(lngXY)
Redim Preserve varY(lngXY)
varX(lngXY) = .Cells(lngRow, 1)
varY(lngXY) = .Cells(lngRow, 2)
lngXY = lngXY + 1
Else
If lngXY > 0 Then
varGauss = GaussRegression(varX, varY, 9)
lngI = lngI + 1
If Not SheetExist("Peak " & lngI) Then
Set objSh = ThisWorkbook.Worksheets.Add(after:=IIf(lngI = 1, objSrc, objSh))
objSh.Name = "Peak " & lngI
Else
Set objSh = Sheets("Peak " & lngI)
objSh.Cells.Clear
End If
objSh.Cells(1, 1).Resize(UBound(varX) + 1, 1) = Application.Transpose(varX)
objSh.Cells(1, 2).Resize(UBound(varY) + 1, 1) = Application.Transpose(varY)
objSh.Cells(1, 4).Resize(UBound(varGauss), 1) = Application.Transpose(varGauss)
Erase varX
Erase varY
lngXY = 0
End If
End If
Next
End With
End Sub
Function GaussRegression(x, y, n As Integer)
Redim f(0 To n, 0 To n) As Double
Redim t(1 To n + 1) 'As Double
Dim a, p As Integer, i As Integer, j As Integer, k As Integer, s As Integer
On Error Resume Next
' Range expected starts at s = 1
p = x.Count: s = 1
If Err.Number Then
' VarArray starts at s = 0
Err.Clear:
p = UBound(x)
s = 0
End If
' Calculate Gausssum
For i = 0 To n
For j = 0 To n
For k = s To p
f(i, j) = f(i, j) + x(k) ^ (n - j) * x(k) ^ (n - i)
Next
Next
For k = s To p
t(i + 1) = t(i + 1) + y(k) * x(k) ^ (n - i)
Next
Next
a = WorksheetFunction.MInverse(f)
GaussRegression = WorksheetFunction.MMult(t, a)
End Function
Private Function SheetExist(ByVal sheetName As String, Optional Wb As Workbook) As Boolean
Dim wks As Worksheet
On Error GoTo ERRORHANDLER
If Wb Is Nothing Then Set Wb = ThisWorkbook
For Each wks In Wb.Worksheets
If LCase(wks.Name) = LCase(sheetName) Then SheetExist = True: Exit Function
Next
ERRORHANDLER:
SheetExist = False
End Function
Gruß Sepp