- ベストアンサー
Excel VBAのWith ~ End Withの使い方とその代替方法
- Excel VBAのWith ~ End Withを使わずに記述する方法について説明します。
- With ~ End Withを使わずに記述すると、同じ結果が得られず、縦棒が2個表示されてしまいます。
- 代替方法として、ThisWorkbook.Worksheetsを重複せずに使う方法があります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>実行すると縦棒が2個表示されてしまって同じ結果になりません。 >なぜなのでしょうか。 With ThisWorkbook.Worksheets("Sheet1").Shapes.AddChart.Chart ↑の1行。 コードしては1行ですが、 次の2つのことを行っています。 その1 『ThisWorkbook.Worksheets("Sheet1") の Shapeたちの1つとして グラフ用のShapeを追加』 その2 『その1で追加したShapeを次行以下に渡す』 そのため Test2のコードでは、 ThisWorkbook.Worksheets("Sheet1").Shapes.AddChart.Chart が2回登場するので、 『ThisWorkbook.Worksheets("Sheet1") の Shapeたちの1つとして グラフ用のShapeを追加』 という作業が2回行われてしまうのです。 >With ~ End Withを使わずに記述するには コーディングする上で、 後々のことや別な人に引き継ぐことを考慮し 読みやすいコードにしておくことが重要です。 私だったら 変数の型を必ず宣言し 次のようなコーディングをします。 Sub test2() Dim MyShape As Shape Dim MyChart As Chart With ThisWorkbook.Worksheets("Sheet1") Set MyShape = .Shapes.AddChart2(297, xlBarStacked100) Set MyChart = MyShape.Chart MyChart.SetSourceData Source:=Range("Sheet1!A1:B2"), PlotBy:=xlRows End With End Sub 'または、 Sub test2() Dim MySheet As Worksheet Dim MyShape As Shape Dim MyChart As Chart Set MySheet = ThisWorkbook.Worksheets("Sheet1") Set MyShape = MySheet.Shapes.AddChart2(297, xlBarStacked100) Set MyChart = MyShape.Chart MyChart.SetSourceData Source:=Range("Sheet1!A1:B2"), PlotBy:=xlRows End Sub
その他の回答 (1)
- emaxemax
- ベストアンサー率35% (44/124)
TEST1とTEST2は同じ意味になりません。 With ~ End Withを使わずに記述するには Sub test3() Dim myCh Set myCh = ThisWorkbook.Worksheets("Sheet1").Shapes.AddChart.Chart myCh.ChartType = xlBarStacked100 myCh.SetSourceData Source:=Sheets("Sheet1").Range("A1:B2"), PlotBy:=xlRows End Sub
お礼
TEST1とTEST2は一見同じ処理のように見えるのですがそうではないのですね。 教えていただきましたコードで TEST1と同じように表示されるようになりました。 ありがとうございました。
お礼
単純に.の部分をWithに続くコードで置き換えるだけではだめなのですね。 test1とtest2の結果が一致しない理由とその対処方法がよく理解できました。 とても分かりやすい説明ありがとうございました。