Excel 使用数组将范围写入没有值的工作表
是否可以仅在存在值的情况下将范围写入工作表?假设您可以为一个变量指定一些特殊的数据类型,比如null?但是很明显,null只是清除单元格 例如:Excel 使用数组将范围写入没有值的工作表,excel,vba,Excel,Vba,是否可以仅在存在值的情况下将范围写入工作表?假设您可以为一个变量指定一些特殊的数据类型,比如null?但是很明显,null只是清除单元格 例如: Sub test2() Dim a(2, 1) As Variant a(0, 0) = "a" a(1, 0) = Null a(2, 0) = "c" Selection = a End Sub 为什么我需要这个?加快工作表值的更新,因为将整个数组写入工作表要比写入单行快得多 编辑1: 这就是我所做的: F
Sub test2()
Dim a(2, 1) As Variant
a(0, 0) = "a"
a(1, 0) = Null
a(2, 0) = "c"
Selection = a
End Sub
为什么我需要这个?加快工作表值的更新,因为将整个数组写入工作表要比写入单行快得多
编辑1:
这就是我所做的:
For i = 0 To rowi
Call CellAddMerged(RngData(1 + i, mvaln), rsrows(j, i), mcol)
Next
Private Sub CellAddMerged(ByRef DestCell As Range, ByVal SourceItems As Collection, ByRef qcolumn As settingscolumns)
Dim sitm As Variant
Select Case qcolumn.Preprocess
Case 1 ' trim
sitm = Application.WorksheetFunction.Trim$(SourceItems(1))
Case 2 ' degrees
If IsNumeric(SourceItems(1)) = True Then
sitm = Application.WorksheetFunction.Degrees(SourceItems(1))
Else
sitm = SourceItems(1)
End If
Case 3 ' radians
If IsNumeric(SourceItems(1)) = True Then
sitm = Application.WorksheetFunction.Radians(SourceItems(1))
Else
sitm = SourceItems(1)
End If
Case Else
sitm = SourceItems(1)
End Select
If LenB(SourceItems(1)) > 0 Then
If Opt.ValidationExists(DestCell) = True Then
DestCell.Validation.Modify Formula1:=DestCell.Validation.Formula1 & listdelim & sitm
Else
DestCell.Validation.Add Type:=xlValidateList, Formula1:=sitm
If qcolumn.PullDownAllNotOn = True Then DestCell.Validation.ShowError = True Else DestCell.Validation.ShowError = False
End If
If LenB(DestCell) = 0 Then DestCell = sitm
End If
End Sub
RngData是工作表范围。rsrows(j,i)包含集合的数组。mcol是一些自定义类。。。
我假设我不能再提高性能了?首先用范围值填充数组,然后更改所需的数组值,最后将数组值放入范围:
Dim a() As Variant
a = Selection.Value
a(1, 1) = "a"
a(3, 1) = "c"
Selection.Value = a
超出范围值的数组是基于一的数组首先用范围值填充数组,然后更改所需的数组值,最后将数组值放入范围:
Dim a() As Variant
a = Selection.Value
a(1, 1) = "a"
a(3, 1) = "c"
Selection.Value = a
超出范围值的数组是一个基于一的数组您发布的代码不会出现错误,并且会根据需要写入范围。你到底有什么问题,或者你犯了什么错误?如果您提供了预期输出的图片,也许这将帮助我们更好地帮助您?使用
选择
来测试这一点并不是最好的,因为要求选择
与array@ScottHoltzman我认为问题在于a(1,0)=Null
覆盖OP希望保持不变的单元格中的数据。您只需在数组中循环,并仅在值不为Null时将值添加到相应的单元格中。你试过了吗?是不是太慢了?可能更快的方法是将带有值的数组与现有单元格值的数组合并,这样带有值的数组将被单元格值替换为null。在这个合并之后设置值,但是我想这会更快。更快的应该是使用数组并将结果分配给范围。在excel范围内循环并直接对其进行操作可能要慢得多。我说可能,你必须亲自尝试。你发布的代码不会出现错误,并且会按照你的要求写入范围。你到底有什么问题,或者你犯了什么错误?如果您提供了预期输出的图片,也许这将帮助我们更好地帮助您?使用选择
来测试这一点并不是最好的,因为要求选择
与array@ScottHoltzman我认为问题在于a(1,0)=Null
覆盖OP希望保持不变的单元格中的数据。您只需在数组中循环,并仅在值不为Null时将值添加到相应的单元格中。你试过了吗?是不是太慢了?可能更快的方法是将带有值的数组与现有单元格值的数组合并,这样带有值的数组将被单元格值替换为null。在这个合并之后设置值,但是我想这会更快。更快的应该是使用数组并将结果分配给范围。在excel范围内循环并直接对其进行操作可能要慢得多。我说可能,您必须自己尝试。那么,将所有值设置为一个变量,然后再将其设置回对性能的影响是否小于在工作表上设置每个单元格?我想是的,但您自己去检查一下。当然,如果范围很小,那么差异是难以察觉的。我很乐意解释如何改进我的回答。那么,将所有值设置为一个变量,然后再重新设置比在工作表上设置每个单元格对性能的影响更小吗?我想是的,但请自己去检查一下。当然,如果范围很小,那么差别是难以察觉的。我很乐意解释如何改进我的答案