Out of stack space vba error

This repo is no longer accepting new issues. To request changes, you can create a branch, make changes, then submit a PR. For more resources, see README.MD - VBA-Docs/out-of-stack-space-error-28.md...

Permalink

Cannot retrieve contributors at this time

title keywords f1_keywords ms.prod ms.assetid ms.date ms.localizationpriority

Out of stack space (Error 28)

vblr6.chm1000028

vblr6.chm1000028

office

ce345551-ad57-1120-546a-239d144c330a

06/08/2017

medium

The stack is a working area of memory that grows and shrinks dynamically with the demands of your executing program. This error has the following causes and solutions:

  • You have too many active Function, Sub, or Property procedure calls. Check that procedures aren’t nested too deeply. This is especially true with recursive procedures, that is, procedures that call themselves. Make sure recursive procedures terminate properly. Use the Calls dialog box to view which procedures are active (on the stack).

  • Your local variables require more local variable space than is available.

    Try declaring some variables at the module level instead. You can also declare all variables in the procedure static by preceding the Property, Sub, or Function keyword with Static. Or you can use the Static statement to declare individual Static variables within procedures.

  • You have too many fixed-length strings. Fixed-length strings in a procedure are more quickly accessed, but use more stack space than variable-length strings, because the string data itself is placed on the stack. Try redefining some of your fixed-length strings as variable-length strings. When you declare variable-length strings in a procedure, only the string descriptor (not the data itself) is placed on the stack. You can also define the string at module level where it requires no stack space. Variables declared at module level are Public by default, so the string is visible to all procedures in the module.

  • You have too many nested DoEvents function calls. Use the Calls dialog box to view which procedures are active on the stack.

  • Your code triggered an event cascade. An event cascade is caused by triggering an event that calls an event procedure that’s already on the stack. An event cascade is similar to an unterminated recursive procedure call, but it’s less obvious, since the call is made by Visual Basic rather than by an explicit call in your code. Use the Calls dialog box to view which procedures are active (on the stack).

To display the Calls dialog box, select the Calls button to the right of the Procedure box in the Debug window or choose the Calls command. For additional information, select the item in question and press F1 (in Windows) or HELP (on the Macintosh).

[!includeSupport and feedback]

 

denis76

Пользователь

Сообщений: 22
Регистрация: 19.02.2013

#1

31.05.2016 15:23:02

Добрый день!

Столкнулся неожиданно с такой ситуацией: при вызове вложенной процедуры в VBA появляется указанное сообщение об ошибке:

Код
... out of stack space...

Собственно говоря, процедура довольно громоздкая, обрабатывает и пересчитывает массивы данных размером примерно 10000*200 ячеек… хотя работала до сего времени вполне нормально…

Собственно говоря, в чем здесь может быть причина появления такого сообщения:
— много переменных?
— большой размер переменных (массивов)?
— большое кол-во вызовов функций?
— вызов функций с аргументами в виде больших массивов (используется несколько раз такое)?

Какие тут способы решения имеются — может, надо как-то уничтожать переменные после использования, очищать стек — как это сделать?… Может, какие-то параметры в реестре надо подправить или еще где?.. Что известно по данному вопросу уважаемым специалистам?..

Спасибо заранее…

 

Sanja

Пользователь

Сообщений: 14837
Регистрация: 10.01.2013

Собственно говоря почему-бы не в

ПОИСК

?

Согласие есть продукт при полном непротивлении сторон.

 

denis76

Пользователь

Сообщений: 22
Регистрация: 19.02.2013

#3

31.05.2016 15:46:06

Хорошо…

Вот, смотрю, там 5 случаев указано, к моему может, видимо, это относиться:

Цитата
…Your local variables require more local variable space than is available.Try declaring some variables at the module level instead. You can also declare all variables in the procedure static by preceding the Property,Sub, or Function keyword with Static. Or you can use the Static statement to declare individual Static variables within procedures…

Все равно странно, больше всего ведь места массивы занимают, но не на них ошибка вылезает…
И как, получается, каждую что ли переменную надо в начале модуля объявлять заранее? А потом что, уничтожать надо или как?

Еще вот, смотрю в редакторе VBA — там такая закладка Call stack — почему-то в ней список в 50 с лишним процедур, когда у меня столько их одновременно не вызывается… и некоторые повторяются почему-то…
И вообще, как-то размер и заполненность этого стека можно ли узнать и регулировать?..

 

Нет файла — нет идей, что тут не понятно.

 

Игорь

Пользователь

Сообщений: 3621
Регистрация: 23.12.2012

