Excel VBA复制C3:C122到间隔70行单元格报错450,求解决方案
VBA代码报错450的问题解决
咱们先明确:当前你的方案是不可行的,报错450完全是代码里的语法和逻辑错误导致的,我给你拆解下问题,再提供修正后的代码:
你的代码里的核心问题
- 语法错误触发450报错:你写的
Cells.Value(i, 3)完全不符合VBA的语法规范。Cells的正确调用方式是Cells(行号, 列号),要访问单元格值的话应该是Cells(i, 3).Value(甚至可以直接写Cells(i,3),因为Value是单元格的默认属性)。你现在的写法相当于给Cells.Value传递了两个参数,这就会触发“参数数量错误”的450提示。 - 赋值逻辑错误:你用
"c" & n是把字符串(比如"c3"、"c4")写入目标单元格,而不是复制C3到C122里的实际内容,正确的应该是引用源单元格的值Cells(n, 3).Value。 - 循环嵌套逻辑错误:你现在的外层循环控制目标行,内层循环遍历源行,这样每个目标行都会被覆盖120次,最后只会留下C122的内容,完全达不到复制整个C3:C122区域的目的。
修正后的代码(两种方案)
方案1:逐行赋值(适合理解逻辑)
Option Explicit Sub Titles() Dim targetRow As Long Dim sourceRow As Integer Dim rowOffset As Integer ' 遍历所有目标起始行:从150开始,每70行一次,直到8791 For targetRow = 150 To 8791 Step 70 ' 遍历源区域C3:C122,计算当前源行相对于起始行的偏移量 For sourceRow = 3 To 122 rowOffset = sourceRow - 3 ' 把源单元格的值赋值给对应的目标单元格 Cells(targetRow + rowOffset, 3).Value = Cells(sourceRow, 3).Value Next sourceRow Next targetRow End Sub
方案2:批量复制(更高效,推荐)
如果数据量较大,直接用区域复制的方法会快很多,不用逐行循环:
Option Explicit Sub Titles() Dim targetRow As Long Dim sourceRange As Range ' 先定义好要复制的源区域C3:C122 Set sourceRange = ThisWorkbook.ActiveSheet.Range("C3:C122") ' 遍历所有目标起始行 For targetRow = 150 To 8791 Step 70 ' 一次性把源区域复制到目标起始行的C列位置 sourceRange.Copy Destination:=Cells(targetRow, 3) Next targetRow End Sub
补充说明
- 我把循环变量
i改成了targetRow,n改成了sourceRow,这样变量名更直观,方便你后续维护。 - 用
Long类型存储目标行号,因为Excel的行号可能超过Integer的最大值(Integer最大是32767,虽然你的8791没超,但养成好习惯总是没错的)。
内容的提问来源于stack exchange,提问作者mathwandererw
相关产品推荐
相关产品推荐

