[英]Why does For Each over Range.Columns(1) not iterate over cells?
[英]For Each loop does not look at individual cells for Range.Columns
我有一個函數,它傳遞一系列和兩個范圍作為參數:
Call settInnISerie(.SeriesCollection("Toppsuging"), r, langsone.Columns(2))
Sub settInnISerie(srs As Series, xverdier As Range, yverdier As Range)
Dim c As Range
Dim i As Long
srs.XValues = xverdier
srs.Values = yverdier
i = 1
srs.ApplyDataLabels
For Each c In yverdier.Offset(0, -1)
If Not IsError(c) And i <= srs.Points.Count Then
srs.Points(i).DataLabel.Text = "=" & Replace(c.Address(external:=True), "[" & ThisWorkbook.Name & "]", "", 1, -1, vbTextCompare)
End If
i = i + 1
Next c
End Sub
但是,我在if語句中的行上出現錯誤,抱怨對象'Point'的“Method'DataLabel'失敗了”。
試圖追查錯誤,我嘗試打印出在環路中使用的每個對象的值,並且發現,而不是循環在范圍從由一個抵消內每個小區yverdier
如我所料, c
引用在第一整列直通。
通常當我使用類似的構造時情況並非如此,為什么foreach
-loop在這種情況下表現不同? 解決問題的最簡單方法是什么?
顯然我可以for i = 1 to c.rows.count...
但我很困惑,對我來說VBA的奇怪行為。
我認為這是預期的行為。
您將yverdier
定義為langsone.Columns(2)
,這意味着yverdier
是Range
類型的集合,集合中有一列(多個單元格)。 我認為你的解釋是yverdier
是由langsone.Columns(2)
中的單元格組成的單一范圍,但兩者之間存在細微差別。
因此,您的For...Each
Range
For...Each
循環將迭代集合中的每個列(單個列)而不是Cells
。 如果編碼,我認為你會得到你的欲望行為:
For Each c In yverdier.Offset(0, -1).Cells
這個示例代碼和調試輸出顯示了我在實踐中的意思 - 只需創建一個空白工作簿並將此代碼放在一個Module
:
Option Explicit
Sub Test()
Dim rngSource As Range
Dim rng As Range
Set rngSource = Sheet1.Range("A1:D3")
Debug.Print "Columns:"
For Each rng In rngSource.Columns
Debug.Print rng.Address
Next rng
Debug.Print "Rows:"
For Each rng In rngSource.Rows
Debug.Print rng.Address
Next rng
Debug.Print "Cells:"
For Each rng In rngSource.Cells
Debug.Print rng.Address
Next rng
Debug.Print "No property:"
For Each rng In rngSource
Debug.Print rng.Address
Next rng
End Sub
這將給出一個輸出:
Columns:
$A$1:$A$3
$B$1:$B$3
$C$1:$C$3
$D$1:$D$3
Rows:
$A$1:$D$1
$A$2:$D$2
$A$3:$D$3
Cells:
$A$1
$B$1
$C$1
$D$1
$A$2
$B$2
$C$2
$D$2
$A$3
$B$3
$C$3
$D$3
No property:
$A$1
$B$1
$C$1
$D$1
$A$2
$B$2
$C$2
$D$2
$A$3
$B$3
$C$3
$D$3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.