こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Excel VBA With ~ End With

Excel VBA With ~ End Withを使わずに記述するには

Sheet1シートのセルA1,A2,B1,B2にA,B,75,25の値を入力して、

Sub test1()
 With ThisWorkbook.Worksheets("Sheet1").Shapes.AddChart.Chart
  .ChartType = xlBarStacked100
  .SetSourceData Source:=Sheets("Sheet1").Range("A1:B2"), PlotBy:=xlRows
 End With
End Sub

を実行すると横棒グラフが1個表示されますが、
これを、With ~ End Withを使わずに記述すると

Sub test2()
 ThisWorkbook.Worksheets("Sheet1").Shapes.AddChart.Chart.ChartType = xlBarStacked100
 ThisWorkbook.Worksheets("Sheet1").Shapes.AddChart.Chart.SetSourceData Source:=Sheets("Sheet1").Range("A1:B2"), PlotBy:=xlRows
End Sub


というようになると思いますが、
実行すると縦棒が2個表示されてしまって同じ結果になりません。
なぜなのでしょうか。

test1を、With ~ End Withを使わずに記述するには、
どのように記述すればよいのでしょうか。

よろしくお願いします。(Windows10,Excel2016)

投稿日時 - 2019-05-06 15:46:24

QNo.9614139

困ってます

質問者が選んだベストアンサー

>実行すると縦棒が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

投稿日時 - 2019-05-06 17:42:28

お礼

単純に.の部分をWithに続くコードで置き換えるだけではだめなのですね。
test1とtest2の結果が一致しない理由とその対処方法がよく理解できました。
とても分かりやすい説明ありがとうございました。

投稿日時 - 2019-05-07 09:14:01

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

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

投稿日時 - 2019-05-06 16:13:51

お礼

TEST1とTEST2は一見同じ処理のように見えるのですがそうではないのですね。
教えていただきましたコードで
TEST1と同じように表示されるようになりました。
ありがとうございました。

投稿日時 - 2019-05-07 09:13:24

あなたにオススメの質問