2014-02-19 22 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 
相关问题