首页 > 解决方案 > 范围联合方法有问题

问题描述

使用范围联合方法在使用 vba 时遇到问题。我已经解决了,最后。但是找不到合适的解释,为什么会这样?

Set ws = ThisWorkbook.ActiveSheet
Set rng00 = Range("A1:C3")
Set rng01 = Range("F1:G3")
ws.Union(rng00,rng01).Copy 'the error giving line

当我奇怪地用下面的一条线改变了它已经开始工作了。但我记得我之前使用过范围的联合方法与 ThisWorkbook(或者可能是 Workbooks(名称))

Worksheets("Sheet1").Activate
Application.Union(rng00,rng01).Copy

标签: excelvbaunion

解决方案


Application.Union壮举。限定对象引用

您的第一个代码

Set ws = ThisWorkbook.ActiveSheet
Set rng00 = Range("A1:C3")
Set rng01 = Range("F1:G3")
ws.Union(rng00,rng01).Copy 'the error giving line

你的第二个代码

Worksheets("Sheet1").Activate
Application.Union(rng00,rng01).Copy

Application.ThisWorkbook property

  • ThisWorkbook是(参考)包含此代码的工作簿。这是一本精确的工作簿,而且只能有一本。

    Dim wb As Workbook: Set wb = ThisWorkbook
    

合格工作表

  • 在工作簿中引用工作表时,您希望对它们进行限定(注意wb.):

    Dim ws As Worksheet: Set ws = wb.Worksheets("Sheet1")
    
  • 这只能是一个工作表,即Sheet1wb- 工作簿中命名的工作表。除非您错误地引用了工作簿,否则它不可能是错误的工作表。

  • 当您这样做时Set ws = ThisWorkbook.ActiveSheet,它会创建对当前处于活动状态(已选择,您正在查看)的任何工作表(工作表、图表)的引用,但在Worksheets("Sheet1").Activate您正在激活Sheet1˛的行中ActiveWorkbook,当前处于活动状态的工作簿(可能是ThisWorkbook,但可能不会)。

合格范围

  • 引用工作表中的范围时,您希望对它们进行限定(注意ws.):

    Dim rg1 As Range: Set rg1 = ws.Range("A1:C3")
    Dim rg2 As Range: Set rg2 = ws.Range("F1:G3")
    
  • 这些是ws- 工作表中的范围。除非您错误地引用了工作表,否则它们不会是错误的。

  • 当您这样做时,您正在创建对(可能是工作表,可能是图表)、(可能是,但可能不是)Set rng00 = Range("A1:C3"): Set rng01 = Range("F1:G3")范围的引用。只有在您的was和 your was以.ActiveSheetActiveWorkbookThisWorkbookActiveWorkbookThisWorkbookActiveSheetSheet1ActiveWorkbook

Application.Union method

  • 它的“全名”说明了一切:它是Application对象的成员,而不是Worksheet对象。Application.您可以从某些Application对象成员中省略部分:Union是这样的成员。

    Union(rng1, rng2).Copy
    

全部一起

Option Explicit

Sub CopyRange()
    Dim wb As Workbook: Set wb = ThisWorkbook
    Dim ws As Worksheet: Set ws = wb.Worksheets("Sheet1")
    Dim rg1 As Range: Set rg1 = ws.Range("A1:C3")
    Dim rg2 As Range: Set rg2 = ws.Range("F1:G3")
    Union(rng1, rng2).Copy
End Sub
  • 当然,如果工作Sheet1簿中没有命名的工作表,就会出现错误。但那是另一回事了。

推荐阅读