Причина — большой размер массивов
10,000*200 = 2 млн ячеек — таких массивов много в памяти Excel не удержит

Как вариант еще одной причины, — вызов функций с аргументами в виде больших массивов
Массивы такие надо передавать как byRef в другие функции
(ну и вообще сделать в коде так, чтобы не создавались лишние копии такого большого массива, — а то памяти не хватит)

 

denis76

Пользователь

Сообщений: 22
Регистрация: 19.02.2013

#6

31.05.2016 16:12:19

Цитата
kalbasiatka написал: Нет файла — нет идей, что тут не понятно.

Глубоко сомневаюсь, что данный файл кому-то разбирать охота будет… но думаю, что основные варианты можно предположить и без его досконального исследования…

 

denis76

Пользователь

Сообщений: 22
Регистрация: 19.02.2013

#7

31.05.2016 16:14:51

Цитата
Игорь написал: Причина — большой размер массивов

Про массивы — да, все так, но ведь он не выдает Out of memory (это прошло с установкой 64-битной версии), а вот на стек именно ругается-то… А каков этот стек и его допустимый размер — мне пока неведомо…

 

denis76

Пользователь

Сообщений: 22
Регистрация: 19.02.2013

#8

31.05.2016 16:17:04

Цитата
Игорь написал: Массивы такие надо передавать как byRef в другие функции

Так вроде бы по умолчанию они так и передаются, нет разве?.. И вроде как лишних копий не делается…

Изменено: denis7601.06.2016 22:06:07

 

Hugo

Пользователь

Сообщений: 23137
Регистрация: 22.12.2012

Мне стека не хватало пару раз из-за рекурсии.

 

denis76

Пользователь

Сообщений: 22
Регистрация: 19.02.2013

Разобрался, в чем дело… когда начал код улучшать, нашел место, где процедуры вызывают одна другую поочередно…

 

Hugo

Пользователь

Сообщений: 23137
Регистрация: 22.12.2012

#11

01.06.2016 12:07:48

Т.е. тоже виновата рекурсия?

Can anyone help me? I have to calculate 2 given values and check those values by Bisection Method…But I got this message ‘Run-time error ’28’ out of stack space’ I’m not sure why my program is error. I think it may be because I called sub-routine from function. Also I have many do-while loops inside the function. I checked many times but I still can’t solve the problem.

I’m really in hurry as I have to submit this result to my Professor next 2 days…After that I have to write paper to conference which the deadline for submission is next Tuesday!!

Here is my code:

Public N, NV, noloop, j, k As Integer
Public CCSO, CCEO, CCEU, CTSO, CTEO, CTEU, SE, SE5, SSY, SEY, DCE, EC, EO, P, EEND, HL, H, B, ASQ, AST, D1, D2, SO, SP As Double
Public FSU, FEU, EF, tf, WSY, EW, DW, ASW As Double
Public DH, DHL, CE1, ES, ROLS, ROLW, ROLF As Double
Public E50U, E50H, ZZ, E20C, CCS As Double
Public SSU, SEU, ESH, SEH, SS As Double
Public EWi, ESi, ECi, FCCi, C1, C2, nf, xf As Double
Public CCE, CE(1000, 1), E(1000, 1), S(1000, 1) As Double
Public fa, fb, ffa, ffb As Double
Public gxg, gEg, F As Double
Public aa, bb, cc, aaa, bbb, ccc As Double
Public Tcpz(1000, 1), Vcpz(1000, 1), Vcp(1000, 1), Lstr(1000, 1), Lweb(1000, 1), Lcom(1000, 1), Tstr(1000, 1), Vstr(1000, 1), Vcom(1000, 1), Vweb(1000, 1), Vfrp(1000, 1), VT(1000, 1) As Double
Public EWW(1000, 1), Ewg(1000, 1), xes(1000, 1), SEx5(1000, 1), xe(1000, 1) As Double

Public Sub sheardeformation()

‘*******************************************CALCULATION OF SHEAR POTENTIAL**************************************************************’
‘******************************************************************************************************************************’
‘Start —- Get value of inputs
Sheets(«Input»).Select
HL = Range(«F3»).Value
NV = Range(«F4»).Value
H = Range(«F7»).Value
B = Range(«F8»).Value
ASQ = Range(«F9»).Value
AST = Range(«F11»).Value
D1 = Range(«F10»).Value
D2 = Range(«F12»).Value
P = Range(«F13»).Value
SO = Range(«F15»).Value

