Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 使用数组将范围写入没有值的工作表_Excel_Vba - Fatal编程技术网

Excel 使用数组将范围写入没有值的工作表

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

是否可以仅在存在值的情况下将范围写入工作表?假设您可以为一个变量指定一些特殊的数据类型,比如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: 这就是我所做的:

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范围内循环并直接对其进行操作可能要慢得多。我说可能,您必须自己尝试。那么,将所有值设置为一个变量,然后再将其设置回对性能的影响是否小于在工作表上设置每个单元格?我想是的,但您自己去检查一下。当然,如果范围很小,那么差异是难以察觉的。我很乐意解释如何改进我的回答。那么,将所有值设置为一个变量,然后再重新设置比在工作表上设置每个单元格对性能的影响更小吗?我想是的,但请自己去检查一下。当然,如果范围很小,那么差别是难以察觉的。我很乐意解释如何改进我的答案