Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1312to1316
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

Modul kann nicht kompiliert werden

Modul kann nicht kompiliert werden
10.05.2013 12:04:18
Anfängerin13
Hallo,
kann mir einer bitte sagen, warum excel mir einen Fehler bereits in der Benennung meines Subs und NEXT row gibt?
Vielen Dank. Code:

Private Sub populateLevels(myRange As Range, dateToFind As Date, TimestampCol, DemandCol,  _
availableCapacityCol, ResidualOptimizationCol, generatedMWhCol, HydroInputCol)
Dim r As Long Dim row As Long Dim mySheet As Worksheet Dim myMin As Single r = myRange.Find(dateToFind).row Set mySheet = myRange.Worksheet For row = 3 To 8790 If mySheet.Range(Cells(row, 10)) Next row Else Sheets("DATA").Select myMin = WorksheetFunction.Min(Selection.Cells(r, DemandCol), Selection.Cells(r, _ availableCapacityCol), Selection.Cells(r, ResidualOptimizationCol)) mySheet.Cells(r, generatedMWhCol) = myMin mySheet.Cells(r, HydroInputCol) = myMin End If End Sub

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Modul kann nicht kompiliert werden
10.05.2013 12:06:14
Hajo_zi
Else und End if muss in der Schleife sein.

AW: Modul kann nicht kompiliert werden
10.05.2013 12:56:33
Anfängerin13
Danke Hajo,
nun wird aber diese Zeile markiert.
If mySheet.Range(Cells(row, 10)) (kleinerzeichen) mySheet.Range(Cells(row, 8)) Then
(Kleiner-zeichen konnte ich hier nicht eingeben)
dabei ist mySheet ja korrekt definiert oder?

...Mit < schon, Mylady! ;-) Gruß owT
10.05.2013 16:50:02
Luc:-?
:-?

AW: Modul kann nicht kompiliert werden
10.05.2013 12:48:42
Luschi
Hallo Anfängerin13,
probiere es mal so:

Private Sub populateLevels(myRange As Range, dateToFind As Date, _
TimestampCol, DemandCol, availableCapacityCol, _
ResidualOptimizationCol, generatedMWhCol, HydroInputCol)
Dim rg As Range
Dim r1 As Long, r2 As Long
Dim mySheet As Worksheet, wsX As Worksheet
Dim myMin As Single
Set rg = myRange.Find(dateToFind)
If Not rg Is Nothing Then
'nur wenn Datum auch gefunden wurde
r1 = rg.row
Set mySheet = rg.Parent
'oder
'Set mySheet = myRange.Parent
'unbedingt den Select-Befehl vermeinden, statt dessen über eine
'Objektvariable das Minimum bestimmen
Set wsX = ThisWorkbook.Worksheets("DATA")
For r2 = 3 To 8790
'With erspart Schreibarbeit - aber achte auf die beginnenden Punte vor .Cells
With mySheet
'in Deiner Version ist Range/Cells doppelt-gemoppelt
If .Cells(r2, 10).Value 
Hinweis: Die vba-Suche nach einem Datum, wenn es stark formatiert wurde, geht bei mir ab Excel 2010/13 öfters in die Hose. Deshalb könnte
Set rg = myRange.Find(dateToFind) aber auch Deine Such-Version ins Leere laufen und bei Dir auch noch einen Fehler werfen. Sollte das der Fall sein, unbedingt noch mal melden.
Gruß von Luschi
aus klein-Paris

Anzeige
AW: Modul kann nicht kompiliert werden
10.05.2013 12:59:00
Anfängerin13
Vielen Dank Luschi.
Ich probiere es mal aus und melde mich gleich wieder! :)

AW: Modul kann nicht kompiliert werden
10.05.2013 13:29:39
Anfängerin13
Hey Luschi,
ich hab in der Tat eine Frage. Es hatte jetzt ziemlich lange gedauert und hab mal abgebrochen.
r1 (Zeile 5104) ist die Zeile (von den 8790) mit dem höchsten Preis, welche mit myMin gefüllt wird in bestimmten Columns.
r2 hingegen (Zeile 5195) müsste doch eigentlich dieselbe Zeile sein, nur dass hier dann null eingefügt wird.
ich hab mal alle r2 zu r1 geändert. Macht es dann noch Sinn? es läuft zumindest.
Vielen Dank für deine vielen Erklärungen. Super!