N = Range(«F18»).Value
DCE = Range(«F19»).Value
EEND = Range(«F20»).Value
CCSO = Range(«F24»).Value
CCEO = Range(«F25»).Value
CCEU = Range(«F26»).Value
CTSO = Range(«F27»).Value
CTEO = Range(«F28»).Value
CTEU = Range(«F29»).Value
EO = Range(«F30»).Value
SSY = Range(«F32»).Value
SEY = Range(«F33»).Value

FSU = Range(«F35»).Value
FEU = Range(«F36»).Value
EF = Range(«F37»).Value
tf = Range(«F38»).Value
nf = Range(«F39»).Value
WSY = Range(«F41»).Value
EW = Range(«F42»).Value
SP = Range(«F43»).Value
DW = Range(«F44»).Value
ASW = Range(«F45»).Value
‘End —- Get value of inputs

‘——————————————————————————————————————————‘
‘——————————————————START CALCULATION——————————————————-‘
EC = EO ‘/ 1000000#
DH = H / N
DHL = HL / NV
CE1 = P * 1000 / B / H / EC ‘ + SEY
ES = SSY / SEY
ROLS = 2.87 / 200
ROLW = 2 * ASW / (H — D1 — D2) / SP
ROLF = 2 * tf * nf / H

‘Initialized
For j = 0 To 1000
For k = 0 To 1
CE(j, k) = 0

Next
Next
k = 0
j = 0

‘——————————————————————————————————————————‘
‘——————————————————FIRST PROCEDURE STARTPOINT——————————————————-‘
TE = CE1 — DCE
STARTPOINT:
    k = 0
    j = j + 1

      noloop = j
    CE(j, 0) = CE1 + DCE + CE(j — 1, 0) ‘given strain at top fiber
    If CE(j, 0) > EEND Then GoTo WRITEOUT5
    GoSub XECAL ‘go to procedure XECAL to calculate xg (xe given)
    GoSub SHEAR
    GoTo STARTPOINT ‘SET LOOP

‘——————————————————————————————————————————‘
‘——————————————————WRITE OUTPUT TO EXCEL——————————————————-‘

WRITEOUT5:
Sheets(«Shear1»).Select
Range(«A4:BZ1002»).Select
Selection.ClearContents
Range(«A3»).Select
j = 1
Do While j <= noloop — 1
        ActiveCell.Offset(j, 0).FormulaR1C1 = CE(j, 0)
        ActiveCell.Offset(j, 1).FormulaR1C1 = EWW(j, 0) ‘Average Strain in Stirrup
        ActiveCell.Offset(j, 2).FormulaR1C1 = SEx5(j, 0)
        ActiveCell.Offset(j, 3).FormulaR1C1 = xes(j, 0) ‘Average Strain in Stirrup
        ActiveCell.Offset(j, 4).FormulaR1C1 = VT(j, 0)

                        ActiveCell.Offset(j, 5).FormulaR1C1 = Tcpz(j, 0)
        ActiveCell.Offset(j, 6).FormulaR1C1 = Tstr(j, 0)
        ActiveCell.Offset(j, 7).FormulaR1C1 = Vcpz(j, 0)
        ActiveCell.Offset(j, 8).FormulaR1C1 = Vcom(j, 0)
        ActiveCell.Offset(j, 9).FormulaR1C1 = Vcp(j, 0)
        ActiveCell.Offset(j, 10).FormulaR1C1 = Vstr(j, 0)
        ActiveCell.Offset(j, 11).FormulaR1C1 = Vweb(j, 0)
        ActiveCell.Offset(j, 12).FormulaR1C1 = Vfrp(j, 0)

               ActiveCell.Offset(j, 13).FormulaR1C1 = Vcp(j, 0) + Vstr(j, 0)
        ActiveCell.Offset(j, 14).FormulaR1C1 = Vcp(j, 0) + Vstr(j, 0) + Vweb(j, 0)
        ActiveCell.Offset(j, 15).FormulaR1C1 = Vweb(j, 0) + Vfrp(j, 0)

        j = j + 1
Loop

Exit Sub

TSTRAIN:

If Abs(EWW(j, k)) < (WSY / EW) Then
            EWi = EW
        Else: EWi = WSY / Abs(EWW(j, k))
End If

        C1 = Exp(-0.1785 * Sqr(ROLW * EWi + ROLF * EF) — 0.7721 / ROLS / ESi)
C2 = 1 + (1 / Abs(FCCi)) ^ 0.2
EWW(j, k) = 0.01658 * Sqr(Abs(FCCi)) / (Sqr(HL / H) + 1) * C1 * C2 ‘Average strain of transverse steel

