Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.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
Excel VBA动态范围_Vba_Excel - Fatal编程技术网

Excel VBA动态范围

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

我希望改进我的代码,在数据存在的地方动态设置范围,而不是硬编码值。范围的起始值永远不会更改,但如果添加更多的月份列,则结束值将更改。最好的方法是什么。让范围由用户定义会更容易吗

以下是我所拥有的:

代码将按从C5开始的唯一组名将数据拆分为单独的工作表

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”(激活循环)时不会做任何事情。请检查此方法,谢谢您提供的链接,我能够找到它。很简单!