2014-02-19 32 views
0

我想我在這裏錯過了一些基本錯誤,但我無法弄清楚。對於對象數組中的每個變體

我在電子表格中有大約64個單元格,我想將其設置爲變量以用於整個電子表格中的其他方程式。重要的是它們是易於計算的變量,並且因爲它們的位置會根據其他用戶輸入動態變化。我最初有下面的代碼,其工作完全精細:

Set Ap1thV = range("B32") 
Set Ap1tuV = range("B33") 
Set Ap1thVdef = range("C32") 
Set Ap1tuVdef = range("C33") 

等等等等爲64個單元(8列×8行)。變量被公開設置爲對象。有沒有更快的方法來設置所有這些變量?它在每次運行時都會顯着減慢我的宏,但它在程序過程中需要經常運行。

我試圖通過使用整合以下內容:

cellnums = 32 
For Each Vcelldefs In Array(Ap1thV, Ap1tuV, Ap2thV, Ap2tuV, Ap3thV, Ap3tuV, Ap4thV, Ap4tuV) 
    Set Vcelldefs = Range("B" & cellnums) 
    cellnums = cellnums + 1 
Next Vcelldefs 
cellnums = 32 
For Each Vdefcelldefs In Array(Ap1thVdef, Ap1tuVdef, Ap2thVdef, Ap2tuVdef, Ap3thVdef, Ap3tuVdef, Ap4thVdef, Ap4tuVdef) 
    Set Vdefcelldefs = Range("C" & cellnums) 
    cellnums = cellnums + 1 
Next Vdefcelldefs 
cellnums = 32 

此代碼運行,但變量都設置爲無,這會引發背部的錯誤,這些細胞/變量引用或在計算中使用的任何時間。

任何與此有關的幫助將非常感謝!如果我能更好地解釋它,就問。謝謝,

+0

需要使用陣列代替這個變量'Ap1thV,Ap1tuV,Ap2thV,Ap2tuV,Ap3thV,Ap3tuV,Ap4thV,Ap4tuV'這樣的:'昏暗Ap1thV(1至32)作爲Range' –

+0

Ap1thV是細胞B32 ,Ap1tuV是細胞B33,Ap2thV是細胞B34,Ap2tuV是細胞B35等等。但它只是通過Ap4tuV這是單元格B39。有8列8行。每個單元都需要有自己的變量。 – user2623046

回答

0

每次for循環迭代,它覆蓋當前對象。你需要像獨立數組這樣的東西來保存這些範圍對象。你不得不從0開始索引的數組,如果以下是有道理的:

Dim arrVcelldefs(32) 
Dim arrVdefcelldefs(32) 

cellnums = 32 
For Each Vcelldefs In Array(Ap1thV, Ap1tuV, Ap2thV, Ap2tuV, Ap3thV, Ap3tuV, Ap4thV, Ap4tuV) 
    arrVcelldefs(cellnums-32) = Range("B" & cellnums) 
    cellnums = cellnums + 1 
Next Vcelldefs 
cellnums = 32 
For Each Vdefcelldefs In Array(Ap1thVdef, Ap1tuVdef, Ap2thVdef, Ap2tuVdef, Ap3thVdef, Ap3tuVdef, Ap4thVdef, Ap4tuVdef) 
    arrVdefcelldefs(cellnums-32) = Range("C" & cellnums) 
    cellnums = cellnums + 1 
Next Vdefcelldefs 
cellnums = 32 
+0

不知道我完全明白這是做什麼。但是我仍然在工作表的其他部分發現需要對象的錯誤。我需要能夠在整個代碼中引用Ap1thV和其他代碼......我不確定這會完成這個任務。 – user2623046

0

考慮昏暗荷蘭國際集團作爲他們的靜態然後設置他們只有一次。

0

我假設你正在存儲這些Range對象,但你真正想要的只是單元格中的值。你可能做

Set Ap1thVdef = Range("B23") 

後來用它作爲

MyResult = 100 * Ap1thVdef.Value 

這將是更好的,如果不是的存儲Range對象只存儲值。此外,由於從您的示例中可以看出,至少某些單元格是連續的,因此您可以將多單元格區域的值指定給數組,並獲取包含所有值的2-dim數組。

假設您需要從電子表格中使用16個值。每次運行時都不需要填充這些值,但有時您需要更改它們。設置一個IntitializeVars過程,該過程將根據您提供給過程的範圍填充兩個8行數組。

此外,還包括一個可選的布爾參數來強制數組重新填充,即使他們已經有東西。

Public vaAp As Variant 
Public vaApDef As Variant 

Public Sub InitializeVars(rAp As Range, rApDef As Range, Optional ByVal Force As Boolean = False) 

    If Not IsArray(vaAp) Or Force Then 
     'This creates a two dimensional array 
     vaAp = rAp.Value 
    End If 

    If Not IsArray(vaApDef) Or Force Then 
     'This creates a two dimensional array 
     vaApDef = rApDef.Value 
    End If 

    'Now you have two, 2-dim arrays that are full of the values 
    'from the ranges you passed in 

End Sub 

Sub test() 

    'Put your values into the public arrays 
    InitializeVars Sheet1.Range("B32").Resize(8, 1), Sheet1.Range("C32").Resize(8, 1) 

    'Use the values from the arrays in your business logic 
    Debug.Print 100 * vaAp(2, 1) 
    Debug.Print 3 + vaApDef(6, 1) 

    'Now the something changed and I need to fix the arrays 
    'to point to new locations. I set the last argument to TRUE 
    'so the arrays repopulate even if there's already something 
    'in them 
    InitializeVars Sheet1.Range("D32").Resize(8, 1), Sheet1.Range("E32").Resize(8, 1), True 

    'use the new arrays 
    Debug.Print 100 * vaAp(2, 1) 
    Debug.Print 3 + vaApDef(6, 1) 

End Sub 
相關問題