Anzeige
AW: Modul kann nicht kompiliert werden
10.05.2013 14:01:55
Anfängerin13
Hey Luschi,
es hat funktioniert!! KLASSE!
nur er ist jetzt am Ende in der letzten Zeile 8791 und wenn man alle Werte erneut berechnen will bleibt das r = 8791.
Also dateToFind bleibt beim Ende und springt nicht bei neuem F5 wieder auf Zeile 3.
Private Function findHighestPriceDate(DemandPrice As Range, HydroInputCol As Integer,  _
TimestampCol As Integer, startR As Long, endR As Long) As Date
Dim HighestPrice As Single
Dim HPRow As Long
Dim thisSheet As Worksheet
Dim r As Long
Dim c As Long
HighestPrice = 0
Set thisSheet = DemandPrice.Worksheet
c = DemandPrice.Column
For r = DemandPrice.row To DemandPrice.row + DemandPrice.Rows.Count - 1
If thisSheet.Cells(r, c) > HighestPrice And thisSheet.Cells(r, HydroInputCol) = "" Then
HighestPrice = thisSheet.Cells(r, c)
HPRow = r
End If
  Next r  ('ist jetzt 8791 weshalb der Debug angeht)
findHighestPriceDate = thisSheet.Cells(HPRow, TimestampCol)
End Function

Kann ich hier eine Art Update (wahrscheinlich nicht ScreenUpdate) einbauen?

Anzeige
AW: Modul kann nicht kompiliert werden
10.05.2013 15:02:44
Luschi
Hallo Anfängerin13,
jetzt verwirrst Du mich total.
Wie soll ich diese 3 Begriffe 'dateToFind', 'findHighestPriceDate' und 'populateLevels'
unter einen Hut bekommen. Warum übergibst Du der Funktion 'findHighestPriceDate' die
Parameter 'startR' & 'endR', wenn sie garnicht benötigt werden.
Hättest Du den den zuletzt geposteten Code vom Vba-Editor kopiert, dann müßte die folgende
Programmzeile:
For r = DemandPrice.row To DemandPrice.row + DemandPrice.Rows.Count - 1
so aussehen:
For r = DemandPrice.Row To DemandPrice.Row + DemandPrice.Rows.Count - 1
Du schickst nur ein bischen Code statt die gesamte Funktion. Irgendwo steht noch folgende
Anweisung: Dim row As Integer
Únd das geht so nicht. Vba-interne Kennwörter, Zelladressbezeichnungen (z.B. "A1") usw. benutzt man nicht für eigene Variablendefinitionen.
Gruß von Luschi
aus klein-Paris
PS: Ich weiß immer noch nicht, was eigentlich geklappt hat!

Anzeige
AW: Modul kann nicht kompiliert werden
13.05.2013 12:01:31
Anfängerin13
Hey Luschi,
Der Code den du geschrieben hast ist super!! Alles hat funktioniert und meine Verwirrung war tatsächlich unnötig, da nachdem der Code einmal durchlief beim nächsten Mal r=8791 war (quasi das Ende aller Zeilen) und daher nicht wieder von neu laufen wollte.
Ich habe das aber lösen können. Und in der Tat klappt alles so wie gewollt. EIN RIESEN DANKESCHÖN.
Nun zu deinen Fragen: die Parameter 'startR' & 'endR' stehen für die Zeilen 3 bis 8790, und ich dachte das wäre nötig, damit Excel weiß, wo von wo bis wo er laufen soll.
Zu dem "Row", ja mir war nicht bekannt, dass man VBA-interne Wörter besser nicht verwendet.

Anzeige
AW: Modul kann nicht kompiliert werden
10.05.2013 14:13:43
Luschi
Hallo Anfängerin13,
nach Deinem Ausgangscode zu urteilen macht es keinen Sinn.
Da mir diese 2 Konstukt-Zeilen mißfallen:
r = myRange.Find(dateToFind).row (Suchen eines Zellwertes und sofort die ZeilenNr.
bestimmen geht schief, wenn der Wert nicht gefunden wurde - Error))
For row = 3 To 8790 (Row ist eine Vba-interne Eigenschaft der Zelle)
habe ich aus r -» r1 gemacht und aus row -» r2.
Vielleicht solltest Du nochmmal ein bischen beschreiben. was so richtig passieren soll.
Nach Ursprungs-Code ist r1 (vorher r) die ZeilenNr., in der das gesuchte Datum gefunden wurde.
Gruß von Luschi
aus klein-Paris

