2011-10-10 50 views
2

我正在使用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, ","),它說,該陣列是固定或暫時鎖定,因爲我覺得首先它採取‘臨時’作爲一個變量,但在返回split函數的值,變量「溫度」第一循環結束後變成陣列(後烏鴉= 6,7即....)

+0

什麼活給錯誤?此外,如果您正確縮進代碼,我們將更容易閱讀。 –

+1

movies_cat定義在哪裏?你應該嘗試在模塊中使用**選項explicit ** ... –

+0

你的'line4'標籤在哪裏? – Deanna

回答

4

line4標籤外的for循環的臨時變量,所以當你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

@ user930679它看起來像我需要一個Exit For而不是GoTo - 這些通常不是一個好主意。 – Fionnuala

+0

@Deanna:非常感謝,它工作得很好...... – user930679

0

我也有這個問題與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。

故事的寓意是不要將全局變量作爲參數傳遞給subs。另一種簡單的解決方法是稍有不同聲明Sub1的:

Sub Sub1(ByVal i as integer) 

這意味着i變量由子拷貝(但不返回)。

0

謝謝,迪安娜給出了答案!我有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) 

而且從With程序內提取分配.lnEnd = ln後工作正常:

 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) 
相關問題