在VBA中使用不同行数的列循环函数

时间:2016-03-22 22:32:56

标签: vba

我正在处理一个大型数据集,其中每三个列都包含我需要执行一个函数的值,如果它是正数而取值为1,如果是负数则取值为-1。编写函数本身没有问题,但数据矩阵的维度很大,并且列的长度不相等。因此,我需要能够编写循环遍历列的代码,执行任务,并将结果保存在具有相同数量的colummns和相同长度的行的另一个矩阵中。更具体地说,我正在处理的数据集的一个例子和我想要实现的目标:

x1;x2;x3;x4
1;-1;2;4
-5;1;2;-1
1; ;2;1
3; ; ;-4
5; ; ; 
6; ; ;

并将其转移到:

y1;y2;y3;y4
1;-1;1;1
-1;1;1;-1
1; ;1;1
1; ; ;-1
1; ; ;
1; ; ;

x和y需要在同一行。

提前谢谢!

编辑: 实际上,我正在处理的事情看起来更像是这样:

Timestamp   Last    Trade Volume    Timestamp   Last    Trade Volume    Timestamp   Last    Trade Volume    Timestamp   Last    Trade Volume
4.1.2016 13:34  3.12    3300    4.1.2016 13:34  7.82    100 4.1.2016 13:34  4.58    3000    4.1.2016 13:35  4.59    #N/A
4.1.2016 13:34  3.12    600 4.1.2016 13:34  7.83    300 4.1.2016 13:34  4.58    5750    4.1.2016 13:34  4.61    1000
4.1.2016 13:34  3.12    1000    4.1.2016 13:34  7.85    200 4.1.2016 13:34  4.59    300 4.1.2016 13:34  4.61    9500
4.1.2016 13:34  3.12    800 4.1.2016 13:34  7.85    500 4.1.2016 13:34  4.59    2000    4.1.2016 13:34  4.6 2200
4.1.2016 13:34  3.12    1200    4.1.2016 13:34  7.85    1700    4.1.2016 13:34  4.59    1000    4.1.2016 13:34  4.6 1200
4.1.2016 13:34  3.12    400 4.1.2016 13:34  7.85    100 4.1.2016 13:34  4.59    950 4.1.2016 13:33  4.6 500
4.1.2016 13:34  3.12    600 4.1.2016 13:34  7.85    200 4.1.2016 13:34  4.59    100 4.1.2016 13:33  4.6 2000
4.1.2016 13:34  3.11    4500    4.1.2016 13:34  7.85    1800    4.1.2016 13:34  4.59    750 4.1.2016 13:33  4.61    7500
4.1.2016 13:34  3.11    300 4.1.2016 13:34  7.82    2000    4.1.2016 13:34  4.58    500 4.1.2016 13:33  4.59    1400
4.1.2016 13:34  3.11    3700    4.1.2016 13:34  7.83    1000    4.1.2016 13:34  4.59    2000    4.1.2016 13:33  4.59    11000

除了行长度不相等外,我有300多列,最长行超过100,000+。我需要能够在Last columns上运行这个东西,我有一个不同的代码可以在Volume列上运行。我完全没有一个解决方案允许我粘贴包含相应长度列的公式的单元格,但是将代码粘贴到整个数组上是不可行的,因为它会使整个excel崩溃,即我需要能够省略没有值形成循环的单元格。

1 个答案:

答案 0 :(得分:0)

抱歉,我没有在我面前的代码,但我想我仍然可以提供帮助。

xlLastCell怎么样?我的意思是,这可能不是最有效的,但那将是最简单的。只需获取xlLastCell的行和列,对于row = 1到lastrow,对于col = 1到lastcol,如果它是空白则是下一个col / next行,如果abs(cell.value)= cell.value则是sheet(2 ).cells(row,col)= 1,否则它= -1。你提到了每一个第三列,我只会使用if .row mod 3 =(1,2,0取决于你需要的)来决定你是下一个col还是做那个列。 现在,这只适用于“另一个矩阵”,你只是指另一个电子表格。如果你的意思是2d数组,你可以找到xlLastCell,然后将矩阵(lastrow,lastcol)重新设置为int,并将它全部放在矩阵而不是sheet2中。 或者,如果你的意思完全不同,那么我道歉,我不确定。