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
"子类型" 的对象.例如,一个人如何辨别将对象的"亚型" rng
和rng2
,不检查的代码?即,在运行时获取此类信息.
(问题3)"子类型"是否有规范词?
它们都是相同的类或对象类型(范围对象).
范围对象是其他"事物"的集合,可以是单元格,行或列等.这些中的每一个都是范围对象.
例如,给定范围R:
R.cells是一个范围对象,由所有单元格(也是范围对象)构成,即{cell1,cell2,cell3,...}
R.rows是由所有行(也是范围对象)组成的范围对象,即{row1,row2,row3,...} - >(类似地,row1是范围对象,由所有单元组成,即{row1Cell1,row1Cell2 ,...})
选择等同于selection.cells,因此在您的示例中,rng等效于rng2.
再次,
行,单元格,列都是范围对象,因此它们都具有相同的属性/方法.获得不同计数的原因不是因为它们是具有不同属性/方法的不同类型的对象.它们是相同类型的对象,但不是等价的,因此某些属性可能不同.
要查看完整列表或道具+方法,请参阅此处.
在这个意义上,子类型不是正确的单词.您的示例都是相同的类型,没有子类型.它们的含义并不相同.要测试"等价"(在您寻求的意义上),您可以循环遍历范围对象中的每个对象,并递归测试每个对象的相等性(比较地址字符串),直到您到达计数为零的范围对象,见下文:
'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)
同样,在这个意义上,没有一个子类型的概念,只是同一个类的单独的,非等价的实例.但是,我认为继承可能是你正在寻找的术语.
" 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
.从中你必须推断出有什么不同.
归档时间: |
|
查看次数: |
1750 次 |
最近记录: |