Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.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
整数在多次循环后未存储正确的LastRow值:VBA运行时错误_Vba_Excel_Excel 2010 - Fatal编程技术网

整数在多次循环后未存储正确的LastRow值:VBA运行时错误

整数在多次循环后未存储正确的LastRow值:VBA运行时错误,vba,excel,excel-2010,Vba,Excel,Excel 2010,在下面的代码中,myLastRow变量未在第27个循环中存储正确的行号(i=27),导致代码出现故障 我已经多次使用F8步骤,并注意到问题出现在第27个循环中。LastRow变量意味着在循环的每次迭代中都要比上一次的LastRow值多+1204行,所以我期望的是LastRow=32509而不是LastRow=31316。作为参考,在第26个循环中,LastRow=31305。我不知道为什么当代码在前26个循环中运行时,it会发现错误的LastRow 我正在尝试从源表获取所需的表: 源表 到 所

在下面的代码中,my
LastRow
变量未在第27个循环中存储正确的行号(
i=27
),导致代码出现故障

我已经多次使用F8步骤,并注意到问题出现在第27个循环中。
LastRow
变量意味着在循环的每次迭代中都要比上一次的
LastRow
值多+1204行,所以我期望的是
LastRow=32509
而不是
LastRow=31316
。作为参考,在第26个循环中,
LastRow=31305
。我不知道为什么当代码在前26个循环中运行时,it会发现错误的
LastRow

我正在尝试从源表获取所需的表:

源表

所需表格

此外,显示的最后一个错误是:

运行时错误“1004”:应用程序定义或对象定义的错误

子填充_实体()
作为整数的Dim i
i=1
最后一排一样长
将文本设置为字符串
当i<122'穿过实体时执行(按列)
如果i=1,那么
范围(“E1”)。选择
选择,复制
SearchText=ActiveCell.Value
结束(xlToLeft)。选择“向左捕捉(单元格A1)”
ActiveCell.Offset(0,2)。选择“移动到单元格C1”
ActiveCell.Offset(1,0)。选择“移动到单元格C2”
其他的
ActiveCell.Offset(0,i+1)。选择
选择,复制
SearchText=ActiveCell.Value
结束(xlToLeft)。选择
ActiveCell.Offset(0,2)。选择
ActiveCell.End(xlDown)。选择
ActiveCell.Offset(1,0)。选择
如果结束
活动表。粘贴
ActiveCell.Offset(1203,0)。选择
活动表。粘贴
ActiveCell.End(xlUp)。选择
'==========此处有错误========
LastRow=Cells.Find(What:=SearchText,After:=ActiveCell,LookIn:=xlValues,SearchOrder:=xlByRows)。行
范围(“C”&ActiveCell.Row&“:C”&LastRow).FillDown
ActiveCell.End(xlUp)。选择
i=i+1
环
端接头

我认为您不需要任何搜索,因为您的代码总是将搜索字符串放在第1205行。既然你知道它就在那里,你就不需要去寻找它。这个想法让我想到下面的代码

Sub Populate_Entity()

    Dim C As Long                                   ' Column
    Dim Target As Range
    Dim FirstRow As Long
    Dim LastRow  As Long

    FirstRow = 2
    LastRow = 7     '1205
    C = 3
    Range("C2").value = Range("E1").value
    ' Cells(2, C).Value = Cells(1, 5).Value

    Do
        Set Target = Range(Cells(FirstRow, C), Cells(LastRow, C))
        Target.FillDown

        C = C + 1
        Cells(2, C).value = "Can't figure"

    Loop While C < 3    ' 122

End Sub
子填充_实体()
尺寸C为“长”列
作为射程的弱小目标
第一排一样长
最后一排一样长
第一行=2
LastRow=7'1205
C=3
范围(“C2”).值=范围(“E1”).值
'单元格(2,C).值=单元格(1,5).值
做
设置目标=范围(单元格(第一行,C),单元格(最后一行,C))
Target.FillDown
C=C+1
单元格(2,C)。value=“无法计算”
C<3'时循环122
端接头
我已经将循环缩短到只有7行(而不是1205)和3列(而不是122)。我就是不知道第一行的文字应该从哪里来。对于C列,它来自E1,但在后续列中它来自哪里?您可以使用我在上面展示的方法来填写,比如,
单元格(2,C)。Value=Cells(1,5)。Value
。我相信
5
可以用从当前C派生的值代替,可能是
C+2


