首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么直接用数组填充范围并按索引进行索引时得到两个不同的结果?

为什么直接用数组填充范围并按索引进行索引时得到两个不同的结果?
EN

Stack Overflow用户
提问于 2021-12-13 10:44:35
回答 1查看 46关注 0票数 1

我有一个要在工作表中写入的数据数组。

在进行此操作时,我获得了两个不同的结果:

1)循环遍历索引

代码语言:javascript
运行
复制
    For i = 0 To UBound(dataarray(), 1)

        For j = 0 To UBound(dataarray(), 2)

            With mWS_data
                .Cells(i + 2, j + 1) = dataarray(i, j)
            End With

        Next j

    Next i

2)直接填充范围()

代码语言:javascript
运行
复制
        With mWS_data
            'Row + 2 because datarray starts from 0, and 1st row is titles, Column + 1 because same reason but no titles
            .Range(.Cells(2, 1), .Cells(UBound(dataarray(), 1) + 2, UBound(dataarray(), 2) + 1)) = dataarray()
        End With

对于相同的数据,在第一种情况下,我拥有工作表中的所有数据(正确的结果),在第二种情况下,我只有很少的数据(中间有一列的所有正确信息,另一列有正确信息的单元格)。

上星期五,我的代码运行得很好,代码完全没有变化,今天它不能正常工作。

我习惯于用第二种方式进行编码,因为处理时间要快得多。

是否可能是excel安装程序以某种方式介入? 还是我写错了什么?

--编辑:--

这是你给我的简化的完整代码

代码语言:javascript
运行
复制
Sub Load()
    
    Dim dataArray() As Variant
    Dim i As Long
    Dim j As Long
    Dim c_attribute As New Cls_attribute
    
    ReDim dataArray(mJobs.Count - 1, attributes.Count - 1)
    
    'Turns off screen updating and auto calculation
        DisplayCalculation False
        
    'For each item into collection
        For i = 1 To mJobs.Count
            
            Index = i
            
            'Get data from its variable name
                For j = 1 To attributes.Count
                    
                    Set c_attribute = attributes.Item(j)
                    
                    On Error Resume Next
                    dataArray(i - 1, j - 1) = CallByName(Me, c_attribute.name, VbGet)
                    On Error GoTo 0
                    
                    Set c_attribute = Nothing
                    
                Next j
            
        Next i
    
    With mWS_data
    
        'Remove previous data
            .Rows("2:" & Rows.Count).Delete
        
        'Data to worksheet '[VERSION THAT WORKS]
            For i = 0 To UBound(dataArray, 1)
        
                For j = 0 To UBound(dataArray, 2)
        
                    .Cells(i + 2, j + 1) = dataArray(i, j)
        
                Next j
        
            Next i
        
        'Data to worksheet '[VERSION THAT FAILS]
            '.Range("A2").Resize(UBound(dataArray, 1) + 1, UBound(dataArray, 2) + 1).Value = dataArray
    
    End With
    
    'Turns in screen updating and auto calculation
        DisplayCalculation True
    
End Sub

虽然我不能向您展示数据,因为它是机密的,不符合GDPR的:

工作时的

  • :56行和68列数据完成

  • 失败时:填充相同的范围,但只有"AG“列和"AH44”单元格包含数据。

EN

回答 1

Stack Overflow用户

发布于 2021-12-14 04:16:23

将基于二维零基数组写入工作表

代码语言:javascript
运行
复制
Option Explicit

Sub WriteArrayToWorksheet()
    
    Dim DataArray As Variant: ReDim DataArray(0 To 4, 0 To 9) ' 5*10, 'A2:J6'
    Dim r As Long
    Dim c As Long
    For r = 0 To 4
        For c = 0 To 9
            DataArray(r, c) = (r + 1) * (c + 1)
        Next c
    Next r
    
    ' Remember: 'UBound(DataArray, 1)', 'UBound(DataArray,2)', 'DataArray'.
    ' Correct: .Range(.Cells(2, 1), .Cells(UBound(DataArray, 1) + 2, UBound(DataArray, 2) + 1)).Value = DataArray
    ' Wrong:   .Range(.Cells(2, 1), .Cells(UBound(DataArray(), 1) + 2, UBound(DataArray(), 2) + 1)) = DataArray()
    
    With mWS_data
        ' Row + 2 because DataArray starts from 0, and 1st row is titles, Column + 1 because same reason but no titles
        
        ' Correct:
        .Range(.Cells(2, 1), .Cells(UBound(DataArray, 1) + 2, UBound(DataArray, 2) + 1)).Value = DataArray
        
        ' I prefer using 'Resize':
        '.Range("A2").Resize(UBound(DataArray, 1) + 1, UBound(DataArray, 2) + 1).Value = DataArray
    
    End With

End Sub
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70333372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档