Excel VBA动态范围
我希望改进我的代码,在数据存在的地方动态设置范围,而不是硬编码值。范围的起始值永远不会更改,但如果添加更多的月份列,则结束值将更改。最好的方法是什么。让范围由用户定义会更容易吗 以下是我所拥有的: 代码将按从C5开始的唯一组名将数据拆分为单独的工作表Excel VBA动态范围,vba,excel,Vba,Excel,我希望改进我的代码,在数据存在的地方动态设置范围,而不是硬编码值。范围的起始值永远不会更改,但如果添加更多的月份列,则结束值将更改。最好的方法是什么。让范围由用户定义会更容易吗 以下是我所拥有的: 代码将按从C5开始的唯一组名将数据拆分为单独的工作表 Public Sub Splitdatatosheets() ' Splitdatatosheets Macro Dim Rng As Range Dim Rng1 As Range Dim vrb As Boolean Dim sht As Wo
Public Sub Splitdatatosheets()
' Splitdatatosheets Macro
Dim Rng As Range
Dim Rng1 As Range
Dim vrb As Boolean
Dim sht As Worksheet
'Find unique value for splitting
Set Rng = Sheets("Sheet1").Range("C5")
'Find starting row to copy (Re-code to dynamically set)
Set Rng1 = Sheets("Sheet1").Range("A5:M5")
vrb = False
Do While Rng <> ""
For Each sht In Worksheets
If sht.Name = Left(Rng.Value, 31) Then
sht.Select
Range("A2").Select
Do While Selection <> ""
ActiveCell.Offset(1, 0).Activate
Loop
Rng1.Copy ActiveCell
ActiveCell.Offset(1, 0).Activate
Set Rng1 = Rng1.Offset(1, 0)
Set Rng = Rng.Offset(1, 0)
vrb = True
End If
Next sht
If vrb = False Then
Sheets.Add After:=Sheets(Sheets.Count)
ActiveSheet.Name = Left(Rng.Value, 31)
'Copy header rows (Re-code to dynamically set) to new worksheet first cell
Sheets("Sheet1").Range("A4:M4").Copy ActiveSheet.Range("A1")
Range("A2").Select
Do While Selection <> ""
ActiveCell.Offset(1, 0).Activate
Loop
Rng1.Copy ActiveCell
Set Rng1 = Rng1.Offset(1, 0)
Set Rng = Rng.Offset(1, 0)
End If
vrb = False
Loop
End Sub
Public Sub-Splitdatatosheets()
'Splitdatatosheets宏
变暗Rng As范围
变暗Rng1 As范围
作为布尔值的Dim-vrb
将sht变暗为工作表
'查找用于拆分的唯一值
设置Rng=板材(“板材1”)。范围(“C5”)
'查找要复制的起始行(重新编码以动态设置)
设置Rng1=板材(“板材1”)。范围(“A5:M5”)
vrb=错误
在Rng“”时执行
对于工作表中的每个sht
如果sht.Name=Left(Rng.Value,31),则
快速选择
范围(“A2”)。选择
选择“”时执行此操作
ActiveCell.Offset(1,0).激活
环
复制ActiveCell
ActiveCell.Offset(1,0).激活
设置Rng1=Rng1。偏移量(1,0)
设置Rng=Rng偏移量(1,0)
vrb=真
如果结束
下一步
如果vrb=False,则
Sheets.Add After:=工作表(Sheets.Count)
ActiveSheet.Name=Left(Rng.Value,31)
'将标题行(重新编码以动态设置)复制到新的工作表第一个单元格
纸张(“纸张1”)。范围(“A4:M4”)。复制活动纸张。范围(“A1”)
范围(“A2”)。选择
选择“”时执行此操作
ActiveCell.Offset(1,0).激活
环
复制ActiveCell
设置Rng1=Rng1。偏移量(1,0)
设置Rng=Rng偏移量(1,0)
如果结束
vrb=错误
环
端接头
以下是为偶然发现此问题的任何人更新的代码
Public Sub Splitdatatosheets()
' Splitdatatosheets Macro
Dim rng As Range
Dim Rng1 As Range
Dim Rng2 As Range
Dim vrb As Boolean
Dim sht As Worksheet
Dim R_Start, R_End, H_Start, H_End As Range
'Set Header
Set H_Start = Cells(4, 1)
Set H_End = H_Start.End(xlToRight)
'Set Data range
Set R_Start = Cells(5, 1)
Set R_End = R_Start.End(xlToRight)
'Find unique value for splitting
Set rng = Sheets("Sheet1").Range("C5")
'Find starting row to copy
Set Rng1 = Range(R_Start, R_End)
Set Rng2 = Range(H_Start, H_End)
vrb = False
Do While rng <> ""
For Each sht In Worksheets
If sht.Name = Left(rng.Value, 31) Then
sht.Select
Range("A2").Select
Do While Selection <> ""
ActiveCell.Offset(1, 0).Activate
Loop
Rng1.Copy ActiveCell
ActiveCell.Offset(1, 0).Activate
Set Rng1 = Rng1.Offset(1, 0)
Set rng = rng.Offset(1, 0)
vrb = True
End If
Next sht
If vrb = False Then
Sheets.Add After:=Sheets(Sheets.Count)
ActiveSheet.Name = Left(rng.Value, 31)
'Copy header rows to new worksheet first cell
Rng2.Copy ActiveSheet.Range("A1")
Range("A2").Select
Rng1.Copy ActiveCell
Set Rng1 = Rng1.Offset(1, 0)
Set rng = rng.Offset(1, 0)
End If
vrb = False
Loop
End Sub
Public Sub-Splitdatatosheets()
'Splitdatatosheets宏
变暗rng As范围
变暗Rng1 As范围
变暗Rng2 As范围
作为布尔值的Dim-vrb
将sht变暗为工作表
调暗R_起点、R_终点、H_起点、H_终点作为范围
'设置标题
设置H_开始=单元格(4,1)
设置H_End=H_Start.End(xlToRight)
'设置数据范围
设置R_开始=单元格(5,1)
设置R_End=R_Start.End(xlToRight)
'查找用于拆分的唯一值
设置rng=板材(“板材1”)。范围(“C5”)
'查找要复制的起始行
设置Rng1=范围(R_开始,R_结束)
设置Rng2=范围(H_开始,H_结束)
vrb=错误
在rng“”时执行
对于工作表中的每个sht
如果sht.Name=Left(rng.Value,31),则
快速选择
范围(“A2”)。选择
选择“”时执行此操作
ActiveCell.Offset(1,0).激活
环
复制ActiveCell
ActiveCell.Offset(1,0).激活
设置Rng1=Rng1。偏移量(1,0)
设置rng=rng偏移量(1,0)
vrb=真
如果结束
下一步
如果vrb=False,则
Sheets.Add After:=工作表(Sheets.Count)
ActiveSheet.Name=Left(rng.Value,31)
'将标题行复制到新工作表的第一个单元格
Rng2.复制ActiveSheet.范围(“A1”)
范围(“A2”)。选择
复制ActiveCell
设置Rng1=Rng1。偏移量(1,0)
设置rng=rng偏移量(1,0)
如果结束
vrb=错误
环
端接头
这是为偶然发现这个问题的人更新的代码
Public Sub Splitdatatosheets()
' Splitdatatosheets Macro
Dim rng As Range
Dim Rng1 As Range
Dim Rng2 As Range
Dim vrb As Boolean
Dim sht As Worksheet
Dim R_Start, R_End, H_Start, H_End As Range
'Set Header
Set H_Start = Cells(4, 1)
Set H_End = H_Start.End(xlToRight)
'Set Data range
Set R_Start = Cells(5, 1)
Set R_End = R_Start.End(xlToRight)
'Find unique value for splitting
Set rng = Sheets("Sheet1").Range("C5")
'Find starting row to copy
Set Rng1 = Range(R_Start, R_End)
Set Rng2 = Range(H_Start, H_End)
vrb = False
Do While rng <> ""
For Each sht In Worksheets
If sht.Name = Left(rng.Value, 31) Then
sht.Select
Range("A2").Select
Do While Selection <> ""
ActiveCell.Offset(1, 0).Activate
Loop
Rng1.Copy ActiveCell
ActiveCell.Offset(1, 0).Activate
Set Rng1 = Rng1.Offset(1, 0)
Set rng = rng.Offset(1, 0)
vrb = True
End If
Next sht
If vrb = False Then
Sheets.Add After:=Sheets(Sheets.Count)
ActiveSheet.Name = Left(rng.Value, 31)
'Copy header rows to new worksheet first cell
Rng2.Copy ActiveSheet.Range("A1")
Range("A2").Select
Rng1.Copy ActiveCell
Set Rng1 = Rng1.Offset(1, 0)
Set rng = rng.Offset(1, 0)
End If
vrb = False
Loop
End Sub
Public Sub-Splitdatatosheets()
'Splitdatatosheets宏
变暗rng As范围
变暗Rng1 As范围
变暗Rng2 As范围
作为布尔值的Dim-vrb
将sht变暗为工作表
调暗R_起点、R_终点、H_起点、H_终点作为范围
'设置标题
设置H_开始=单元格(4,1)
设置H_End=H_Start.End(xlToRight)
'设置数据范围
设置R_开始=单元格(5,1)
设置R_End=R_Start.End(xlToRight)
'查找用于拆分的唯一值
设置rng=板材(“板材1”)。范围(“C5”)
'查找要复制的起始行
设置Rng1=范围(R_开始,R_结束)
设置Rng2=范围(H_开始,H_结束)
vrb=错误
在rng“”时执行
对于工作表中的每个sht
如果sht.Name=Left(rng.Value,31),则
快速选择
范围(“A2”)。选择
选择“”时执行此操作
ActiveCell.Offset(1,0).激活
环
复制ActiveCell
ActiveCell.Offset(1,0).激活
设置Rng1=Rng1。偏移量(1,0)
设置rng=rng偏移量(1,0)
vrb=真
如果结束
下一步
如果vrb=False,则
Sheets.Add After:=工作表(Sheets.Count)
ActiveSheet.Name=Left(rng.Value,31)
'将标题行复制到新工作表的第一个单元格
Rng2.复制ActiveSheet.范围(“A1”)
范围(“A2”)。选择
复制ActiveCell
设置Rng1=Rng1。偏移量(1,0)
设置rng=rng偏移量(1,0)
如果结束
vrb=错误
环
端接头
您在谷歌上搜索过没有引号的“vba查找最后一行”吗?当你不知道如何开始某件事时,这通常是一个好的开始。FWIW,我使用这种方法:(这是许多方法中的一种…)这在选择“ActiveCell.Offset(1,0)。Activate Loop”(激活循环)时不会做任何事情。请检查此方法,谢谢您提供的链接,我能够找到它。很简单!你有没有用谷歌搜索“vba查找最后一行”而不加引号?当你不知道如何开始某件事时,这通常是一个好的开始。FWIW,我使用这种方法:(这是许多方法中的一种…)这在选择“ActiveCell.Offset(1,0)。Activate Loop”(激活循环)时不会做任何事情。请检查此方法,谢谢您提供的链接,我能够找到它。很简单!