Return

Return
‘——————————————————————————————————————————‘
‘——————————————————CALCULATE XE—————————————————————-‘

XECAL:

    SUMxe = False
    SUMxe2 = False
    aaa = 10 ‘Lower Bound of neutral axis in shear-flexural region
    bbb = 400 ‘Upper Bound (not sure so given value is equal to H of section)
    aa = 0.0001 ‘Lower Bound of transverse strain
    bb = 0.1 ‘Upper Bound ,Set bb is 10^6 times of aa

Do While SUMxe <> True

        ffa = FF(aaa, aa) ‘Upper Bound given Xe and Transverse Strain
    ffb = FF(bbb, bb) ‘ Lower Bound
    ‘GoSub TRANS ‘To calculate Transverse Straign

        If ffa * ffb <= 0 Then
        ‘START BISECTION METHOD
        Do While SUMxe2 <> True
            ccc = (aaa + bbb) / 2
            ffc = FF(ccc, cc)

                        If Abs(ffc) < 0.001 Then SUMxe2 = True

                            If ffa * ffc > 0 Then
                    bbb = ccc
                Else: aaa = ccc
                End If
        Loop

            xes(j, k) = ccc
        If Abs(ffc) < 0.001 Then Sum = True

        End If

        If ffa * ffb > 0 Then
        bbb = 2 * bbb
        SUMxe = False

            End If

    Loop

Return

‘——————————————————————————————————————————
‘——————————————Calculate Shear Force————————————————————————

SHEAR:
‘Shear in Compression Zone : Vcpz = b*xe*Tcp, xe is compression depth this means neutral axis depth

                ‘SHEAR AND NORMAL STRESS
        Ang1 = Atn((H — D1) / HL) ‘constant value..depends on a/d ratio =Atn is a math function return in radian
        Tcpz(j, 0) = 0.65 * Sin(Ang1) * Cos(Ang1) * FCCi
        Vcpz(j, 0) = B * xes(j, 0) * Tcpz(j, 0) / 1000 ‘change in each load step due to variation of Neutral axis depths
        Lcom(j, 0) = (HL / H) * xes(j, 0)
        Lstr(j, 0) = H — xes(j, 0)
        Lweb(j, 0) = Lstr(j, 0) / Tan(45 * 22 / 7 / 180)
        BETA = 32 * (1 — (P / H / B / Abs(FCCi)) ^ 0.5) * 22 / 7 / 180
        sigcom = 0.64 * (H — D1) / HL * (Sin(BETA)) ^ 2 * FCCi
        Vcom(j, 0) = sigcom * B * Lcom(j, 0) / 1000
        Vcp(j, 0) = Vcpz(j, 0) — Vcom(j, 0)
        AngCR = 45 * (1 — (P * 1000 / B / H / Abs(FCCi)) ^ 0.7) * 22 / 7 / 180
        Tstr(j, 0) = (0.166 * (Log(ROLW * EWi + ROLF * EF) / Log(2.718282)) — 0.12058) * (0.0802 * (Log(ROLS * ESi) / Log(2.718282)) — 0.06335) * Sin(AngCR) * FCCi
        ‘Tstr(j, 0) = 1.28 * Exp(-11.2 * 1 / Abs(FCCi)) * Abs(FCCi) ^ (1 / 3) / (Sqr(HL / (H — D1)) + 1)

                ‘SHEAR FORCE
        Vstr(j, 0) = B * Lstr(j, 0) * Tstr(j, 0) / 1000
        Vweb(j, 0) = B * Lweb(j, 0) * ROLW * EWW(j, k) * EWi / 1000
        Vfrp(j, 0) = B * Lweb(j, 0) * ROLF * EWW(j, k) * EF / 1000 ‘EF is very low so Vfrp cannot show the precise value
        VT(j, k) = Vcp(j, 0) + Vstr(j, 0) + Vweb(j, 0) + Vfrp(j, 0)

   Return

End Sub
Public Function FF(xg, Eg)
gEg = Eg
gxg = xg
Call MAT ‘STACK PROBLEM IS HERE !!!

nf = ESi / (FCCi / E(1, j))
xf = (H — D1) * (-nf * ROLS + Sqr(Sqr(nf * ROLS) + 2 * nf * ROLS)) ‘Flexure Only
xes(j, 0) = xf * (1 — Exp(-0.42 * HL / (H — D1))) / (1 + 3.2 ^ (-0.12 * (ROLW * EWi + ROLF * EF) ^ 0.4)) * (1 + (1 / Abs(FCCi)) ^ 0.7) * (1.25 * Exp(-0.08 * ROLS * ESi / 1000))

