整数在多次循环后未存储正确的LastRow值:VBA运行时错误
在下面的代码中,my整数在多次循环后未存储正确的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 我正在尝试从源表获取所需的表: 源表 到 所
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