ExcelのVBAのとある本を読んでまして、サンプルが動かないのでチョット考えました。「正しく動作するコード」を使いその通りやったら結果表示される数字はひとまず「正解」なんですが、範囲を示す「A1:A5」などの数字を変えてみたんですが、どうもうまくいかないのであります。単純に循環2回して、最初の範囲を加算しているだけ、という具合に爺には見えました。
どこかに、ケアレスミスか、使っているExcelバージョンの違いによるものか、齟齬があるみたいです。ちなみに、爺の環境は、Win10(64)+Excel2007 です。
この「本」のSampleのVBA、これで2回目のエラー発生でありました。
前回はこの↓
<Areasに「配列添字」を使い、Areas(i)にすると範囲を特定して値を得ることができるみたい>
「本」のSampleで「正しく動作するコード」として掲載されていたのには循環参照内の行数を得る場面で「Target.Areas.Rows.Count」となっていました。「For~Next]循環しているのに何番目の範囲に注目しているか漏れているのではないかと想像し、下のようにしてみました。
Sub totalRowsOnAreas() '複数範囲に含まれる「行数」を求める。ただし、個別エリア行数の合計で、各々の重複分があったときの減算はしない Dim Target As Range 'Target を Range の変数として宣言 Dim num As Long Dim i As Long Set Target = Range("A1:A5, C11:C17, E19:F20") 'Targetに具体的な範囲を割り当てる 'For Next の間で循環↓ For i = 1 To Target.Areas.Count 'AreasでTarget内の範囲がいくつあるか得る num = num + Target.Areas(i).Rows.Count Debug.Print i, Target.Areas(i).Rows.Count, num & vbCr Next i 'For Next の間で循環↑ Debug.Print "END" & vbCr End Sub
「イミディエイト・ウィンドウ」に途中経過を含め表示するよう、「Debug.Print」を使いました。
<各エリアの単純合計だけでないときはどうするんだろう…。>
今回の範囲は、Areas(1)はA1:A5の5行、Areas(2)はC11:C17の7行、Areas(3)はE19:F20の2行で、合計14行が答えです。これよりほかに、範囲が一部重なるように設定して動かしてみました。結果は、各エリアの単純合計でした(当たり前ですが)。
事前に重複範囲があるかないか、などをチェックするにはどうしたら良いのでしょう…など思案投げ首のふりをする爺でありました。