添加新的listrow会在最后一行给我一个第2行,而不只是1

问题描述 投票:1回答:1

我从一个工作簿中逐行提取数据,列A到CA(79列)。我将每行添加到新工作簿中的表中,列B到CB。 A列是一个公式。我将新工作簿设置为excel表。我正在将源工作簿行解压缩到一个数组中,然后将该数组分配给新行中的表。 (listrows.add)。 (我删除了除程序开头第1行以外的所有行,并清除第1行中第B列到第CB行的内容)。

当我分配了数组时,A列公式计算一个唯一的ID(然后将用于添加具有该ID名称的新工作表)。

我遇到的问题是当我将第二行添加为新行时,newrow.index是2,正如预期的那样,而不是newrow.range.row应该是4(标题在第2行),它是5.当我引用newrow.range(newrow.index,1)时,我得到“”(好像是使用第5行)而不是newrow.range(2,1)中的值。

我觉得这可能是一个数组问题而且我可能已经盯着这个问题太长时间但是我不明白为什么它会跳过两行。

这是问题所在的代码。

Sub importdata()
Dim lastrw As Long
Dim lastcl As Long
Dim newrow As ListRow
Dim i As Long
Dim j As Long
Dim v As Variant

    lastrw = lastrow(1, sourcesheet)
    lastcl = lastcolumn(1, sourcesheet)

    ReDim v(1 To 1, 1 To lastcl)

    For i = 2 To lastrw
        If i = 2 Then
            Set newrow = applicationtable.ListRows(1)
        Else
            Set newrow = applicationtable.ListRows.Add(alwaysinsert:=True)
        End If
        v = sourcesheet.Range(sourcesheet.Cells(i, 1), sourcesheet.Cells(i, lastcl))
        newrow.Range.Offset(0, 1).Resize(, lastcl) = v
        Debug.Print ".index " & newrow.Index
        Debug.Print ".row " & newrow.Range(newrow.Index, 1).Row
        Debug.Print ".value " & newrow.Range(newrow.Index, 1)
        Call copytemplate(newrow.Range(newrow.Index, 1), i)
    Next i

End Sub

debug.print index给出2(因为它应该在newrow添加之后)

debug.print row给出5(它应该是4. listrow(1)在第3行,所以listrow(2)应该在第4行)。

debug.print值给出“”。

sourcesheet是全局声明的,我的源数据应用程序是全局声明的,是我的目标表

excel excel-vba vba
1个回答
0
投票

你让ListRows和SheetRows感到困惑。 newrow是ListRow。它的Index属性保存表中该行的编号。 newrow.Range(mewrow.Index, 1)是一个工作表范围,其Row属性返回工作表行号。

顺便说一句,ReDim v(1 To 1, 1 To lastcl)是多余的,因为v将采取另一个维度:v = SourceSheet.Range(SourceSheet.Cells(i, 1), SourceSheet.Cells(i, lastcl))。还要注意SourceSheet.Range(SourceSheet.Cells(i, 1), SourceSheet.Cells(i, lastcl))定义了一个你指定给v的范围。这是完全有效的,但你相信Excel要理解的是你并不是指范围。你的意思是将该范围的Value分配给v。如果你说出你的意思,即v = SourceSheet.Range(SourceSheet.Cells(i, 1), SourceSheet.Cells(i, lastcl)).Value,你的代码将更易读,更不容易被误解,特别是你自己。

这同样适用于:newrow.Range.Offset(0, 1).Resize(, lastcl) = v你的意思是newrow.Range.Offset(0, 1).Resize(, lastcl).Value = v。观察到newrow.Range是一个工作表范围,而不是ListObject的范围(这里没有区别,但你需要Offset)。您将隐式地将其大小调整为v的大小。更好的方法是明确地这样做。如,

newrow.Range.Cells(1).Resize(UBound(v), UBound(v, 2)).Value = v
© www.soinside.com 2019 - 2024. All rights reserved.