excel VBA plotse stop programma

Status
Niet open voor verdere reacties.

jevaly

Gebruiker
Lid geworden
6 sep 2007
Berichten
7
hallo,

ik heb een programmatje geschreven in de VBA van excel en het werkt volledig zoals ik het wil in de debugmode. als ik echter probeer het te runnen in een worksheet dan loopt het ongeveer tot halverwege om dan plotseling te stoppen (zonder dat er een stop argument staat)
Code:
Public Function PredictCorrosion() As Variant
Dim metal As String
Dim T As Double
Dim Pr As Double
Dim RH As Double
Dim SO As Double
Dim ET As Double
Dim prediction As Variant
Dim var As Integer
T = InputBox("Temperature (K)", "Input Data", T)
Pr = InputBox("Prepicitation (mm)", "Input Data", Pr)
RH = InputBox("Relative Humidity(%)", "Input Data", RH)
SO = InputBox("SO2 concentration", "Input Data", SO)
ET = InputBox("Exposure Time (years)", "Input Data", ET)
Worksheets("Blad2").Select
Worksheets("Blad2").Activate
Select Case var
    Case 1
        Range("C3").Value = T
hier stopt het programma plotseling. (hetzelfde gaat op voor voor cases 2 en 3) ik kan geen logische verklaring vinden, dus als iemand mij kan helpen zou dat super zijn!
 
Waarom een Function?

Een Function kan niet veel meer dan "iets" te zetten in de cel die de functie aanroept. That's about all a function can do... ;)
 
Waarom die Select? Waarom die Activate?

Hoe komt var aan zijn waarde?

Volgens mij heb je nog wel wat werk voor de boeg... ;)
 
Waarom die Select? Waarom die Activate?

Hoe komt var aan zijn waarde?

Volgens mij heb je nog wel wat werk voor de boeg... ;)

die select en die activate om in het juiste werkblad te geraken,

var komt aan zijn waarde in dit stukje code (dat daar eigenlijk tussen moet, maar ik weggelaten had, vermits ik dacht dat dat niet relevant was)

Code:
metal = InputBox("Which kind of metal do you use: Steel, Copper or Aluminium?", "Input Data", metal)
    If metal = "Steel" Then
        var = 1
    ElseIf metal = "Copper" Then
        var = 2
    ElseIf metal = "Aluminium" Then
        var = 3
    Else
        MsgBox "Invalid input data", , "Input Data"
        Exit Function
    End If

en zoals ik al zei, werkt het dus als ik in de debugger op F5 duw, alleen in mijn werkblad breekt het af op een onlogische plaats
 
Loop hem eens door in de debugger met F8 en zie eens wat de waarde van var is.
Ik vermoed dat die waarde 0 heeft.
Met F8 zie je ook waar ie beeindigt wordt, met F5 niet.
 
Je kan die functie enkel iets in de huidige cel laten zetten, nergens anders. Dus niet in C3 (tenzij de functie in C3 staat).

Anders gezegd, er is geen reden om naar een ander werkblad te springen.

Je zet iets in de huidige cel via

Code:
PredictCorrosion = 5

Er komt dan een 5 in die cel. Eerst komt de naam van jouw functie, dan de waarde die je toewijst. Die 5 zal jij nu afhankelijk moeten gaan maken van een aantal dingen.

Wigi
 
Loop hem eens door in de debugger met F8 en zie eens wat de waarde van var is.
Ik vermoed dat die waarde 0 heeft.
Met F8 zie je ook waar ie beeindigt wordt, met F5 niet.

heb ik gedaan, waarde van var is wat het moet zijn (1 voor steel en zovoort) en het programma stopt waar men eerste stuk code eindigt, maar enkel als de functie wordt opgeroepen vanuit het werkblad en niet vanuit de editor.

wigi zei:
Je kan die functie enkel iets in de huidige cel laten zetten, nergens anders. Dus niet in C3 (tenzij de functie in C3 staat).

de waarde van predictcorrosion kan enkel in de actieve cel staan. akkoord, dat is ook de bedoeling. Maar de functie kan via Range("A1").value=1 bv wel andere variabelen naar willekeurige cellen schrijven (in ieder geval is me dat al gelukt in andere programmatjes)
 
de waarde van predictcorrosion kan enkel in de actieve cel staan. akkoord, dat is ook de bedoeling. Maar de functie kan via Range("A1").value=1 bv wel andere variabelen naar willekeurige cellen schrijven (in ieder geval is me dat al gelukt in andere programmatjes)

Dat geloof ik niet.

Kom, laat die progjes dan maar eens zien ;)
 
Dat geloof ik niet.

Kom, laat die progjes dan maar eens zien ;)

allez
eenvoudig voorbeeld:

Code:
function test()
    Range("a1").Value = 1
    Range("a1").Formula = "=myfn(a1)"
    Range("a1").Clear
    MsgBox "Hello"
End function
 
Ah OK, je gaat die functie niet gebruiken in een cel, maar gewoon uitvoeren?

Dan zijn er natuurlijk geen restricties (zoals die hierboven aangegeven werden).
 
Ik denk dat je probleem ligt in het feit dat je nergens aan dataconversie doet. Je inputbox levert je een string op en die stop je vervolgens in een double. Daarna stop je die double in een variant; namelijk in range("C3").value.

