减去变体

时间:2019-07-12 15:24:11

标签: excel vba

我很难让Variants减去。我正在从电子表格中提取数据,如果一个单元格声明了一个短语,那么我需要代码从另一个单元格中减去一个单元格。如果该单元格未声明短语,那么我需要将其复制到另一个单元格。我可以运行代码,但是什么也没有发生。

Private Sub CommandButton1_Click()

    Dim x As Variant, y As Variant, z As Variant, a As Integer, B As String

    'getting values for data
    x = Range("D2:D48").Value
    y = Range("I2:I48").Value
    z = Range("E2:E48").Value

    B = "Total ISU Days: "
    'The the cells are empty then subtract. This is not what I wanted to do but I can't think of extracting strings from variants. 
    If IsEmpty(Range("D2:D48").Value) = True Then
        a = y - z
    End If

    Range("N2:N48").Value = a
    Range("M2:M48").Value = B

End Sub

2 个答案:

答案 0 :(得分:3)

x = Range("D2:D48").Value
y = Range("I2:I48").Value
z = Range("E2:E48").Value

Variant包含有关其子类型的元数据。在这种情况下,xyz都是变量的数组

a = y - z

该表达式的右侧根本无法求值,因为{array1} - {array2}毫无意义:运算符(算术逻辑)不能使用 值数组

a应该是什么?它被声明为As Integer,因此其值上限为32,767(应该是Long)。如果您打算将y中的所有值相加,然后从z中的所有值的总和中减去该总数,那么您需要更清楚地了解如何实现-您可以使用{{ 1}}来添加内容:

Application[.WorksheetFunction].Sum

然后...

sumOfY = Application.Sum(Range("I2:I48"))
sumOfZ = Application.Sum(Range("E2:E48"))
a = sumOfY - sumOfZ

这会将Range("N2:N48").Value = a 的值放在a范围内的每个单元格中–这真的是您的意思吗?

或者也许您打算这样做?

N2:N48

这将使Range("N2:N48").Formula = "=IF(D2="""",I2-E2,0)" 中的每个单元格为N2:N48为空的每一行计算IE之间的差……并且实际上并不需要任何VBA代码都可以做到这一点。

答案 1 :(得分:0)

让我们简化一下任务,并说这个想法是从左侧的对应值-Range("C1:C6")中减去Range("B1:B6")中的值。然后将相应的结果写入列E

enter image description here

当然,只有在列A中的所有值为空的情况下,才可以这样做。这是一种方法:

Sub TestMe()

    Dim checkNotEmpty As Boolean: checkNotEmpty = False
    Dim substractFrom As Range: Set substractFrom = Worksheets(1).Range("B1:B6")
    Dim substractTo As Range: Set substractTo = Worksheets(1).Range("C1:C6")

    Dim MyCell As Range
    Dim result() As Variant
    ReDim result(substractFrom.Cells.Count - 1)

    Dim areCellsEmpty As Boolean
    For Each MyCell In substractFrom
        If Len(MyCell) > 0 Then checkNotEmpty = True
    Next

    Dim i As Long
    For i = LBound(result) + 1 To UBound(result) + 1
        result(i - 1) = substractFrom.Cells(i) - substractTo.Cells(i)
    Next

    Worksheets(1).Range("E1").Resize(UBound(result) + 1) = Application.Transpose(result)

End Sub
  • 可以进一步改进代码,将所有范围保存到数组中,但是到目前为止还可以。

  • 需要使用+1中带有-1For-loop的部分作为解决方法:

    For i = LBound(result) + 1 To UBound(result) + 1 result(i - 1) = substractFrom.Cells(i) - substractTo.Cells(i) Next

因为数组从索引0开始,但是范围内的Cells从行1开始。

  • Worksheets(1).Range("E1").Resize(UBound(result) + 1) = Application.Transpose(result)需要将result数组的值写入列E,而无需定义E中范围的长度。