如何将另一个具有变量的单元格的乘积放入一个单元格中?

时间:2018-10-27 22:24:48

标签: excel vba

我是vba的新手,我一直在尝试使以下代码正常工作:

random_delay()

我想做的是将SUMIF公式的结果放入变量中,并使用相同的值将其乘以另一个单元格的值。

它给我一个错误,“应用程序定义的错误或对象定义的错误”。

谢谢

1 个答案:

答案 0 :(得分:0)

再次数组

消除器

Sub Eliminator()

Dim convert As Long

'Convert = WorksheetFunction.SumIfs(Sheets("Convert").Range("C:C"), _
      Sheets("Convert").Range("A:A"), Sheets("Vista").Range("L8"), _
      Sheets("Convert").Range("D:D"), Sheets("Vista").Range("C2"), _
      Sheets("Convert").Range("E:E"), Sheets("Vista").Range("AC4"))

'e.g.
convert = 1000
Sheets("series").Range("L2").FormulaR1C1 = "=RC[-8]*" & convert

End Sub

Blah,Blah ...

现在我们已经得出结论,“转换”行引起了错误...
由于我使用Excel 2003,并且您正确地编写了公式,所以我只能猜测,由于SumIfs类似于数组公式,因此不能总是在VBA中成功使用它,或者永远不会成功!如果单元格中有错误值,则可能有解决方案,因为VBA会将其视为“ VBA错误”。

“ SumIfsless”解决方案

因此,我提供了另一个不使用SumIfs的解决方案。您可以从VBA或任何其他工作表中运行它。 'str1'注释行用于调试目的。您可以取消注释它们,并在“即时”窗口中看到一些“小计”。

Sub SumIfsArray()
'Variables
  'Objects
  Dim oRng As Range 'Range of the Sum Column (To Calculate First and Last Row)
  'Arrays
  Dim arrRngAddress As Variant 'Compare Addresses
  Dim arrWs As Variant 'Worksheet Names
  Dim arrCol As Variant 'Three Lookup Columns and the Sum Column
  Dim arrRng As Variant 'Values of the Compare Addresses
  Dim arrRanges As Variant 'The Ranges of the Four Columns
  Dim arrArrays As Variant 'The Values of the Four Columns
  'Other
  Dim iCol As Integer 'Columns Counter
  Dim lngFirst As Long 'First Usable Row of Data
  Dim lngLast As Long 'Last Usable Row of Data
  Dim lngRows As Long 'Number of Rows of Usable Data
  Dim lngRow As Long 'Rows Counter
  Dim lngSum As Long 'Sum of Values
  Dim blnArr As Boolean 'True if all three conditions are met.

'                'Debug Variables
'                Const c1 As String = "," 'Debug String Column Separator
'                Const r1 As String = vbCr 'Debug String Row Separator
'                Dim i1 As Integer 'Debug String Column Counter
'                Dim lo1 As Long 'Debug String Rows Counter
'                Dim str1 As String 'Debug String Concatenator


'Initialize
  arrRngAddress = Array("L8", "C2", "AC4")
  arrWs = Array("Convert", "Vista", "series")
  arrCol = Array("A:A", "D:D", "E:E", "C:C")

'Program
  ReDim arrRng(1 To 3)
  With Worksheets(arrWs(1)) 'Worksheet "Vista"
    For iCol = 1 To 3
      arrRng(iCol) = .Range(arrRngAddress(iCol - 1)).Value
    Next
  End With

'            str1 = "The Values"
'            For i1 = 1 To 3: str1 = str1 & r1 & Space(1) & arrRng(i1)
'            Next: Debug.Print str1

  With Worksheets(arrWs(0)) 'Worksheet "Convert"
    'Number of 'usable' rows of data
    Set oRng = .Range(arrCol(3))

    With oRng
      If .Cells(1, 1) <> "" Then
        lngFirst = 1
       Else
        lngFirst = .Cells(1, 1).End(xlDown).Row
      End If
      lngLast = .Cells(.Rows.Count, .Column).End(xlUp).Row
    End With
    Set oRng = Nothing
    lngRows = lngLast - lngFirst + 1

    'Array of Ranges
    ReDim arrRanges(1 To 4)
    For iCol = 1 To 4
      arrRanges(iCol) = Range(Cells(lngFirst, Range(arrCol(iCol - 1)).Column), _
          Cells(lngLast, Range(arrCol(iCol - 1)).Column)).Address
    Next

'            str1 = "The Ranges"
'            For i1 = 1 To 4: str1 = str1 & r1 & Space(1) & arrRanges(i1)
'            Next: Debug.Print str1

    'Array of Arrays
    ReDim arrArrays(1 To 4)
    For iCol = 1 To 4
      arrArrays(iCol) = .Range(arrRanges(iCol)).Value
    Next
  End With

'            str1 = "Values of Ranges" & r1 & Space(1) & "A,D,E,C"
'            For lo1 = 1 To lngRows: str1 = str1 & r1 & Space(1): For i1 = 1 To 4
'                If i1 <> 1 Then
'                  str1 = str1 & c1 & arrArrays(i1)(lo1, 1)
'                 Else: str1 = str1 & arrArrays(i1)(lo1, 1)
'                End If: Next: Next: Debug.Print str1

  'Sum of Values
  For lngRow = 1 To lngRows
    For iCol = 1 To 3
      If arrArrays(iCol)(lngRow, 1) = arrRng(iCol) Then
        blnArr = True
       Else
        blnArr = False
        Exit For
      End If
    Next
    If blnArr = True Then
      lngSum = lngSum + arrArrays(4)(lngRow, 1)
    End If
  Next

'            str1 = "The Sum": str1 = str1 & r1 & Space(1) & lngSum

'Output
  'Worksheet "series"
  Worksheets(arrWs(2)).Range("L2").FormulaR1C1 = "=RC[-8]*" & lngSum

End Sub

P.S。我从不永远不要在同一工作簿中将变量名称与相同名称用作工作表名称。