[Excel] Laufzeitfehler 9 bei programmierten Excel-Makro

WING83

Grünschnabel
Hallo,

ich habe ein Makro in Excel programmiert, beim Ausführen zeigt er mir einen Laufzeitfehler 9 an (Index außerhalb des gültigen Bereichs). Diesen Code habe ich einem Buch entnommen. Da ich momentan noch keine großen Kenntnisse auf dem Gebiet der Programmierung mit VBA habe benötige ich dringend Hilfe.

Stelle hier einmal einen Teil des Quellcodes ins Netz und hoffe mir hilft jemand.

Danke schon mal im Voraus

Gruß David

Debbuger zeigt bei folgender Zeile den Fehler:

FV(NST - 1) = FL(NST) - FSTR(NST, NK1) + SV(NST) + SL(NST) + DEST


End If
' BERECHNUNG DER FLUESSIGKEITS- UND DAMPFSTROEME AUF DEN BOEDEN
' (CONSTANT MOLAL OVERFLOW)
FV(NST) = DEST + FKV(NST) * FSTR(NST, NK1)
FL(NST) = DEST + RFLX + (1# - FKV(NST)) * FSTR(NST, NK1) - SL(NST)
FV(NST - 1) = FL(NST) - FSTR(NST, NK1) + SV(NST) + SL(NST) + DEST
For ii = 3 To NST
If NST > 2 Then
i = NST + 2 - ii
FL(i) = FL(i + 1) - SL(i) + (1# - FKV(i)) * FSTR(i, NK1)
FV(i - 1) = FV(i) + SV(i) - FKV(i) * FSTR(i, NK1)
End If
Next ii
FL(1) = FL(2) - SL(1) + (1# - FKV(1)) * FSTR(1, NK1)
FL(1) = FL(1) - FV(1)
For j = 1 To NK1
FEED(j) = 0#
For i = 1 To NST
FEED(j) = FEED(j) + FSTR(i, j)
Next i
Next j

' ERSTE ABSCHAETZUNG DES TEMPERATUR- UND KONZENTRATIONSPROFILS
For i = 1 To NST
T(i) = TB + (i - 1) * (TT - TB) / NST
Next i

' IRES = EXPONENT FUER DAS ABBRUCHKRITERIUM RLIM= 10.D00**(-IRES)
IRES = ws.Cells(37, 2)
rlim = 10# ^ (-IRES)

For i = 1 To NST
For j = 1 To NK
FLL(i, j) = FEED(j) / FEED(NK1) * FL(i)
Next j
Next i

NIT = 0
res = 10# * rlim
While res > rlim
NKa = NK - 1
NIT = NIT + 1
 
Grüezi David

Mit diesem Code-Fragment lässt sich die Ursache des Fehlers nicht bestimmen, da sämtliche Variable-Deklarationen und -Zuweisungen fehlen.

Lege daher den ganzen Code offen, dann lässt sich eher etwas dazu sagen.
 
Da es sich bei diesen Variablen ja hauptsächlich um Arrays handelt tippe ich mal darauf das "FV(NST - 1)" bzw. "NST - 1" den Fehler auslöst.

Wenn NST an der Stelle noch keinen oder den Wert 0 hat, dann wird hier versucht auf das Array FV(-1) zuzugreifen. Das würde auch zur Fehlermeldung passen.

Aber um genaueres zu sagen sollte wie schon von Thomas Ramel geschrieben der komplette Code gezeigt werden.
 
Ok,

also danke erst mal, dass sich überhaupt jemand mit dem Problem beschäftigt!

Ich poste also jetzt den ganzen Code:


'these variables are shared by all routines in this module
Dim ANT(3, 5) As Double
Dim VI(5) As Double
Dim PARAM(5, 5) As Double
Dim NK As Integer
Dim NK1 As Integer
Dim NST As Integer
Dim ITEXT As String
Dim ws As Object, wsfp As Object, wsfpd As Object, wsmfd As Object

Public Sub desw_execute()
' This program is based on UNIDIST developed in the group
' of Prof. Aa. Fredenslund at the Technical University of Lyngby in Denmark
' It was modified for Excel-VBA by Dr. J. Rarey, University of Oldenburg,Germany

' IMPLICIT REAL * 8(A-H,O-Z)
Dim P(50) As Double
Dim XX(5) As Double
Dim Index(50) As Integer
Dim PROD(6) As Double
Dim FEED(6) As Double
Dim FL(50) As Double
Dim FV(50) As Double
Dim FLL(50, 5) As Double
Dim T(50) As Double
Dim BMAT(50, 7, 6) As Double
Dim D(50, 6) As Double
Dim CM(6, 13) As Double
Dim Pi(5) As Double
Dim DPI(5, 6) As Double
Dim SL(50) As Double
Dim SV(50) As Double
Dim FKV(50) As Double
Dim FSTR(50, 6) As Double

' get current input sheet and set variables for output sheets
Set ws = ActiveSheet
Set wsfp = Sheets("Flux Profile")
On Error GoTo 21
Set wsfpd = Sheets("Flux Profile Diagram")
Set wsmfd = Sheets("Mole Fraction Profile Diagram")
21: On Error GoTo 0
If Not wsfpd Is Nothing Then wsfpd.Delete
If Not wsmfd Is Nothing Then wsmfd.Delete

' Clear Output-Sheets
wsfp.Cells.ClearContents

' number of components
NK = ws.Cells(5, 2)

' title text
ITEXT = ws.Cells(6, 2)

' Wilson parameters PARAM(I,J) (U(J,I)-U(I,I))
For i = 1 To NK
For N = 1 To NK
PARAM(i, N) = ws.Cells(17 + i, 1 + N)
Next N
Next i
' molar volumes (CM3/MOL) and Antoine-constants (kPa)
For i = 1 To NK
VI(i) = ws.Cells(9 + i, 2 + k)
For k = 1 To 3
ANT(k, i) = ws.Cells(9 + i, 2 + k)
Next k
Next i

For i = 1 To NK
ANT(1, i) = 2.3025851 * ANT(1, i)
ANT(2, i) = 2.3025851 * ANT(2, i)
Next i

NST = ws.Cells(25, 2)
NFEED = ws.Cells(26, 2)
NSL = ws.Cells(27, 2)
NSV = ws.Cells(28, 2)

Index(1) = 1
NSL1 = NSL + 1
NSL2 = NSL + 2
Index(NSL2 + NSV) = -NST
IK = 1

' EINGABE: DESTILLATMENGE, RUECKLAUFVERHAELTNIS; DRUCK IM KOPF UND
' SUMPF DER KOLONNE (KPA), SCHAETZWERTE FÜR DIE TEMPERATUR AM KOPF
' UND IM SUMPF DER KOLONNE (C)
DEST = ws.Cells(29, 2)
RFLX = ws.Cells(30, 2)
PT = ws.Cells(31, 2)
PB = ws.Cells(32, 2)
TT = ws.Cells(33, 2)
TB = ws.Cells(34, 2)

' FLMAX: MAXIMALE AENDERUNG DER STROEME (Z.B.0.5), DTMAX:MAXI-
' MALE TEMPERATURAENDERUNG WAEHREND DER ITERATION (Z.B.10.)
DTMAX = ws.Cells(35, 2)
FLMAX = ws.Cells(36, 2)

NK1 = NK + 1
For i = 1 To NST
P(i) = PB - (PB - PT) / CDbl(NST - 1) * CDbl(i - 1)
SL(i) = 0#
SV(i) = 0#
FKV(i) = 0#
FSTR(i, NK1) = 0#
For j = 1 To NK
FSTR(i, j) = 0#
Next j
Next i
For i = 1 To NFEED
' EINGABE DES ZULAUFBODENS, -BEDINGUNGEN UND MENGEN
' NF = ZULAUFBODEN
NF = ws.Cells(39 + i, 3)
' FKV = DAMPFANTEIL DES ZULAUFS
' FSTR(NF,I) MENGE DER KOMPONENTE I IM ZULAUF
FKV(NF) = ws.Cells(39 + i, 3)
For j = 1 To NK
FSTR(NF, j) = ws.Cells(39 + i, 3 + j)
Next j
For j = 1 To NK
FSTR(NF, NK1) = FSTR(NF, NK1) + FSTR(NF, j)
Next j
Next i
If NSL <> 0 Then
For i = 1 To NSL
' NLS = BODEN FUER DEN FLUESSIGEN SEITENSTROM
NLS = ws.Cells(51 + i, 2)
IK = IK + 1
Index(IK) = NLS
' SL = MENGE DES FLÜSSIGEN SEITENSTROMS
SL(NLS) = ws.Cells(51 + i, 3)
Next i
End If
If NSV <> 0 Then
For i = 1 To NSV
IK = IK + 1
' NVS = BODEN FUER DEN DAMPFFOERMIGEN SEITENSTROM
NVS = ws.Cells(63 + i, 2)
Index(IK) = -NVS
' SV = MENGE DES DAMPFFÖRMIGEN SEITENSTROMS
SV(NVS) = ws.Cells(63 + i, 3)
Next i
End If
' BERECHNUNG DER FLUESSIGKEITS- UND DAMPFSTROEME AUF DEN BOEDEN
' (CONSTANT MOLAL OVERFLOW)
FV(NST) = DEST + FKV(NST) * FSTR(NST, NK1)
FL(NST) = DEST + RFLX + (1# - FKV(NST)) * FSTR(NST, NK1) - SL(NST)
FV(NST - 1) = FL(NST) - FSTR(NST, NK1) + SV(NST) + SL(NST) + DEST
For ii = 3 To NST
If NST > 2 Then
i = NST + 2 - ii
FL(i) = FL(i + 1) - SL(i) + (1# - FKV(i)) * FSTR(i, NK1)
FV(i - 1) = FV(i) + SV(i) - FKV(i) * FSTR(i, NK1)
End If
Next ii
FL(1) = FL(2) - SL(1) + (1# - FKV(1)) * FSTR(1, NK1)
FL(1) = FL(1) - FV(1)
For j = 1 To NK1
FEED(j) = 0#
For i = 1 To NST
FEED(j) = FEED(j) + FSTR(i, j)
Next i
Next j

' ERSTE ABSCHAETZUNG DES TEMPERATUR- UND KONZENTRATIONSPROFILS
For i = 1 To NST
T(i) = TB + (i - 1) * (TT - TB) / NST
Next i

' IRES = EXPONENT FUER DAS ABBRUCHKRITERIUM RLIM= 10.D00**(-IRES)
IRES = ws.Cells(37, 2)
rlim = 10# ^ (-IRES)

For i = 1 To NST
For j = 1 To NK
FLL(i, j) = FEED(j) / FEED(NK1) * FL(i)
Next j
Next i

NIT = 0
res = 10# * rlim
While res > rlim
NKa = NK - 1
NIT = NIT + 1

' BERECHNUNG DER AKTIVITAETSKOEFFIZIENTEN UND DER ABLEITUNG
' NACH DER TEMPERATUR UND DER MOLMENGEN
For i = 1 To NST
For j = 1 To NK
XX(j) = FLL(i, j)
Next j

FLSUM = FL(i)

Call WILSON(T(i), XX, Pi, DPI, FLSUM)

For j = 1 To NK
For k = 1 To NKa
BMAT(i, j, k) = (DPI(j, k) - DPI(j, NK)) / P(i)
Next k
BMAT(i, j, NK) = DPI(j, NK + 1) / P(i)
BMAT(i, NK + 1, j) = Pi(j) / P(i)
Next j
Next i
'200 CONTINUE

For IK = 1 To NST
i = NST + 1 - IK
ip = 2 * NK + 1
If i = 1 Then ip = NK + 1
D(i, NK) = -1 + BMAT(i, NK + 1, NK)
For j = 1 To NKa
D(i, NK) = D(i, NK) + BMAT(i, NK + 1, j)
D(i, j) = FSTR(i, j) - FLL(i, j) * (1 + SL(i) / FL(i))
D(i, j) = D(i, j) - BMAT(i, NK1, j) * (FV(i) + SV(i))
If i <> 1 Then D(i, j) = D(i, j) + BMAT(i - 1, NK1, j) * FV(i - 1)
If i <> NST Then D(i, j) = D(i, j) + FLL(i + 1, j)
' AUFSTELLUNG DER JACOBI-MATRIX UND LOESUNG DER TRIDIAGONALEN
' MATRIX DURCH GAUSSSCHE ELIMINIERUNG

For k = 1 To NK
If i <> 1 Then CM(j, k + NK) = BMAT(i - 1, j, k) * FV(i - 1)
CM(j, k) = -BMAT(i, j, k) * (FV(i) + SV(i))
Next k
Next j
For j = 1 To NKa
CM(j, j) = CM(j, j) - 1 - SL(i) / FL(i)
Next j
For j = 1 To NK
CM(NK, j) = 0#
CM(NK, j + NK) = 0#
CM(j, ip) = D(i, j)
For k = 1 To NK
CM(NK, j) = CM(NK, j) + BMAT(i, k, j)
Next k
Next j

If i <> NST Then
For j = 1 To NKa
CM(j, ip) = CM(j, ip) - D(i + 1, j)
For k = 1 To NK
CM(j, k) = CM(j, k) - BMAT(i + 1, j, k)
Next k
Next j
End If
Call GAUSL(6, 13, NK, ip - NK, CM)

For j = 1 To NK
D(i, j) = CM(j, ip)
If i <> 1 Then
For k = 1 To NK
BMAT(i, j, k) = CM(j, k + NK)
Next k
End If
Next j

'300 CONTINUE
Next IK

For i = 2 To NST
For j = 1 To NK
For k = 1 To NK
D(i, j) = D(i, j) - BMAT(i, j, k) * D(i - 1, k)
Next k
Next j
Next i

res = 0#
' AENDERUNG DER UNABHAENGIGEN VARIABLEN NACH DER NEWTON-RAPHSON METHODE
For i = 1 To NST
Q = Abs(D(i, NK) / DTMAX)
If Q > 1# Then D(i, NK) = D(i, NK) / Q
T(i) = T(i) - D(i, NK)
D(i, NK) = 0#
FLM = FLMAX * FL(i)
For j = 1 To NKa
D(i, NK) = D(i, NK) - D(i, j)
Next j
Sum = 0#
For j = 1 To NK
Q = Abs(D(i, j) / FLM)
' BERECHNUNG DER FEHLERQUADRATSUMME
res = res + Q * Q
If Q > 1# Then D(i, j) = D(i, j) / Q
FLL(i, j) = FLL(i, j) - D(i, j)
If FLL(i, j) < 0# Then FLL(i, j) = 0#
Sum = Sum + FLL(i, j)
Next j
Q = FL(i) / Sum
For j = 1 To NK
FLL(i, j) = FLL(i, j) * Q
Next j
Next i
' WRITE (NAG,502) RES,T(1),T(NST)
' 502 FORMAT(/,'WERT DER ZIELFUNKTION=',E12.3,' TB=',E12.3,' TT=´
' 1,E12.3)
'C UEBERPRUEFUNG DES ABBRUCHKRITERIUMS
Wend

' write flux report column header
wsfp.Cells(1, 1) = "Calculation Output"
wsfp.Cells(3, 1) = "Stage"
wsfp.Cells(3, 2) = "Temperature"
wsfp.Cells(4, 2) = "°C"
wsfp.Cells(3, 3) = "Pressure"
wsfp.Cells(4, 3) = "kPa"
wsfp.Cells(3, 4) = "Total Liquid Flux"
wsfp.Cells(4, 4) = "same as in-unit"
wsfp.Cells(3, 5) = "Componentr Liquid Flux"
For i = 1 To NK
wsfp.Cells(4, 4 + i) = "comp." & i
Next i
wsfp.Cells(3, 5 + NK) = "Component Liquid Mole Fraction"
For i = 1 To NK
wsfp.Cells(4, 4 + NK + i) = "x" & i
Next i

' write flux report
For i = 1 To NST
wsfp.Cells(4 + i, 1) = i
wsfp.Cells(4 + i, 2) = T(i)
wsfp.Cells(4 + i, 3) = P(i)
wsfp.Cells(4 + i, 4) = FL(i)
Suml = 0
For j = 1 To NK
wsfp.Cells(4 + i, 4 + j) = FLL(i, j)
Suml = Suml + FLL(i, j)
Next j
For j = 1 To NK
wsfp.Cells(4 + i, 4 + NK + j) = FLL(i, j) / Suml
Next j
Next i

Worksheets("Product Streams").Cells.ClearContents
Worksheets("Product Streams").Cells(1, 1) = "Product Streams"
Worksheets("Product Streams").Cells(3, 1) = "Liquid Product Streams"
Worksheets("Product Streams").Cells(4, 1) = "stage"
Worksheets("Product Streams").Cells(4, 2) = "component streams"

For j = 1 To NSL1
i = Index(j)
Q = 1#
If i <> 1 Then Q = SL(i) / FL(i)
For k = 1 To NK
PROD(k) = Q * FLL(i, k)
Next k
Worksheets("Product Streams").Cells(4 + j, 1) = i
For k = 1 To NK
Worksheets("Product Streams").Cells(4 + j, 1 + k) = PROD(k)
Next k
Next j

Worksheets("Product Streams").Cells(4 + NSL1 + 2, 1) = "Vapor Product Streams"
Worksheets("Product Streams").Cells(4 + NSL1 + 3, 1) = "stage"
Worksheets("Product Streams").Cells(4 + NSL1 + 3, 2) = "component streams"

NSLT = NSL2 + NSV
lline = 4 + NSL1 + 3
For j = NSL2 To NSLT
lline = lline + 1
i = -Index(j)
Q = 1#
If i <> NST Then Q = SV(i) / FV(i)
Worksheets("Product Streams").Cells(lline, 1) = i
For k = 1 To NK
PROD(k) = Q * BMAT(i, NK1, k) * FV(i)
Worksheets("Product Streams").Cells(lline, 1 + k) = PROD(k)
Next k
Next j
Call format_results
Charts("Flux Profile Diagram").Activate
End Sub

Sub WILSON(TEMP, FL, Pi, DPI, FLSUM)
'DAS UNTERPROGRAMM WILSON ERLAUBT DIE BERECHNUNG DER PARTIAL-
'DRUECKE UND DER ABLEITUNG NACH DER TEMPERATUIR UND DER MOLMEN
'GEN (BASIS WILSON- UND ANTOINE-GLEICHUNG)
'DIE UEBERGABEPARAMETER HABEN DIE FOLGENDE BEDEUTUNG:
'TEMP TEMPERATUR C
'FL (I) MOLMENGEN DER KOMPONENTE I I=1,2..NK
'GAM(I) AKTIVITAETSKOEFFIZIENT BERECHNET MIT DER WILSON-GLEICHUNG
'PI(I) PARTIALDRUCK DER KOMPONENTE I
'DPI(I,J)ABLEITUNG VON PI(I) GENERATED IN WILSON
'FUER J = 1,2..NK SIND ES DIE ABLEITUNGEN NACH DEN MOLMENEGEN
'FUER J=NK+1 SIND ES DIE ABLEITUNGEN NACH DER TEMPERATUR
'IMPLICIT REAL*8 (A-H,O-Z)
Dim GAM(5), PRS(5), DPRS(5), WLAM(5, 5)
'******!! COMMON/DIST/ANT(3,5),VI(5),PARAM(5,5),NK,NK1
For i = 1 To NK
PRS(i) = Exp(ANT(1, i) - ANT(2, i) / (ANT(3, i) + TEMP))
DPRS(i) = ANT(2, i) / (ANT(3, i) + TEMP) ^ 2
Next i
TEMK = TEMP + 273.15

For i = 1 To NK
For j = 1 To NK
WLAM(i, j) = VI(j) / VI(i) * Exp(-PARAM(i, j) / TEMK)
Next j
Next i

For i = 1 To NK
A1 = 0#
A2 = 0#
A3 = 0#
A4 = 0#
For k = 1 To NK
A5 = 0#
A6 = 0#
A1 = A1 + FL(k) * WLAM(i, k)
A2 = A2 + FL(k) * WLAM(i, k) * PARAM(i, k) / TEMK ^ 2
For j = 1 To NK
A5 = A5 + FL(j) * WLAM(k, j)
A6 = A6 + FL(j) * WLAM(k, j) * PARAM(k, j) / TEMK ^ 2
Next j
A3 = A3 + FL(k) * WLAM(k, i) / A5
A4 = A4 + FL(k) * WLAM(k, i) * PARAM(k, i) / TEMK ^ 2 / A5
A4 = A4 - FL(k) * WLAM(k, i) * A6 / A5 ^ 2
Next k
GAM(i) = Exp(-Log(A1 / FLSUM) + 1# - A3)
Pi(i) = FL(i) / FLSUM * GAM(i) * PRS(i)
DPI(i, NK1) = Pi(i) * (-A2 / A1 - A4 + DPRS(i))
For L = 1 To NK
A7 = 0#
A9 = 0#
For k = 1 To NK
A8 = 0#
A9 = A9 + FL(k) * WLAM(L, k)
For j = 1 To NK
A8 = A8 + FL(j) * WLAM(k, j)
Next j
A7 = A7 + FL(k) * WLAM(k, i) * WLAM(k, L) / A8 ^ 2
Next k
DPI(i, L) = -WLAM(i, L) / A1 - WLAM(L, i) / A9 + A7
Next L
Next i

For i = 1 To NK
For L = 1 To NK
S = DPI(i, L) * FL(i)
If L = i Then S = S + 1
DPI(i, L) = PRS(i) * GAM(i) / FLSUM * S
Next L
Next i
End Sub
Sub GAUSL(ND, NCOL, N, NS, A)
' DAS UNTERPROGRAMM GAUSL LOEST N LINEARE ALGEBRAISCHE GLEICHUNGEN
' DURCH GAUSSSCHE ELIMINIERUNG
' IMPLICIT REAL*( (A-H,O-Z)
'ReDim A(ND,NCOL)
N1 = N + 1
Nt = N + NS
If N <> 1 Then
For i = 2 To N
ip = i - 1
i1 = ip
X = Abs(A(i1, i1))
For j = i To N
If Abs(A(j, i1)) > X Then
X = Abs(A(j, i1))
ip = j
End If
Next j
If ip <> i1 Then
For j = i1 To Nt
X = A(i1, j)
A(i1, j) = A(ip, j)
A(ip, j) = X
Next j
End If
For j = i To N
X = A(j, i1) / A(i1, i1)
For k = i To Nt
A(j, k) = A(j, k) - X * A(i1, k)
Next k
Next j
Next i
End If
For ip = 1 To N
i = N1 - ip
For k = N1 To Nt
A(i, k) = A(i, k) / A(i, i)
If i <> 1 Then
i1 = i - 1
For j = 1 To i1
A(j, k) = A(j, k) - A(i, k) * A(j, i)
Next j
End If
Next k
Next ip
End Sub

Private Sub format_results()

' format flux profile report sheet
Sheets("Flux Profile").Select
Range("A1").Select
With Selection.Font
.Name = "Arial"
.Size = 16
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndx = xlAutomatic
End With
Selection.Font.Bold = True

Range("A3:O3").Select
With Selection.Interior
.ColorIndex = 34
.Pattern = xlSolid
End With

Columns("B:B").Select
Selection.NumberFormat = "0.000"
Columns("C:C").Select
Selection.NumberFormat = "0.000"
Columns("D:D").Select
Selection.NumberFormat = "0.00"
Columns("E:O").Select
Selection.NumberFormat = "0.00000"
Range("A3:I100").Select

' add chart
Charts.Add
Dim ser As Object
ActiveChart.ChartType = xlXYScatterLines
On Error Resume Next
For Each ser In ActiveChart.SeriesCollection
ser.Delete
Next ser
On Error GoTo 0

'select chart data
undels = ActiveChart.SeriesCollection.Count
With ActiveChart
'Total Flux Curve
.SeriesCollection.NewSeries
.SeriesCollection(undels + 1).XValues = "='" & wsfp.Name & "'!R" & CInt(5) & "C1:R" & CInt(4 + NST) & "C1"
.SeriesCollection(undels + 1).Values = "='" & wsfp.Name & "'!R" & CInt(5) & "C4:R" & CInt(4 + NST) & "C4"
.SeriesCollection(undels + 1).Name = "='" & wsfp.Name & "'!R3C4"

'Component Flux Curves
For i = 1 To NK
.SeriesCollection.NewSeries
.SeriesCollection(undels + 1 + i).XValues = "='" & wsfp.Name & "'!R" & CInt(5) & "C1:R" & CInt(4 + NST) & "C1"
.SeriesCollection(undels + 1 + i).Values = "='" & wsfp.Name & "'!R" & CInt(5) & "C" & CInt(4 + i) & ":R" & CInt(4 + NST) & "C" & CInt(4 + i)
.SeriesCollection(undels + 1 + i).Name = "='" & wsfp.Name & "'!R4C" & CInt(4 + i)
Next i
End With
ActiveChart.Location Where:=xlLocationAsNewSheet, Name:="Flux Profile Diagram"

With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "Column Profile (Flux)" & Chr(10) & ITEXT
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "stage number"
.Axes(xlValue, xlPrimery).HasTitle = True
.Axes(xlValue, xlPrimery).AxisTitle.Characters.Text = "flux (input unit)"
End With
With ActiveChart.Axes(xlCategory)
.HasMajorGridlines = True
.HasMinorGridlines = False
End With
With ActiveChart.Axes(xlValue)
.HasMajorGridlines = True
.HasMinorGridlines = False
End With
ActiveChart.Axes(xlValue).Select
Selection.TickLabels.NumberFormat = "0.00"
ActiveChart.ApplyDataLabels Type:=xlDataLabelsShowNone, LegendKey:=False

With ActiveChart.Axes(xlCategory)
.MinimumScale = 1
.MaximumScale = NST
.MinorUnitIsAuto = True
.MajorUnitIsAuto = True
.Crosses = xlAutomatic
.ReversePlotOrder = False
.ScaleType = xlLinear
.DisplayUnit = xlNone
End With

For Each ser In ActiveChart.SeriesCollection
With ser.Border
.ColorIndex = 57
.Weight = xlMedium
.LineStyle = xlContinuous
End With
Next ser
Sheets("Product Streams").Select

' Mole Fraction Profile --------------------------------------------------------------------------------------------------------------------------------------------------------------------

' add chart
Charts.Add
ActiveChart.ChartType = xlXYScatterLines
On Error Resume Next
For Each ser In ActiveChart.SeriesCollection
ser.Delete
Next ser
On Error GoTo 0

'select chart data
undels = ActiveChart.SeriesCollection.Count
With ActiveChart

' Componenet mole fraction Curves
For i = 1 To NK
.SeriesCollection.NewSeries
.SeriesCollection(undels + i).XValues = "='" & wsfp.Name & "'!R" & CInt(5) & "C1: R" & CInt(4 + NST) & "C1 "
.SeriesCollection(undels + i).Values = "='" & wsfp.Name & "'!R" & CInt(5) & "C" & CInt(4 + NK + i) & ":R" & CInt(4 + NST) & "C" & CInt(4 + NK + i)
.SeriesCollection(undels + i).Name = "='" & wsfp.Name & "'!R4C" & CInt(4 + NK + i)
Next i
End With
ActiveChart.Location Where:=xlLocationAsNewSheet, Name:="Mole Fraction Profile Diagram"


With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "Column Profile (Mole Fraction)" & Chr(10) & ITEXT
.Axes(xlCategory, xlPrimery).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "mole fraction"
End With
With ActiveChart.Axes(xlCategory)
.HasMajorGridlines = True
.HasMinorGridlines = False
End With
With ActiveChart.Axes(xlValue)
.HasMajorGridlines = True
.HasMinorGridlines = False
End With
ActiveChart.Axes(xlValue).Select
Selection.TickLabels.NumberFormat = "0.00"
ActiveChart.ApplyDataLabels Type:=xlDataLabelsShowNone, LegendKey:=False

With ActiveChart.Axes(xlCategory)
.MinimumScale = 1
.MaximumScale = NST
.MinorUnitIsAuto = True
.MajorUnitIsAuto = True
.Crosses = xlAutomatic
.ReversePlotOrder = False
.ScaleType = xlLinear
.DisplayUnit = xlNone
End With
With ActiveChart.Axes(xlValue)
.MinimumScale = 0
.MaximumScale = 1
.MinorUnitIsAuto = True
.MajorUnitIsAuto = True
.Crosses = xlAutomatic
.ReversePlotOrder = False
.ScaleType = xlLinear
.DisplayUnit = xlNone
End With

For Each ser In ActiveChart.SeriesCollection
With ser.Border
.ColorIndex = 57
.Weight = xlMedium
.LineStyle = xlContinuous
End With
Next ser

Sheets("Product Streams").Select
Range("A1").Select
With Selection.Font
.Name = "Arial"
.Size = 16
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With

Selection.Font.Bold = True
Range("A3").Select
End Sub

Public Sub desw_prepare_sheets()
' On Error Resume Next
' Sheets("Flux Profile").Add
' Sheets("product Streams").Add
' Sheets("desw_in").Add
' On Error GoTo 0
Sheets("desw_in").Select
Cells.Select
Selection.Clear

With ws
.Cells(1, 1) = "Distillation (Naphtali-Sandholm)Using the Wilson-Model"
.Cells(2, 1) = "based on code given in 'Grundoperationen' (Gmehling,Brehm)"
.Cells(4, 1) = "General Information"
.Cells(5, 1) = "Number of components:"
.Cells(6, 1) = "Title"
.Cells(8, 1) = "Pure Component Data"
.Cells(9, 1) = "Molar volume, Antoine constants (P [kPa] = 10^(A-B/(C+T[°C]))"
.Cells(9, 2) = "vL"
.Cells(9, 3) = "A"
.Cells(9, 4) = "B"
.Cells(9, 5) = "C"
.Cells(16, 1) = "Interaction Parameters (Wilson,K)"
.Cells(17, 2) = "1"
.Cells(17, 3) = "2"
.Cells(17, 4) = "3"
.Cells(17, 5) = "4"
.Cells(17, 6) = "5"
.Cells(18, 1) = "1"
.Cells(19, 1) = "2"
.Cells(20, 1) = "3"
.Cells(21, 1) = "4"
.Cells(22, 1) = "5"
.Cells(18, 2) = "0"
.Cells(19, 3) = "0"
.Cells(20, 4) = "0"
.Cells(21, 5) = "0"
.Cells(22, 6) = "0"
.Cells(24, 1) = "Column Configuration (Stage 1 is the Reboiler)"
.Cells(25, 1) = "Number of stages (max. 50)"
.Cells(26, 1) = "Number of feeds"
.Cells(27, 1) = "Number of liquid side streams"
.Cells(28, 1) = "Number of vapor side streams"
.Cells(29, 1) = "Destillate flux"
.Cells(30, 1) = "Reflux ratio"
.Cells(31, 1) = "Top pressure (kPa)"
.Cells(32, 1) = "Bottom pressure (kPa)"
.Cells(33, 1) = "Top temperature estimate (C)"
.Cells(34, 1) = "Bottom temperture estimate (C)"
.Cells(35, 1) = "FLMAX"
.Cells(36, 1) = "DTMAX"
.Cells(37, 1) = "Exponent of convergence criterion"
.Cells(39, 1) = "Feeds"
.Cells(39, 2) = "stage"
.Cells(39, 3) = "q"
.Cells(39, 4) = "n1"
.Cells(39, 5) = "n2"
.Cells(39, 6) = "n3"
.Cells(39, 7) = "n4"
.Cells(39, 8) = "n5"
.Cells(40, 1) = "1"
.Cells(41, 1) = "2"
.Cells(42, 1) = "3"
.Cells(43, 1) = "4"
.Cells(44, 1) = "5"
.Cells(45, 1) = "6"
.Cells(46, 1) = "7"
.Cells(47, 1) = "8"
.Cells(48, 1) = "9"
.Cells(49, 1) = "10"
End With
Range("A1").Select
With Selection.Font
.Name = "Arial"
.Size = 16
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
Selection.Font.Bold = True
Range("A1:F1").Select
With Selection.Interior
.ColorIndex = 34
.Pattern = xlSolid
End With
Range("A4:F4").Select
With Selection.Interior
.ColorIndex = 33
.Pattern = xlSolid
End With
Range("A8:F8").Select
With Selection.Interior
.ColorIndex = 33
.Pattern = xlSolid
End With
Range("A16:F16").Select
With Selection.Interior
.ColorIndex = 33
.Pattern = xlSolid
End With
Range("A24:F24").Select
With Selection.Interior
.ColorIndex = 33
.Pattern = xlSolid
End With
Range("A39:H39").Select
With Selection.Interior
.ColorIndex = 33
.Pattern = xlSolid
End With
Range("A5:A6").Select
With Selection.Interior
.ColorIndex = 34
.Pattern = xlSolid
End With
Range("A9:A14").Select
With Selection.Interior
.ColorIndex = 34
.Pattern = xlSolid
End With
Range("A17:A22").Select
With Selection.Interior
.ColorIndex = 34
.Pattern = xlSolid
End With
Range("B17:F17").Select
With Selection.Interior
.ColorIndex = 34
.Pattern = xlSolid
End With
Range("A25:A37").Select
With Selection.Interior
.ColorIndex = 34
.Pattern = xlSolid
End With
Range("A40:A49").Select
With Selection.Interior
.ColorIndex = 34
.Pattern = xlSolid
End With
Range("B18:F22").Select
Selection.NumberFormat = "0.0000"
Range("B18").Select
With Selection.Interior
.ColorIndex = 34
.Pattern = xlSolid
End With
Range("C19").Select
With Selection.Interior
.ColorIndex = 34
.Pattern = xlSolid
End With
Range("D20").Select
With Selection.Interior
.ColorIndex = 34
.Pattern = xlSolid
End With
Range("E21").Select
With Selection.Interior
.ColorIndex = 34
.Pattern = xlSolid
End With
Range("F22").Select
With Selection.Interior
.ColorIndex = 34
.Pattern = xlSolid
End With
ActiveWindow.ScrollRow = 1
Range("A1:F1").Select
Selection.Interior.ColorIndex = 37
Selection.Interior.ColorIndex = 33
Range("A2").Select
Selection.Font.Italic = True
Range("H7").Select
Columns("A:A").ColumnWidth = 27.89
Columns("B:I").Select
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.ShrinkToFit = False
.MergeCells = False
End With
Range("A10").Select
ActiveCell.FormulaR1C1 = "1"
Range("A11").Select
ActiveCell.FormulaR1C1 = "2"
Range("A12").Select
ActiveCell.FormulaR1C1 = "3"
Range("A13").Select
ActiveCell.FormulaR1C1 = "4"
Range("A14").Select
ActiveCell.FormulaR1C1 = "5"
Range("B15").Select
ActiveWindow.ScrollRow = 7
End Sub
 
Grüezi David

Das Ganze ist ja schön umfangreich, würde ich mal sagen...

Wenn ich den Code laufen lasse stosse ich auf das Problem, dass auf Tabellenblätter zugegriffen wird, die in einer leeren Mappe nicht vorhanden sind. Vermutlich gilt das später dann auch für einzelne Daten und Werte. Daher kommt der Code gar nicht so weit, dass der Fehler ausgegeben wird.
Kannst Du daher bitte eine anonymisierte Mappe zum Download bereitstellen, in der diese Dinge bereits enthalten sind? Das Ganze korrekt nachzubauen wäre ansonsten ein immenser Aufwand.

Ein Gedanke kam mir noch, wenn der von tombe genannte Punkt zutrifft.

Kann es sein, dass Du in dem Modul in dem der Code steht vor der allgemeinen Variablen-Deklaration noch die eine oder andere Zeile einfügen musst?
Prüfe und kontrolliere dies mit der Vorgabe, die Du dafür hast (haben musst).
 
Hi Thomas,

also ich würde zwei Mappen zum Download bereitstellen.
1. Wie stelle ich diese zum Download bereit? 2. Was heißt anonymisieren, und wie mache ich das?
 
Grüezi David

Verwende einen der vielen WebSpaces, die im Netz angeboten werden und lade die Mappe dort hoch (hier im Forum gibt es IMO keine Möglichkeit dafür).

HIer ein paar Beispiele (die ich selbst aber nicht wirklich kenne):

http://www.file-upload.net
http://www.bilder-hochladen.net/
http://www.bilder-speicher.de/
http://www.abload.de bzw.
http://www.abload.de/tool.php (Erklärungen zur Bedienung inklusive)
http://drop.io
http://www.hostarea.de
http://www.rapidshare.com
http://flickr.com
http://bilder-upload.eu
http://www.bilder-space.de/

Für Dokumente:
http://www.doktus.de/

Anonymsisieren heisst, die Mappe von Inhalten befreien die nicht veröffentlicht werden dürfen/sollten. Also reale Namen und Adressen oder Telefon-Nummern und so.
Auch reale Umsatzzahlen und Firmen-Namen sollten da nicht enthalten sein.
Das alles kann durch ein paar wenige Phantasie-Bezeichungen ersetzt werden.

Der ganze Aufbau der Mappe, insbesondere Zellbezügt, Formeln und VBA-Programmierung sollten 1:1 erhalten bleiben.
 
http://www.file-upload.net/download-2918213/Berechnung-Destillationskolonnen.xlsm.html

http://www.file-upload.net/download-2918222/Kapitel_9-2-.zip.html

Hallo Zusammen,

also hier jetzt die zwei Links zu einem Webspace, welcher entsprechende Mappen enthält.

Meine Vorstellung von diesem Code war eigentlich, das ich Ihn in einer leeren Mappe schreibe, er mir dann eine Oberfläche (Maske) ausgibt in der ich meine Ausgangsdaten hinterlegen kann und im Anschluss die entsprechenden Rechnungen durchführt und mir Graphiken ausgibt. Anscheinend war dies eine falsche Vorstellung oder?
Vielen dank schon einmal für die Hilfe!
An Thomas: Die Links haben mir geholfen und es war leicht mit Ihnen zu arbeiten, Danke!

MFG
David
 

Neue Beiträge

Zurück