Om problemen zoals deze te voorkomen is het daarom goed om de functie CDbl() en CVar() te gebruiken in je code:
Code:
Public Function PredictCorrosion() As Variant
    Dim metal As String
    Dim T As Double
    Dim Pr As Double
    Dim RH As Double
    Dim SO As Double
    Dim ET As Double
    Dim prediction As Variant
    Dim var As Integer
    
    T = CDbl(InputBox("Temperature (K)", "Input Data", T))
    Pr = CDbl(InputBox("Prepicitation (mm)", "Input Data", Pr))
    RH = CDbl(InputBox("Relative Humidity(%)", "Input Data", RH))
    SO = CDbl(InputBox("SO2 concentration", "Input Data", SO))
    ET = CDbl(InputBox("Exposure Time (years)", "Input Data", ET))
    Worksheets("Sheet2").Select
    Worksheets("Sheet2").Activate
    
    Select Case var
        Case 1
            Range("C3").Value = CVar(T)

Laat even weten of dit je probleem inderdaad oplost?!
 
Ik denk dat je probleem ligt in het feit dat je nergens aan dataconversie doet. Je inputbox levert je een string op en die stop je vervolgens in een double. Daarna stop je die double in een variant; namelijk in range("C3").value.

Om problemen zoals deze te voorkomen is het daarom goed om de functie CDbl() en CVar() te gebruiken in je code:
Code:
Public Function PredictCorrosion() As Variant
    Dim metal As String
    Dim T As Double
    Dim Pr As Double
    Dim RH As Double
    Dim SO As Double
    Dim ET As Double
    Dim prediction As Variant
    Dim var As Integer
    
    T = CDbl(InputBox("Temperature (K)", "Input Data", T))
    Pr = CDbl(InputBox("Prepicitation (mm)", "Input Data", Pr))
    RH = CDbl(InputBox("Relative Humidity(%)", "Input Data", RH))
    SO = CDbl(InputBox("SO2 concentration", "Input Data", SO))
    ET = CDbl(InputBox("Exposure Time (years)", "Input Data", ET))
    Worksheets("Sheet2").Select
    Worksheets("Sheet2").Activate
    
    Select Case var
        Case 1
            Range("C3").Value = CVar(T)

Laat even weten of dit je probleem inderdaad oplost?!

dit loste het probleem niet op
wat het echter wel oploste was dit voor de case zetten:
Code:
Set SaveActiveWorkbook = ActiveWorkbook
Set SaveActiveSheet = ActiveSheet
Set SaveActiveCell = ActiveCell
Workbooks("database").Activate
Worksheets("Blad2").Select
en dit erna:
Code:
SaveActiveWorkbook.Activate
SaveActiveSheet.Select
SaveActiveCell.Activate

toch bedankt iedereen :)
 
Post je hele code eens, volgens mij kan een en ander een pak beter.
 
Post je hele code eens, volgens mij kan een en ander een pak beter.

uiteraard kan er nog veel beter (te meer daar dit mijn eerste programmatje is in vba), ik pretendeer dan ook niet de volmaakte programmeur te zijn. :confused:

ik ben dan ook constant verbeteringen aan het maken.

maar u wou code, hier is code:
Code:
Sub PredictCorrosion()
Dim metal As String
Dim T As Double
Dim Pr As Double
Dim RH As Double
Dim SO As Double
Dim ET As Double
Dim prediction As Variant
Dim var As Integer
MsgBox "Please give input Data", , "Input Data"
metal = InputBox("Which kind of metal do you use: Steel, Copper or Aluminium?", "Input Data", metal)
    If metal = "Steel" Or metal = "steel" Then
        var = 1
    ElseIf metal = "Copper" Or metal = "copper" Then
        var = 2
    ElseIf metal = "Aluminium" Or metal = "aluminium" Then
        var = 3
    Else
        MsgBox "Invalid input data", , "Input Data"
        Exit Sub
    End If
T = CDbl(InputBox("Temperature (K)", "Input Data", T))
Pr = CDbl(InputBox("Prepicitation (mm)", "Input Data", Pr))
RH = CDbl(InputBox("Relative Humidity(%)", "Input Data", RH))
SO = CDbl(InputBox("SO2 concentration", "Input Data", SO))
ET = CDbl(InputBox("Exposure Time (years)", "Input Data", ET))
Set SaveActiveWorkbook = ActiveWorkbook
Set SaveActiveSheet = ActiveSheet
Set SaveActiveCell = ActiveCell
Workbooks("database").Activate
Worksheets("Blad2").Select
Select Case var
    Case 1
        Range("C3").Value = T
        Range("B3").Value = ET
        Range("D3").Value = RH
        Range("E3").Value = SO
        Range("F3").Value = Pr
        MsgBox "Press OK when predicting is finished", , "Output Data"
        prediction = Range("J3").Value
        MsgBox "We predict a mass corrosion loss of " & prediction & " g/m²", , "Output Data"
    Case 2
        Range("C8").Value = T
        Range("B8").Value = ET
        Range("D8").Value = RH
        Range("E8").Value = SO
        Range("F8").Value = Pr
        MsgBox "Press OK when predicting is finished", , "Output Data"
        prediction = Range("J8").Value
        MsgBox "We predict a mass corrosion loss of " & prediction & " g/m²", , "Output Data"
    Case 3
        Range("C13").Value = T
        Range("B13").Value = ET
        Range("D13").Value = RH
        Range("E13").Value = SO
        Range("F13").Value = Pr
        MsgBox "Press OK when predicting is finished", , "Output Data"
        prediction = Range("J13").Value
        MsgBox "We predict a mass corrosion loss of" & prediction & "g/m²", , "Output Data"
End Select
SaveActiveWorkbook.Activate
SaveActiveSheet.Select
SaveActiveCell.Activate
ActiveCell.Value = prediction
End Sub
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan