gpt4 book ai didi

vba - 如何在每个循环中从某个点访问数组?

转载 作者:行者123 更新时间:2023-12-03 03:48:54 25 4
gpt4 key购买 nike

问题详细信息

下面的代码将计算结果存储在数组 funds() 中,并针对所选范围重复该过程。最后将得到一个包含 170 个值的一维数组。我需要在每个循环中从某个点访问数组,以便用不同的值填充新行。

问题详情

我遇到的核心问题是将数组打印到工作簿上的一个范围,该范围由 10 行 x 17 列组成。

一旦“对于选定范围内的每个单元格”循环退出,我设法让它向下移动一行,但现在它用相同的初始数组值填充新行!

这是当前的输出:

Output

我尝试了什么?

  • 我尝试过 Redim,但对示例的长度感到不知所措。
  • 我尝试过手动复制和粘贴,但感觉这是作弊......
  • 我研究了如何通过复制过程删除元素..

总的来说,我确信有一种简单的方法,每个人都知道如何使用!但这是什么?

简而言之...

Every loop remove the initial 17 values, then print the next 17 array values to new row in range. Repeat 10 times.

代码

Option Explicit
Public funds(0 To 170) As Variant

Sub cumulativeperformance()

Dim selectedrange As Range
Dim cell As Range
Dim value1 As Double
Dim Value2 As Long
Dim i, x, d, c As Integer
Dim total(0 To 170) As Double

'Copy the table to report
Worksheets("Data").Range("C3:T13").Copy
Sheets("Report").Range("B39").PasteSpecial
Worksheets("Data").Range("B3:T13").Copy
Sheets("Report").Range("A39").PasteSpecial xlPasteValues

'Repeat 9 times
c = 39
For d = 0 To 9

c = c + 1
Set selectedrange = Worksheets("Report").Range(Cells(c, 3), Cells(c, 19))
For Each cell In selectedrange

value1 = cell.Value

'get the value of cell to the left of current cell
Value2 = cell.Offset(0, -1).Value

'get the difference to previous month
value1 = value1 / Value2 - 1

'assign result + 1 to array
total(x) = value1 + 1

'If initial fund slot is 0, then store first result of calculation in that slot
If i = 0 Then
funds(i) = total(0) - 1
ElseIf i > 0 Then
'Do calculation on remaining values and store in fund array
funds(i) = (funds(i - 1) + 1) * total(i) - 1
End If

'MsgBox "cumulative performance: " & funds(I) & " Cell address: " & cell.Address
i = i + 1
x = x + 1

Next

'Write from one dimensional Array To The worksheet
Dim Destination As Range
Dim j As Integer

Set Destination = Range(Cells(c, 3), Cells(c, 3)) 'starts at
Set Destination = Destination.Resize(1, 17) 'UBound(funds))
Destination.Value = funds

'MsgBox "Hi there"

Next d

'one-off commands in here
Range("C40:S49").NumberFormat = "0.00%"
Call portfoliomay

End Sub

最佳答案

目标范围和源数组应该具有相同的维度,以便能够正确分配值,如 Ron Rosenfeld 所评论的。这可以通过使用一维数组一次仅对一行重复使用 10 次 array(columns) 来实现。 ,或完整目标范围 (10x17) array(rows, columns) 的二维数组。

方法#1:一维数组

使用包含 17 个值的一维数组,进行逐行操作,一次一行。最初将数组声明为动态数组 Dim funds() ... ,这样您就可以轻松地重置它。然后设置其从零开始的长度ReDim funds(16) ...在每个 For d = 0 To 9 的开头迭代。其余代码将保持不变。使用此方法,您的原始目标分配应该按预期工作 Destination.Value = funds (或使用等效的较短语句 Cells(c, 3).Resize(1, 17) = funds )。

方法#2:二维数组

您可以将资金声明为从零开始的二维数组 Dim funds(9, 16) ... 。但是没有直接的方法可以将数据逐行放入。 目的地分配将立即分配给整个范围 Cells(40, 3).Resize(10, 17) = funds 计算循环结束后。您还需要调整funds指示行 funds(d, i) = ... 的指令。这可能是将数据放入工作表中的最有效的方法(性能方面),因为将数据放入单元格相对耗时。

*要使用二维数组逐行执行此操作,您必须使用此处描述的解决方法 return an entire row of a multidimensional array in VBA to a one dimensional array .

其他调整

您需要调整您的total数组具有与 funds 相同的维度和指令,或调整ix计算。调整ix并离开total按原样添加 i = 0在您的 For d 的开头迭代,并且仅使用total(x) .

关于vba - 如何在每个循环中从某个点访问数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37897589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com