FF(xg, Eg) = xes(j, 0) — xg

End Function

Public Sub MAT()

‘Tension Most Steel
    SE5 = CE(j, k) * (H — D1 — gxg) / gxg
    SE = SE5
    SEx5(j, k) = SE5

        ‘Concrete
    E(1, j) = CE(j, k) * (H — DH * 1 + DH / 2) / gxg
    CCE = E(1, j)

        ‘ Compression
If CCE >= 0 Then

        E50U = (3 + 0.002 * CCSO / 0.00689) / (CCSO / 0.00689 — 1000)
    E50H = 3 / 4 * ROLS * Sqr(H — 2 * D1) / Sqr(SP)
    ZZ = 0.5 / (E50U + E50H — 0.002)
    E20C = 0.8 / ZZ + 0.002
        ‘Fracture Energy

                If CCE <= 0.002 Then
            CCS = CCSO * ((2 * CCE / 0.002) — (CCE / 0.002) ^ 2)
        ElseIf CCE <= E20C Then
            CCS = CCSO * (1 — ZZ * (CCE — 0.002))
            Else: CCS = 0.2 * CCSO
        End If
End If

‘ Tension
If CCE < 0 Then

            CTSU = CTSO * 0.85
        HE = -CCE
        If HE <= CTEO Then
            CCS = -CTSO * (2 * (HE / CTEO) — (HE / CTEO) ^ 2)
        ElseIf HE <= CTEU Then
            CCS = -((CTSU — CTSO) / (CTEU — CTEO) * (HE — CTEU) + CTSU)
         ‘CCS = -CTSO + CTSO * (HE — CTEO) / (CTEU — CTEO)
        Else: CCS = -0.2 * CTSO
        End If
End If
‘STIFFNESS
FCCi = (CCSO + CCS) / 2
ECi = (CCSO + CCS) / 2 / CCE

‘End — Stress-Strain of Concrete

   
    SSU = 1.2 * SSY ‘Ultimate stress of steel based on JSCE seismic specification
    SEU = 30 * SEY ‘Ultimate strain of steel
    ESH = (SSU — SSY) / (SEU — SEY)
    SEH = 0.018 ‘hardening strain
    ‘ESH = 0.5 * SSY / (49 * SEY) ‘ too big!!

         ‘ Compression
    If SE >= 0 Then

               ElseIf SE <= SEH Then
            SS = SSY
        ElseIf SE > SEH Then
            SS = ESH * SE + SSY
       ‘ End If
    End If

            ‘ Tension
    If SE < 0 Then
        SE = -SE  ‘SE is + to check with SEY

         ElseIf SE <= SEH Then
            SS = -SSY
        ElseIf SE > SEH Then
            SS = -ESH * SE — SSY
       ‘ End If
    End If
   ESi = Abs(SS / SE)

‘End — Stress-Strain of Steel
SUMEW = False
SUMEW2 = False

Do While SUMEW <> True
    fa = Fstrain(ESi, FCCi, aa)
    fb = Fstrain(ESi, FCCi, bb)

        If (fa * fb) <= 0 Then
        Do While SUMEW2 <> True
    ‘Calculate Transverse reinforcement Stiffness
            cc = (aa + bb) / 2
            fc = Fstrain(ESi, FCCi, cc)
          If Abs(fc) < 0.00001 Then SUMEW2 = True
            If fb * fc > 0 Then
                bb = cc ‘Upper = Midpoint
            Else: aa = cc ‘Lower=Midpoint
            End If
        Loop

                EWW(j, k) = cc
        If Abs(fc) < 0.00001 Then SUMEW = True
    End If

        If (fa * fb) > 0 Then

                bb = 2 * bb ‘Increase to 2 times
        SUMEW = False
    End If

    Loop

End Sub
Function Fstrain(ESi, FCCi, Eg)

If Abs(Eg) < (WSY / EW) Then
            EWi = EW — 0.0001 * Eg
Else: EWi = WSY / Abs(Eg)
End If

C1 = Exp(-0.1785 * Sqr(ROLW * EWi + ROLF * EF) — 0.7721 / ROLS / ESi)
C2 = 1 + (1 / Abs(FCCi)) ^ 0.2
Fstrain = 0.01658 * Sqr(Abs(FCCi)) / (Sqr(HL / H) + 1) * C1 * C2 — Eg
End Function

  • #1

