【问题标题】:VBA Subtract two different 3 dimensional Arrays from eachotherVBA相互减去两个不同的3维数组
【发布时间】:2017-10-17 09:48:34
【问题描述】:

我是 Vba 的新手,需要用宏和 vba 解决特定问题。希望你能帮我解决这个问题!

我尝试构建一个可以帮助我完成以下步骤的宏:

  1. 我使用一个“驾驶舱文件”,我想用它从两个工作表中减去所有单元格。我从两个不同的工作簿中获取工作表。 ;-) 例如:我想从 F11 (Workbook2.Worksheet1) 中减去单元格 F11 (Workbook1.Worksheet1),而不是从 F12 (Workbook2.Worksheet1) 中减去 F12 (workboosk1.worksheet1),[...] J34 (Wb1 .ws1.) 来自 J34(Wb2.ws.1)
  2. 我想更改和选择文件。因此,我需要一个可以选择特定文件的窗口。
  3. 为避免错误,应通过 vba 中的数组完成数学运算。并且应该在其中一个工作簿中添加新值

我尝试使用循环来解决数学问题,但它不起作用。当我来到减法公式时,我得到运行时错误 13。

希望你能帮助我!对不起我的英语不好

这是我的代码

Sub Makro4()

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

    'Variabledef
    Dim i As Long 'Index
    Dim j As Long 'Index
    Dim k As Long 'Index
    Dim ArrayA As Variant 'Array
    Dim ArrayB As Variant 'Array
    Dim ArrayC As Variant 'Array
    Dim MyFile1 As String 'Workbookname
    Dim MyFile2 As String 'Workbookname
    Dim wb1 As String 'Workbookname
    Dim wb2 As String 'Workbookname
    Dim WS_Count1 As Integer 'Count Worksheets
    Dim WS_Count2 As Integer 'Count Worksheets
    Dim arrays1 As String 'Dimension
    Dim arrays2 As String 'Dimension


    'Change the actual path

    ChDrive "O:\"
    ChDir "O:[.......]\VBA"


    'Selection first File

    MyFile1 = Application.GetOpenFilename
    Workbooks.Open Filename:=MyFile1, ReadOnly:=True, IgnoreReadOnlyRecommended:=True
    wb1 = ActiveWorkbook.Name
    ArrayA = Workbooks(wb1).Worksheets("01").Range("F11:GL46").Value
    WS_Count1 = ActiveWorkbook.Worksheets.Count


    'Selection second File

    MyFile2 = Application.GetOpenFilename
    Workbooks.Open Filename:=MyFile2, ReadOnly:=True, IgnoreReadOnlyRecommended:=True
    wb2 = ActiveWorkbook.Name
    ArrayB = Workbooks(wb2).Worksheets("01").Range("F11:GL46").Value
    WS_Count2 = ActiveWorkbook.Worksheets.Count



' Calculation of the math - Runtime Error 13

    For k = 1 To WS_Count1
        For i = LBound(ArrayA, 1) To UBound(ArrayA, 1)
            For j = LBound(ArrayA, 2) To UBound(ArrayA, 2)
                ArrayC(i, j) = ArrayA(i, j) - ArrayB(i, j)
            Next j
        Next i

        Worksheets("k").Range("F11:GL34").Value = ArrayC

    Next k


Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic

End Sub

【问题讨论】:

  • 你在哪一行得到错误?您想将最初来自Range("F11:GL46") 的数组应用到Range("F11:H34") 是否正确?
  • @HerrDerb 抱歉,输入错误。新值应添加到同一范围Range("F11:GL46")。我在ArrayC(i,j) = ArrayA(i,j) - ArrayB(i,j) 行中得到错误
  • 认为问题是你没有在任何地方定义ArrayC的大小。
  • "为了避免错误,应该通过 vba 中的数组来完成数学运算" 为什么?我会选择第一个范围并复制到目标,然后选择第二个范围并复制、粘贴特殊值、减去第一个副本
  • @HarassedDad 感谢您的提示,但这是我的经理的看法..

标签: arrays vba excel


【解决方案1】:

ArrayC 尚未初始化。它被定义为Variant,这意味着在将某些东西分配给变量之前,类型是未知的。

通过ArrayC(i, j) = ArrayA(i, j) - ArrayB(i, j) 这一行,您已经假设ArrayC 拥有一个数组,但它还没有。

首先在你的脑海中定义ArrayC,像这样Dim ArrayC()。这样它就被明确定义为一个数组。仍然没有大小。

现在在For k = 1 To WS_Count1 行之前,您以这种方式设置数组的维度ReDim ArrayC(UBound(ArrayA,1) ,UBound(ArrayA,2)) 这应该会创建一个与ArrayA 大小相同的二维数组。 现在你有一个完全初始化的数组

现在你的程序应该可以运行了。

【讨论】:

  • 我改变了你告诉我的一切,但同样的错误仍然发生。 (运行时错误 13)
  • 出现在哪一行?
  • 它出现在同一行ArrayC(i,j) = ArrayA(i,j) - ArrayB(i,j) 我将Dim ArrayC As Variant 更改为Dim ArrayC() 并将Redim ArrayC[...] 粘贴在For k [...] 前面
  • 您的数组包含哪些数据?数字?
  • 是的,数字。您的代码有效!我的数据中有一些#DIV/0!。我集成了If Not IsError(ArrayA(i, j)) Or Not IsError(ArrayA(i, j)) Then ArrayC(i, j) = ArrayA(i, j) - ArrayB(i, j),看起来很有效
猜你喜欢
  • 2019-07-30
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
  • 1970-01-01
  • 2016-02-18
  • 2013-09-09
  • 1970-01-01
  • 2017-11-12
相关资源
最近更新 更多