Этот массив фиксирован или временно заблокирован - PullRequest
2 голосов
/ 10 октября 2011

Я использую функцию split и присваиваю значение переменной и запускаю код в цикле после нескольких итераций, что выдает ошибку «Этот массив фиксирован или временно заблокирован (Visual Basic)» ..

например;здесь значение movies_cat1, считываемое из excel, находится в форме этого ------ "Фильмы-> Список всех фильмов, фильмов-> Мир кино-> Азия, Фильмы-> Фильмы по языку-> Сингальский, Фильмы-> Драма"

For crow = 1 To 100

    Value = Worksheets("Movies_categories").Range("A" & crow).Value
    cat_final = Worksheets("Movies_categories").Range("B" & crow).Value

    If Value = "y" Or Value = "Y" Then

      'Loop for reading the data from tabsheet- Movies

      For crowss = 5 To 3000
        movies_cat1 = Worksheets("Movies").Range("B" & crowss).Value
        movies_language = Worksheets("Movies").Range("C" & crowss).Value

        If movies_language = "English" Then

          Temp = Split(movies_cat, ",")  'run time Error:10  occurs here..

          For Each boken_c In Temp
            flag = 0
            boken_c = Trim(boken_c)

            If RTrim(LTrim(boken_c)) = LTrim(RTrim(cat_final)) Then
              flag = 1
              GoTo Line4:
            End If
          Next boken_c
        End If
      Next crowss
    End If
Line4:    Next crow

Ошибка возникает в этом операторе: Temp = Split(movies_cat, ","), он говорит, что массив фиксирован или временно заблокирован, потому что я думаю, что изначально он принимает 'temp' в качестве переменной, но при возврате значения splitфункция, переменная 'Temp' становится массивом после завершения первого цикла (т. е. после crow = 6,7 ....)

Ответы [ 3 ]

5 голосов
/ 10 октября 2011

Ваша метка line4 находится вне цикла for переменной temp, поэтому при goto она остается заблокированной.

Вы действительно должны реструктурировать свой код, чтобы не использовать goto внутри для каждого цикла.

Может быть:

For crow = 1 To 100 

  Value = Worksheets("Movies_categories").Range("A" & crow).Value 
  cat_final = Worksheets("Movies_categories").Range("B" & crow).Value 

  If Value = "y" Or Value = "Y" Then 

    'Loop for reading the data from tabsheet- Movies 

    For crowss = 5 To 3000 
      movies_cat1 = Worksheets("Movies").Range("B" & crowss).Value 
      movies_language = Worksheets("Movies").Range("C" & crowss).Value 

      If movies_language = "English" Then 

        Temp = Split(movies_cat, ",")  'run time Error:10  occurs here.. 

        For Each boken_c In Temp 
          flag = 0 
          boken_c = Trim(boken_c) 

          If RTrim(LTrim(boken_c)) = LTrim(RTrim(cat_final)) Then 
            flag = 1 
            **Exit For**
          End If
          **If flag = 1 Then Exit For**
        Next boken_c 
      End If 
      **If flag = 1 Then Exit For**
    Next crowss 
  End If 
Next crow 

(обратите внимание на ** d строки.)

0 голосов
/ 21 января 2018

Спасибо, Дина за ответ!У меня есть подобное сообщение на ReDim Preserve в последней строке следующего фрагмента кода:

        If StrComp(Mid(s, 1, lE), txtE, vbBinaryCompare) = 0 Then
            For i = iMdl To 1 Step -1
                With blks(i)
                    If .lnEnd = 0 Then   ' ".lnEnd" is a member of blks(i)
                        .lnEnd = ln
                        GoTo NXT
                    End If
                End With
            Next
            errBegWith = errBegWith & ln & ", "
NXT:
        End If
    '...
    ReDim Preserve blks(iMdl)

И после извлечения присваивания .lnEnd = ln изнутри With программа работает нормально:

        If StrComp(Mid(s, 1, lE), txtE, vbBinaryCompare) = 0 Then
            For i = iMdl To 1 Step -1
                If blks(i).lnEnd = 0 Then
                    blks(i).lnEnd = ln
                    GoTo NXT
                End If
            Next
            errBegWith = errBegWith & ln & ", "
NXT:
        End If
    '...
    ReDim Preserve blks(iMdl)
0 голосов
/ 23 июня 2015

У меня тоже была эта проблема с VBA. Я не могу сказать, что я горжусь тем, как мне удалось получить его, но он поставляется здесь только в том случае, если кто-нибудь еще случайно соскользнет по этому вопросу.

Довольно интересно отлаживать, так как сбой происходит при вызове подчиненного элемента или функции, а не в точке сбоя. К счастью, вы можете проследить код до строки с ошибкой вызываемой подпрограммы, прежде чем она сообщит об ошибке.

Call Sub1(gArray(3))
debug.print gArray(3)
...
Sub Sub1(i as integer)
Redim gArray(0)
End sub

Очевидно, что VB RT это не понравится, так как к моменту выполнения debug.print размер массива не существует. Хорошо, какого черта вы хотите передать глобально объявленный массив в любом случае? Виновен, как предъявлено обвинение.

Таким образом, в приведенном выше примере вы получаете ошибку при вызове на Sub1, но причиной, вызывающей его, является Redim в sub.

Мораль этой истории - не передавать глобальные переменные в качестве параметров для подпрограмм. Другое простое решение - объявить Sub1 немного по-другому:

Sub Sub1(ByVal i as integer)

Это означает, что переменная i копируется (но не возвращается) Sub.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...