[FONT=&quot]I have created a database that takes one query that has a blank field in a predetermined field and finds a record in a second query that matches name and date of birth criteria. it pulls the value into the blank field that is supposed to be there.

MR missing in query one….find record in query two that matches additional predetermined variables and pull MR from query two and add to query one.

I have a cumbersome VBA that accomplishes this but after every 19 records i get error message pop up that says «run-time error 28 out of stack space»
I have search all of the forums and have not found a viable solution. there is my code. to set up the scenario i have a form that i open first. using Onload the form opens a query and another form for that query where it has found the matching record. the second form that is opened uses this code where the error occurs.[/FONT]
[FONT=&quot]Private Sub Form_Load()
On Err GoTo errhand
Dim mr As String
Dim queryname As String
Dim dbs As DAO.Database
Dim rec1 As DAO.Recordset
DoCmd.Close acForm, «blank MRN Records», acSaveNo
Set dbs = CurrentDb
queryname = «refill_Requests Query»
Set rec1 = dbs.OpenRecordset(queryname) ‘ dbOpenDynaset, dbSeeChanges)
mr = Me.FTMedRecNo
rec1.Edit
rec1(«Patient MRN») = mr
rec1.Update
rec1.Close
DoCmd.Close acQuery, «mmdblist», acSaveYes
DoCmd.Close acForm, «mmdblist», acSaveNo
DoCmd.OpenForm «blank MRN Records», acNormal

errhand:
Err.Clear

DoCmd.Close acQuery, «mmdblist», acSaveYes
DoCmd.Close acForm, «mmdblist», acSaveNo
DoCmd.OpenForm «blank MRN Records», acNormal

End Sub[/FONT]
[FONT=&quot]my on error doesn’t catch error 28 because it stops mid code.

the procedure works well for 19 records then boom it stops.
I have currently a total of 3500 records to repair with a MR. how can i get this to run all the way to the end without causing error 28?[/FONT]

  • #2

You don’t need any of this code. Just run an update query.

  • #3

[FONT=&quot]I have a cumbersome VBA that accomplishes this but after every 19 records i get error message pop up that says «run-time error 28 out of stack space»[/FONT]

The «Out of stack space»-error is most likely caused by a recursive calls of a VBA procedure in your code.
Hard to say where and why that happens. You can best analyze it by stepping through you code executing it line by line. If you recognize some sort of recursive loop, you probably found the culprit.

But anyway, Ranman256 is right, you can do the same more efficiently with an update query.

  • #4

You can view the call stack. When that error appears, does it break into the debugger? If so, hit ctrl+L, or go to the view menu, and open the call stack viewer, and you can see the list of routines that have been run and are still executing. Follow them back to the initial call, and you can see where it all started.

  • #5

I agree with #2, use an update query.

As to the stack overflow, it seems a funny place to be updating records one by one in a Form load event. If you really want to edit records one by one, use a loop.

  • #6

thank you all for your quick responses. I am self taught with using VBA and still learning. I looked up update query and what i saw was if you want the same information in the field or update information in a field to change to another description. i have a blank field that should have a number that is unique to the persons name in that field. update query sounds like a better way to do it, but the turorials online are not clear how to match the persons name in destination query with the persons name found in the look up table where i can pull that unique number.

I am all about easy and efficient. I tried creating a loop at first but after the record was updated, i could not get it to advance to the next record. it basically dumped the first unique number in all of the records which is not what i wanted.

the current code i built in stages. i got the logistics worked out for finding the correct record and data, then got it to replace the blank field with the correct data.

would someone mind giving me an example how to build an update query that will match criteria of first name, last name and birthdate with a record in the lookup table then pulling only the MR (med rec number) and save it in the query table please?

  • #7

once again thank you all for your replies. the loop suggestion worked and was able to have it work as i intended. thank you for the suggestions on update query. i am going to research that option for any future projects.

  • #8

You can view the call stack. When that error appears, does it break into the debugger? If so, hit ctrl+L, or go to the view menu, and open the call stack viewer, and you can see the list of routines that have been run and are still executing. Follow them back to the initial call, and you can see where it all started.

This was an much, much more helpful direction than the one provided by Microsoft (almost always too technical and too vague to be of any help) at https://docs.microsoft.com/en-us/of…er-interface-help/out-of-stack-space-error-28. Thank you, Mark K. You helped me find the cause of a similar problem with Run-time error ’28’.

  • #9

Glad you found it useful. All the best,

t17fenics

0 / 0 / 0

Регистрация: 11.03.2015

Сообщений: 4

1

