Arrays VBA:在循环中使用定义的数组/范围

Arrays VBA:在循环中使用定义的数组/范围,arrays,vba,Arrays,Vba,我对VBA还很陌生,所以我现在很挣扎,代码也很笨拙。 在我的代码中,我试图为一个研究项目识别不相关的股票。其思想是,我的宏生成一个相关矩阵,对股票名称进行限定,然后逐行循环,以返回基础样本中最不相关的股票。然而,我目前不知道我的代码中是否只存在引用问题,或者是否存在任何基本问题。 任何帮助都将不胜感激 在下面找到脚本的相关部分: Sub Test() Dim Names As Variant Dim Ref As Variant Set Names = Worksheets("Correl

我对VBA还很陌生,所以我现在很挣扎,代码也很笨拙。 在我的代码中,我试图为一个研究项目识别不相关的股票。其思想是,我的宏生成一个相关矩阵,对股票名称进行限定,然后逐行循环,以返回基础样本中最不相关的股票。然而,我目前不知道我的代码中是否只存在引用问题,或者是否存在任何基本问题。
任何帮助都将不胜感激

在下面找到脚本的相关部分:

Sub Test()

Dim Names As Variant

Dim Ref As Variant

Set Names = Worksheets("Correlation Matrix").Range(Cells(1, 3), Cells(1, Stocks))

For i = 1 To Stocks

    Worksheets("Correlation Matrix").Activate

        Ref = Worksheets("Correlation Matrix").Range(Cells(i + 1, 3), Cells(i + 1, Stocks)).Value

    Worksheets("Main").Activate

        Worksheets("Main").Cells("O" & i + 4).FormulaArray = "=Index(" & Names.Address & ",MATCH(MIN(ABS(" & Ref.Address & " - 0),ABS(" & Names.Address & "- 0),0))"

Next i

End Sub
相关矩阵工作表如下所示:

Disney Microsoft Apple sp500 Disney 1 0.764790855 0.737566223 0.832602399 Microsoft 0.764790855 1 0.754724823 0.827980429 Apple 0.737566223 0.754724823 1 0.90982066 sp500 0.832602399 0.827980429 0.90982066 1
将变量标注为范围对象。Variant是一种全面数据类型,没有.Name属性

见下文。我还更改了Names变量,因为.Names指的是命名范围

Sub Test()

Dim theNames As Range
Dim Ref As Range

Set theNames = Worksheets("Correlation Matrix").Range(Cells(1, 3), Cells(1, Stocks))

For i = 1 To Stocks

    'Worksheets("Correlation Matrix").Activate - no need to activate sheet

    Set Ref = Worksheets("Correlation Matrix").Range(Cells(i + 1, 3), Cells(i + 1, Stocks)).Value

    'Worksheets("Main").Activate - no need to activate sheet

    Worksheets("Main").Cells("O" & i + 4).FormulaArray = "=Index(" & theNames.Address & ",MATCH(MIN(ABS(" & Ref.Address & " - 0),ABS(" & theNames.Address & "- 0),0))"

Next i

End Sub

考虑这种方法:

在相关矩阵中,我们只需要查看1对角线上方或下方的数字。所有其他值都只是镜像,查看它们会浪费时间

我们试着看一个三角形的坐标:

A (1) B (2) C (3) D (4) E (5) 1 Disney Microsoft Apple sp500 2 Disney 1 0.764790855 0.737566223 0.832602399 3 Microsoft 0.764790855 1 0.754724823 0.827980429 4 Apple 0.737566223 0.754724823 1 0.90982066 5 sp500 0.832602399 0.827980429 0.90982066 1 这张照片

Disney / Apple

并选择单元格A4。

Stocks变量在哪里定义?您好,Tomalak,Stocks在代码的前面部分中定义。这只是我样本中的股票数量。如果你展示相关矩阵工作表的布局也会有所帮助。像我现在做的那样,在问题中编辑类似的内容!类似的内容在评论部分不起作用。非常感谢注意Set Ref=worksheetcorrelationmatrix.RangeCellsi+1,3,Cellsi+1,Stocks.Value。。。是一个RangeCells,Cells问题。嗨,Scott,尝试实施建议的更改,但似乎不起作用unfortunately@BigBen-击中了我在最初的答复中遗漏的那一点。将单元格限定为它们所属的工作表对象。非常感谢建议的更改。重新运行宏并正确生成两个名称ad Ref;问题似乎在我插入的数组公式中的某个地方:WorksheetsMain.CellsO&i+4.FormulaArray==Index&theNames.Address&,MATCHMINABS&Ref.Address&-0,ABS&theNames.Address&-0,0
Sub LeastCorrelated(NumStocks As Integer)
  Dim corrMatrix As Worksheet
  Dim minimumCell As Range, cell As Range
  Dim r As Integer, c As Integer
  Dim stock1 As String, stock2 As String

  Set corrMatrix = Worksheets("Correlation Matrix")
  Set minimumCell = corrMatrix.Cells(2, 2) ' the top-left cell containing "1"

  For r = 3 To NumStocks + 1
    For c = 2 To r - 1
      Set cell = corrMatrix.Cells(r, c)
      If cell.Value < minimumCell.Value Then Set minimumCell = cell
    Next
  Next

  minimumCell.Select
  stock1 = corrMatrix.Cells(1, minimumCell.Column).Value
  stock2 = corrMatrix.Cells(minimumCell.Row, 1).Value

  Debug.Print stock1 & " / " & stock2
End Sub
LeastCorrelated 4
Disney / Apple