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

时间:2017-12-25 01:46:45

标签: excel excel-vba vba

我从一个工作簿中逐行提取数据,列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)中的值。

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

这是问题所在的代码。

def FixString(string: String) : String = {
  var newString = string;
  // Find the 1st problematic string
  var start = string.indexOf("\\u");
  while(start != -1) {
    // Extract the problematic string
    val end = start + 6;
    val wrongString = string.substring(start,end);
    // Convert to unicode
    val hexCode = wrongString.substring(2);
    val intCode = Integer.parseInt(hexCode, 16);
    val finalString = new String(Character.toChars(intCode));
    // Replace
    newString = string.replace(wrongString,finalString);
    // Find next problematic string
    start = string.indexOf("\\u", end);
  }
  return newString;
}

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

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

debug.print value给出""。

sourcesheet是全局声明的,是我的源数据 applicationtable是全局声明的,是我的目标表

1 个答案:

答案 0 :(得分: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