11.03.2015, 12:47. Показов 3450. Ответов 7

Метки нет (Все метки)


Добрый день.
Разбираюсь с формами VBA, написал следующий код.
Он выводит квадратный объект перемещающийся в замкнутой области по заданному алгоритму.
Скорость движения можно менять, так же выводится дополнительная информация(скорость, координаты, размеры рабочей области)
Проблема в том, что спустя несколько минут(3-5) после запуска программа вываливается в out of stack.
Никакие данные кроме отскоков не накапливаются. На момент переполнения буфера на максимальной скорости количество отскоков доходит до ~6000.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
Public Sub Form_Run()
 
''размеры рабочей области
x = 300
y = 300
 
 
wt = 20 ''начальная задержка между сдвигами(обратнопропорциональна скорости движения объекта
 
sh = 0.6 '' методом экспериментов установлено, что минимальный сдвиг объекта возможен на 0.50000000000000001(видимо в бесконечном периуде)
 
pong = -1 ''Счетчик отскоков
 
''Формирование формы
UserForm2.Frame1.Visible = True
UserForm2.TextBox1.Visible = False
UserForm2.TextBox2.Visible = False
UserForm2.Label1.Visible = True
UserForm2.Label2.Visible = True
UserForm2.Label3.Visible = True
UserForm2.Label4.Visible = True
 
UserForm2.Height = x
UserForm2.Width = y
 
UserForm2.Frame1.top = 1
UserForm2.Frame1.left = 1
UserForm2.Frame1.Height = UserForm2.Height - 161 ''100 на рабочую область, 21 на заголовки и бордюры
UserForm2.Frame1.Width = UserForm2.Width - 7 ''7 на бордюры
''методом экспериментов установлено, что рамка равна 7(3,5 на сторону), заголовок равен 14
 
 
UserForm2.CommandButton1.Width = 20
UserForm2.CommandButton1.Height = 20
UserForm2.CommandButton1.caption = ""
UserForm2.CommandButton1.top = UserForm2.Frame1.top - 1
UserForm2.CommandButton1.left = UserForm2.Frame1.left - 1
 
UserForm2.CommandButton2.Width = 40
UserForm2.CommandButton2.Height = 30
UserForm2.CommandButton2.caption = pong & vbNewLine & "stop"
UserForm2.CommandButton2.top = UserForm2.Frame1.Height + 100
UserForm2.CommandButton2.left = UserForm2.Frame1.Width / 2 - UserForm2.CommandButton2.Width / 2
 
UserForm2.Label1.Width = 30
UserForm2.Label1.Height = 20
UserForm2.Label1.top = UserForm2.Frame1.Height + 10
UserForm2.Label1.left = UserForm2.Frame1.left + 10
UserForm2.Label1.caption = UserForm2.CommandButton1.left
 
UserForm2.Label2.Width = 30
UserForm2.Label2.Height = 20
UserForm2.Label2.top = UserForm2.Frame1.Height + 40
UserForm2.Label2.left = UserForm2.Frame1.left + 10
UserForm2.Label2.caption = UserForm2.CommandButton1.top
 
UserForm2.Label3.Width = 150
UserForm2.Label3.Height = 20
UserForm2.Label3.top = UserForm2.Frame1.Height + 70
UserForm2.Label3.left = UserForm2.Frame1.left + 10
UserForm2.Label3.caption = UserForm2.Frame1.Width & " X " & UserForm2.Frame1.Height & "(" & UserForm2.Width & " X " & UserForm2.Height & ")"
 
UserForm2.Label4.Width = 30
UserForm2.Label4.Height = 20
UserForm2.Label4.top = UserForm2.Label2.top
UserForm2.Label4.left = UserForm2.Label2.left + UserForm2.Label2.Width + 20
UserForm2.Label4.caption = wt
 
UserForm2.SpinButton1.top = UserForm2.Label1.top
UserForm2.SpinButton1.left = UserForm2.Label1.left + UserForm2.Label1.Width + 20
 
UserForm2.Show
 
''запуск цикла
bottom_right
 
End Sub
 
 
 
Sub SleepVB(mSeconds)
 
DoEvents
Sleep mSeconds
 
End Sub
 
 
 
Public Sub repaint()
''Процедура обновления содержимого формы. Выполняется после каждого пересчета координат объекта
check
UserForm2.Label1.caption = UserForm2.CommandButton1.top
UserForm2.Label2.caption = UserForm2.CommandButton1.left
UserForm2.Label4.caption = wt
UserForm2.CommandButton2.caption = pong & vbNewLine & "stop"
 
''Процедура задержки
SleepVB wt
 
End Sub
 
 
Public Sub bottom_right()
''Следующие 4 процедуры проссчитывают движение объекта
Test1
 
Do While UserForm2.CommandButton1.top < UserForm2.Frame1.Height - 24 ''размеры кнопки 20+ бордюр 2 с каждой стороны
    UserForm2.CommandButton1.top = UserForm2.CommandButton1.top + sh
    UserForm2.CommandButton1.left = UserForm2.CommandButton1.left + sh
    repaint
    
    If UserForm2.CommandButton1.left > UserForm2.Frame1.Width - 25 Then
        bottom_left
    End If
Loop
 
top_right
 
End Sub
 
 
Public Sub top_right()
 
Test1
 
Do While UserForm2.CommandButton1.left < UserForm2.Frame1.Width - 24  ''226
    UserForm2.CommandButton1.top = UserForm2.CommandButton1.top - sh
    UserForm2.CommandButton1.left = UserForm2.CommandButton1.left + sh
    repaint
    
    If UserForm2.CommandButton1.top < UserForm2.Frame1.top Then
        bottom_right
    End If
Loop
 
top_left
 
End Sub
 
Public Sub top_left()
 
Test1
 
Do While UserForm2.CommandButton1.top > UserForm2.Frame1.top - 1
    
    UserForm2.CommandButton1.top = UserForm2.CommandButton1.top - sh
    UserForm2.CommandButton1.left = UserForm2.CommandButton1.left - sh
    repaint
    
    If UserForm2.CommandButton1.left < UserForm2.Frame1.left Then
        top_right
    End If
 
Loop
 
bottom_left
 
End Sub
 
Public Sub bottom_left()
 
Test1
 
Do While UserForm2.CommandButton1.left > UserForm2.Frame1.left - 1
 
    UserForm2.CommandButton1.top = UserForm2.CommandButton1.top + sh
    UserForm2.CommandButton1.left = UserForm2.CommandButton1.left - sh
    repaint
    
    If UserForm2.CommandButton1.top > UserForm2.Frame1.Height - 25 Then
        top_left
    End If
 
Loop
 
bottom_right
 
End Sub

Подскажите пожалуйста, в чем может быть проблема?

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Night Ranger

Заблокирован

11.03.2015, 12:57

2

Вы не пробывали перевести ваше сообщение и понять что оно озночает ?
(Недостаточно места в памяти)



0



Апострофф

Заблокирован

11.03.2015, 13:15

3

Цитата
Сообщение от t17fenics
Посмотреть сообщение

check

Цитата
Сообщение от t17fenics
Посмотреть сообщение

Test1

Что означают эти загадочные буквосочетания?



0



0 / 0 / 0

Регистрация: 11.03.2015

Сообщений: 4

11.03.2015, 13:20

 [ТС]

4

Сорри, не вычистил при публикации.
Не обращайте внимание, это дополнительные процедуры. Проблема существовала с самого раннего этапа написания кода, когда этих процедур еще не было.
Там есть еще код, просто удалил его из публикации, чтоб не грузить, оставил каркас. Проблема именно в опубликованном коде, проверено 20 раз уже.



0



Апострофф

Заблокирован

11.03.2015, 13:24

5

Цитата
Сообщение от t17fenics
Посмотреть сообщение

out of stack

происходит обычно при непродуманном рекурсивном вызове процедур друг из друга, что наглядно демонстрирует ваш случай.



0



0 / 0 / 0

Регистрация: 11.03.2015

Сообщений: 4

11.03.2015, 13:32

 [ТС]

6

Хм. ошибка проявляется только после 6000 запусков этих процедур.
я так понимаю экземпляры процедуры остаются в памяти?
может быть как то можно прибить процедуру при переходе в следующую?



0



Night Ranger

Заблокирован

11.03.2015, 13:42

7

Воспользуйтесь ключевыми словами .. is Nothing, если не иностранец..



0



0 / 0 / 0

Регистрация: 11.03.2015

Сообщений: 4

11.03.2015, 14:23

 [ТС]

8

Вобщем осознал корень проблемы. Спасибо Апострофф

Код просчитывающий движение надо как то по другому писать. без бесконечного вызова процедур друг из друга.



0



Понравилась статья? Поделить с друзьями:
  • Out of scan range как исправить
  • Out of range на мониторе при запуске windows 10 как исправить
  • Out of memory ошибка mkke при запуске
  • Out of memory ошибка matlab
  • Out of memory ошибка dayz