Anzeige
AW: Modul kann nicht kompiliert werden
13.05.2013 12:12:21
Anfängerin13
Also es geht im Grunde darum in meiner Excel, dass ich versuche ein Wasserkraftwerk zu modellieren. Für jede Stunde im Jahr habe ich Nachfragemengen und Preise modelliert und darauf basierend soll ökonomisch, dann wenn Nachfrage und Preis am Höchsten sind, das Wasser aus dem Staudamm entlassen werden.
Daher sucht er den höchsten Preis und fügt dann, wenn die Zelle leer ist und die optimierbare Menge auch überhaupt der Kapazität entspricht, die generierte Menge ein.
(Else
myMin = WorksheetFunction.Min(wsX.Cells(r1, DemandCol).Value, wsX.Cells(r1, availableCapacityCol).Value, wsX.Cells(r1, ResidualOptimizationCol).Value)
.Cells(r1, generatedMWhCol).Value = myMin
.Cells(r1, HydroInputCol).Value = myMin)

Alles super jetzt also und ich bin dir endlos dankbar!
Nun wenn die Optimierung läuft, fügt er genau in der ausgewählten Stunde die Menge ein und dann gehts wie vorher wieder mit lauter Nullen weiter bis ein nächster hoher Preis gefunden wird.
Kann man um es realistischer machen, einfügen, dass wenn eine Zelle in Zeile (zb.) 4500 gefüllt wird, sagen, dass die Zeile davor und Zeile danach ebenfalls ansteigend und abfallend gefüllt werden müssen, um zu simulieren, dass so ein Kraftwerk wahrscheinlich nicht nur in dieser einen Stunde läuft.

Anzeige
OT: Hoffentlich ist das nicht dein einziger ...
13.05.2013 15:04:13
Luc:-?
…Optimierungsanhalt, MyLady*!
Es gibt ja auch Notsituationen, bei denen der Staudamm zu brechen oder überflutet zu wdn droht. Wenn dann nur nach einem finanzenbasierten Optimierungsmodell vorgegangen wird, kann es zu einer Katastrophe kommen, die ein Vielfaches kostet (wie vor Jahren im Dresdner Raum geschehen!).
*Eine Dame 'Anfängerin' zu nennen, halte ich für unhöflich! ;-)
Gruß Luc :-?
Besser informiert mit …

Anzeige
AW: OT: Hoffentlich ist das nicht dein einziger ...
14.05.2013 10:05:22
Anfängerin13
:) Ja ich dachte ich mache mal kenntlich, dass ich VBA neu erkunde.
Wie stellt man den Optimierungshalt aus? Denn wenn ich F5 drücke, springt der wieder in die Reihe und sagt, dass ich am Ende meiner rows angelangt bin.
Und zu meinem Modell hast du natürlich Recht. Ich bin aber auch nur Studentin und schreibe eine Finanzthese. Also basierend auf meinen Überlegungen wird sich nichts auf der Welt ändern Luc ;)
Ich habe bezüglich des Anfahrens und Abfahrens dies eingepackt, aber ganz sinnvoll ist es glaube ich nicht.
With mySheet
If .Cells(r1, 10).Value &lt .Cells(r1, 8).Value Then
.Cells(r1, generatedMWhCol).Value = 0
.Cells(r1, HydroInputCol).Value = 0
Else
myMin = WorksheetFunction.Min(wsX.Cells(r1, DemandCol).Value, wsX.Cells(r1, availableCapacityCol).Value, wsX.Cells(r1, ResidualOptimizationCol).Value)
.Cells(r1 - 1, generatedMWhCol).Value = myMin * 0.5
.Cells(r1, generatedMWhCol).Value = myMin
.Cells(r1 + 1, generatedMWhCol).Value = myMin * 0.5
.Cells(r1 - 1, HydroInputCol).Value = myMin * 0.5
.Cells(r1, HydroInputCol).Value = myMin
.Cells(r1 + 1, HydroInputCol).Value = myMin * 0.5

Anzeige
Falls das eine Frage war, stelle sie bitte ...
15.05.2013 20:14:03
Luc:-?
…nochmals in einem neuen Thread, denn der hier ist morgen nicht mehr im Forumszugriff!
Gruß Luc :-?

306 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige