Excel VBA For...Next循环中如何定义随x变化的B/C列范围跨表复制
解决方法
你需要的动态范围可以通过字符串拼接的方式构造,直接替换代码中带问号的行即可:
w.Range("B" & x & ":C" & x).Copy Sheets(Wiazka).Range("A1")
原理解释
- VBA中可以用
&符号拼接字符串和变量值,"B" & x会根据当前循环的x值生成对应行的B列单元格地址,比如x=2时就是B2 - 拼接
:C" & x就可以得到完整的同行B到C列的范围,x=2时对应范围就是B2:C2,完全跟随循环变量动态变化
额外优化建议
你现有代码里的w.Select可以直接删除,已经通过w对象指定了工作表来源,不需要主动选中工作表就能操作范围,能减少运行闪烁和异常概率。
以下是调整后的完整可运行代码:
Sub macro_cpt() Dim Wiazka As String Dim w As Worksheet Dim owx As Long, x As Long Dim s As Worksheet Application.ScreenUpdating = False Set w = Sheets("data_test") w.AutoFilterMode = False owx = w.Cells(w.Rows.Count, "A").End(xlUp).Row For x = 2 To owx Step 3 Wiazka = w.Cells(x, "A").Value If Not SheetExists(ActiveWorkbook, Wiazka) Then Sheets.Add(After:=Sheets(Sheets.Count)).Name = Wiazka Else Sheets(Wiazka).Cells.ClearContents End If ' 动态范围复制,无需选中工作表 w.Range("B" & x & ":C" & x).Copy Sheets(Wiazka).Range("A1") Next Set w = Nothing MsgBox "done.", vbInformation w.AutoFilterMode = False Application.ScreenUpdating = True ActiveWorkbook.Close SaveChanges:=False End Sub Function SheetExists(Wb As Workbook, ShName As String) As Boolean Dim s As Worksheet For Each s In Wb.Sheets If s.Name = ShName Then SheetExists = True Exit Function End If Next End Function
内容的提问来源于stack exchange,提问作者Piotrek
相关产品推荐
相关产品推荐

