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

我有一个在Excel中引用表的范围。 我需要创build一个图表,因此使用我的表格范围设置源数据。 我希望源数据是我的表的第一行和最后两行(标题和总共2行)。 假设范围是用variables形成的,是否有select任何给定范围的那些部分的方法(假定范围由三行或更多行组成)。 这是我的代码到目前为止:

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 

逻辑是find第一行第一列总行 总列数,然后推导出你想要的范围。 让我用一个例子来解释一下。 我已经评论了代码,以便您不应该有任何理解它的问题。

 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 ie $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 

编辑

所以上面的代码减去debugging语句和适当的variables声明可以写成

 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