我很难让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
答案 0 :(得分:3)
x = Range("D2:D48").Value y = Range("I2:I48").Value z = Range("E2:E48").Value
Variant
包含有关其子类型的元数据。在这种情况下,x
,y
和z
都是变量的数组。
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
为空的每一行计算I
和E
之间的差……并且实际上并不需要任何VBA代码都可以做到这一点。
答案 1 :(得分:0)
让我们简化一下任务,并说这个想法是从左侧的对应值-Range("C1:C6")
中减去Range("B1:B6")
中的值。然后将相应的结果写入列E
:
当然,只有在列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
中带有-1
和For-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
中范围的长度。