请注意
单元格(2,C)。值
不是指单元格
C2
中的值。相反,if指的是第2行C列中的单元格。

您想要的内容的摘要,如您在注释中所述:

复制单元格E1:DU1中的值,将每个单元格粘贴到C列中1204次

  • 第1个循环将单元格E1粘贴到C2:C1205中
  • 第二个循环将单元格F1粘贴到C1206:C2409
  • 等等
该准则实现了以下目标:

Sub Populate_entity()

    ' Declare 2 range variables (top row to copy from and paste destination)
    Dim RowRange As Range
    Dim PasteCells As Range
    ' Use the With block to specify the sheet. If you want the destination
    ' to be another sheet, then you can specify that instead: 
    ' ThisWorkbook.Sheets("SheetName").Range("...") 
    With ThisWorkbook.ActiveSheet
        Set RowRange = .Range("E1:DU1")     ' Set range to copy from
        Set PasteCells = .Range("C2:C1205") ' Set paste cells, blocks of 1204 cells in column C
    End With
    ' Loop through RowRange, copy each cell's value into PasteCells
    ' Then offset the PasteCells range by 1024 rows, so next RowRange cell
    ' is inserted underneath previously copied cells.
    Dim ofst As Long
    For ofst = 1 To RowRange.Cells.Count
        ' Use .Value to avoid the (comparably slow) copy/paste operation 
        PasteCells.Offset((ofst - 1) * 1204, 0).Value = RowRange.Cells(ofst).Value
    Next ofst

End Sub

谢谢,它就像一个符咒;代码非常简洁。我觉得自己像个白痴,花了4-5个小时编写代码并对代码进行故障排除。我第一次使用VBA,也许这就是原因!尽管我仍然渴望找出是什么导致了代码中最后一行的问题@大卫,R.e.是什么导致了你的错误。。。您使用的是
.Find
,但未指定
LookAt:=xlPart
LookAt:=xlother
。它可能默认为
xlPart
,在这种情况下,它将对先前粘贴的值进行部分匹配。这将给您一个不正确的行。尝试将
LookAt:=xlWhole
添加到
.Find
语句中。你是对的,我试过了,现在可以用了。除了我的代码运行15秒,而你的代码运行1-2秒。再次感谢!!!欣赏help@David,那个时候的劣势可能来自两个方面。1) 所有选择/使用ActiveCell而不是定义范围的操作。2) 使用
.Value
比使用剪贴板(复制/粘贴)快得多。如果希望复制公式而不是值,则以后也可以使用
.Formula
。快乐VBA,一定会学会使用。更珍惜。我的代码是这样结构的部分原因是因为我在两次迭代中使用了record宏函数,以了解VBA代码需要什么,然后对录制的宏进行了概括;这段对话已经结束。
Sub Populate_entity()

    ' Declare 2 range variables (top row to copy from and paste destination)
    Dim RowRange As Range
    Dim PasteCells As Range
    ' Use the With block to specify the sheet. If you want the destination
    ' to be another sheet, then you can specify that instead: 
    ' ThisWorkbook.Sheets("SheetName").Range("...") 
    With ThisWorkbook.ActiveSheet
        Set RowRange = .Range("E1:DU1")     ' Set range to copy from
        Set PasteCells = .Range("C2:C1205") ' Set paste cells, blocks of 1204 cells in column C
    End With
    ' Loop through RowRange, copy each cell's value into PasteCells
    ' Then offset the PasteCells range by 1024 rows, so next RowRange cell
    ' is inserted underneath previously copied cells.
    Dim ofst As Long
    For ofst = 1 To RowRange.Cells.Count
        ' Use .Value to avoid the (comparably slow) copy/paste operation 
        PasteCells.Offset((ofst - 1) * 1204, 0).Value = RowRange.Cells(ofst).Value
    Next ofst

End Sub