Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.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
如何使用vba(excel)中给定范围的一部分,即范围中的某些行_Excel_Vba_Charts_Range - Fatal编程技术网

如何使用vba(excel)中给定范围的一部分,即范围中的某些行

如何使用vba(excel)中给定范围的一部分,即范围中的某些行,excel,vba,charts,range,Excel,Vba,Charts,Range,我有一个引用excel中表格的范围。 我需要创建一个图形,因此使用我的表范围设置源数据。 我希望源数据是表中的第一行和最后两行(标题和总共两行)。 假设范围是使用变量形成的,那么有没有办法选择任何给定范围的那些部分(假设范围由三行或更多行组成)。 以下是我目前的代码: Sub addchart(ByVal TableRange As Range, SheetName As Worksheet, TblLabel As String, TableLabel As String)

我有一个引用excel中表格的范围。 我需要创建一个图形,因此使用我的表范围设置源数据。 我希望源数据是表中的第一行和最后两行(标题和总共两行)。 假设范围是使用变量形成的,那么有没有办法选择任何给定范围的那些部分(假设范围由三行或更多行组成)。 以下是我目前的代码:

    Sub addchart(ByVal TableRange As Range, SheetName As Worksheet, TblLabel As String, TableLabel As String)

    Dim ChtPosition As Range
    Dim ChtRow As Long
    Dim ChtSourceData As Range

    Set ChtSourceData = Union(Top row of TableRange here, Last 2 rows of TableRange here)

    ChtRow = SheetName.Cells(SheetName.Rows.Count, "B").End(xlUp).Row + 2
    ChtPosition = SheetName.Cells(ChtRow, 2)

    SheetName.Shapes.addchart.Select
    With ActiveChart
        .SetSourceData Source:=SheetName.Range(ChtSourceData)
        .ApplyChartTemplate ("\\graphtemplatefilepath")
        .Parent.Name = "Cht" & TblLabel
    End With

    With SheetName.ChartObjects("Cht" & TblLabel)
        .Width = (16 * 29)
        .Height = (7 * 29)
        .Left = ChtPosition.Left
        .Top = ChtPosition.Top
        .Chart.ChartTitle.Characters.Text = TableLabel & " by Month"
    End With

    End Sub

逻辑是找到第一行第一列总行数总列数,然后推断出所需的范围。让我举个例子来解释一下。我已经对代码进行了注释,这样您在理解代码时就不会有任何问题

Sub Sample()
    Dim TestRange As Range
    Dim rng1 As Range, rng2 As Range, rng3 As Range, FinalRange As Range
    Dim ws As Worksheet
    Dim r As Long, c As Long

    Set ws = ThisWorkbook.Sheets("Sheet1")

    With ws
        Set TestRange = .Range("A3:B10")

        Debug.Print "Our Sample Range is " & TestRange.Address

        '~~> This will give you 8
        Debug.Print "Total Rows in the range is " & TestRange.Rows.Count

        '~~> This will give you 3 From A3
        Debug.Print "The First Row in the range is " & TestRange.Row

        '~~> This will give you 1 From A3
        Debug.Print "The First Column in the range is " & TestRange.Column

        r = TestRange.Row
        c = TestRange.Column

        '~~> This will give you 2
        Debug.Print "Total Columns in the range is " & TestRange.Columns.Count
        ColCount = TestRange.Columns.Count

        '~~> This is give you the 1st row in that range $A$3:$B$3
        Debug.Print "The First Row address is " & Range(.Cells(r, c), _
        .Cells(r, c + ColCount - 1)).Address
        Set rng1 = Range(.Cells(r, c), .Cells(r, c + ColCount - 1))

        '~~> This will give you the last row
        Debug.Print "The Last Row address is " & _
        Range(.Cells(r + TestRange.Rows.Count - 1, c), _
        .Cells(r + TestRange.Rows.Count - 1, c + ColCount - 1)).Address

        Set rng2 = Range(.Cells(r + TestRange.Rows.Count - 1, c), _
        .Cells(r + TestRange.Rows.Count - 1, c + ColCount - 1))

        '~~> This will give you the Second last row
        Debug.Print "The Second Last Row address is " & _
        Range(.Cells(r + TestRange.Rows.Count - 2, c), _
        .Cells(r + TestRange.Rows.Count - 2, c + ColCount - 1)).Address

        Set rng3 = Range(.Cells(r + TestRange.Rows.Count - 2, c), _
        .Cells(r + TestRange.Rows.Count - 2, c + ColCount - 1))

        '~~> This will give you the final range i.e $A$3:$B$3,$A$9:$B$10
        Set FinalRange = Union(rng1, rng2, rng3)
        Debug.Print "The Final Range address is " & FinalRange.Address
    End With
End Sub
当您运行上述代码时,您会在即时窗口中获得此输出

Our Sample Range is $A$3:$B$10
Total Rows in the range is 8
The First Row in the range is 3
The First Column in the range is 1
Total Columns in the range is 2
The First Row address is $A$3:$B$3
The Last Row address is $A$10:$B$10
The Second Last Row address is $A$9:$B$9
The Final Range address is $A$3:$B$3,$A$9:$B$10
编辑

因此,上面的代码减去调试语句和正确的变量声明可以写成

Sub Sample()
    Dim TestRange As Range
    Dim rng1 As Range, rng2 As Range, rng3 As Range, FinalRange As Range
    Dim ws As Worksheet
    Dim r1 As Long, c1 As Long, rCount As Long, cCount As Long

    Set ws = ThisWorkbook.Sheets("Sheet1")

    With ws
        Set TestRange = .Range("A3:B10")

        rCount = TestRange.Rows.Count
        r1 = TestRange.Row

        cCount = TestRange.Columns.Count
        c1 = TestRange.Column

        Set rng1 = Range(.Cells(r1, c1), .Cells(r1, c1 + cCount - 1))

        Set rng2 = Range(.Cells(r1 + rCount - 1, c1), _
        .Cells(r1 + rCount - 1, c1 + cCount - 1))

        Set rng3 = Range(.Cells(r1 + rCount - 2, c1), _
        .Cells(r1 + rCount - 2, c1 + cCount - 1))

        Set FinalRange = Union(rng1, rng2, rng3)

        Debug.Print "The Final Range address is " & FinalRange.Address
    End With
End Sub

悉达思,谢谢你。这段代码对我来说很有效,能得到如此快速、深思熟虑的响应真是太好了。@Fletch:很高兴能帮上忙:)