`Range`,`Range.Cells`,`Range.Rows`等之间的区别,"子类型"

san*_*ica -5 excel vba excel-vba cells

编辑:Sub dump_range下面显示地址没有完全定义一个Range(就其内容而言操作而言),我发现令人惊讶的事情,并且在MS文档中没有明确说明.还有别的东西,一个"子类型".似乎人们不能查询"子类型",而只能间接地通过Count.这一点的实际意义在于,如果一个人定义一个Sub(或Function)将一个Range参数作为一个参数,那么我们应该记住这一点来编写代码Sub(我本人没有做的事情)以避免潜在的错误.

对此问题予以引发这样的回答遍历`Cells`在`Range`

在代码中

Dim rng As Range, rng2 As Range, rng3 As Range
Set rng = Selection
Set rng2 = rng.Cells
Set rng3 = rng.Rows
Run Code Online (Sandbox Code Playgroud)

(问题1)什么是对象之间的差异rng,rng2等等?

我并不是说只用文字解释它,而是在规范哪些方法/属性和结果可用于每个,并弥补"子类型"之间的差异.应该有一些,因为VBA对它们的工作方式不同.但我没有找到规范.实际上,Range.Cells属性的Excel帮助让我很困惑:" 返回一个Range对象,它表示指定范围内的单元格. "它在我看来它应该返回与调用者相同的对象.权威文档的链接将支持解释.

通过使用可以看出对象之间存在一些差异

Call dump_range(rng)   ' -> Range $A$1:$B$6, count = 12
Call dump_range(rng2)  ' -> Range $A$1:$B$6, count = 12
Call dump_range(rng3)  ' -> Range $A$1:$B$6, count = 6
Run Code Online (Sandbox Code Playgroud)

Sub dump_range(ByRef rng As Range)
    Debug.Print "Range " & rng.Address & ", count = " & rng.Count
End Sub
Run Code Online (Sandbox Code Playgroud)

(问题2)我也想知道是否可以测试一个Range"子类型" 的对象.例如,一个人如何辨别将对象的"亚型" rngrng2,不检查的代码?即,在运行时获取此类信息.

(问题3)"子类型"是否有规范词?

Ang*_*yes 9

问题1)

它们都是相同的类或对象类型(范围对象).

范围对象是其他"事物"的集合,可以是单元格,行或列等.这些中的每一个都是范围对象.

例如,给定范围R:

R.cells是一个范围对象,由所有单元格(也是范围对象)构成,即{cell1,cell2,cell3,...}

R.rows是由所有行(也是范围对象)组成的范围对象,即{row1,row2,row3,...} - >(类似地,row1是范围对象,由所有单元组成,即{row1Cell1,row1Cell2 ,...})

选择等同于selection.cells,因此在您的示例中,rng等效于rng2.

再次,

行,单元格,列都是范围对象,因此它们都具有相同的属性/方法.获得不同计数的原因不是因为它们是具有不同属性/方法的不同类型的对象.它们是相同类型的对象,但不是等价的,因此某些属性可能不同.

要查看完整列表或道具+方法,请参阅此处.

问题2)

在这个意义上,子类型不是正确的单词.您的示例都是相同的类型,没有子类型.它们的含义并不相同.要测试"等价"(在您寻求的意义上),您可以循环遍历范围对象中的每个对象,并递归测试每个对象的相等性(比较地址字符串),直到您到达计数为零的范围对象,见下文:

 'should return "Rows"
 getRangeType(selection.Rows) 

 Function getRangeType(inputRange As Range) As String

      If (testRangeEquality(inputRange, inputRange.Rows)) Then
        getRangeType = "Rows"
      Exit Function
      End If

      If (testRangeEquality(inputRange, inputRange.columns)) Then
           getRangeType = "Columns"
           Exit Function
      End If

      If (testRangeEquality(inputRange, inputRange.Cells)) Then
          getRangeType = "Cells"
          Exit Function
      End If

 End Function


 Function testRangeLevelEquality(range1 As Range, range2 As Range) As Boolean

      If (range1.Count <> range2.Count) Then
          testRangeLevelEquality = False
          Exit Function
      End If

      IsEqual = True

      For i = 1 To range1.Count
           If (range1(i).Address <> range2(i).Address) Then
                IsEqual = False
           End If
      Next i

      testRangeLevelEquality = IsEqual

 End Function


 Function testRangeEquality(range1 As Range, range2 As Range) As Boolean

      Equality = True

      If (testRangeLevelEquality(range1, range2)) Then

           If (range1.Count = 1) Then

                Equality = True

           Else

               For i = 1 To range1.Count
                   If (testRangeEquality(range1(i), range2(i)) = False) Then
                       Equality = False
                       Exit For
                   End If
               Next i

           End If

      Else

           Equality = False

      End If

      testRangeEquality = Equality

 End Function
Run Code Online (Sandbox Code Playgroud)

问题3)

同样,在这个意义上,没有一个子类型的概念,只是同一个类的单独的,非等价的实例.但是,我认为继承可能是你正在寻找的术语.


Sid*_*out 6

" Sancho "和" Sancho.Hand "有什么区别

在此输入图像描述


我为什么采取这种方法?

人们已经尝试过上面解释,但似乎你无法理解他们在说什么,所以我将使用不同的技术.:)这基本上是"天使之眼"在他的回答中也说过的.


好的解释

如果你以一种方式看待它,那就没有区别了.两者都有骨头,肌肉,血液穿过它们,可能有头发(除非你打蜡!)

另一方面,是的,存在差异." Sancho "是所有身体部位的集合,如"手","鼻子","眼睛"等等.所以绝对是"手"<>"完整的身体"

类似地,Rng(Sancho)和Rng.Rows(Sancho.Hand)是相同的,但他们是不同的!

因此,两者都将有.Value,.Address,.Count在他们的处置性质.但这些属性返回的值可能相同也可能不同.

你想要的是一个不正确的比较.你可以比较

.Address to .Address
.Count to .Count
.Value To .Value '<~~ Only possible with single cell range objects
Run Code Online (Sandbox Code Playgroud)

rng并且rng2是范围对象.有差异,当谈到Type.它们将具有相同的属性(非值)


寻找权威文档?

你找不到一个权威的文件What is the difference between "Sancho" and "Sancho.Hand",呃,我的意思是What is the difference between "rng" and "rng.Cells"因为它是纯粹的常识.你可能会发现什么是关于什么rng或是什么的文章rng.Cells.从中你必须推断出有什么不同.

  • 嘿,我不是秃头! (2认同)