• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excel VBA With ~ End With)

Excel VBAのWith ~ End Withの使い方とその代替方法

このQ&Aのポイント
  • Excel VBAのWith ~ End Withを使わずに記述する方法について説明します。
  • With ~ End Withを使わずに記述すると、同じ結果が得られず、縦棒が2個表示されてしまいます。
  • 代替方法として、ThisWorkbook.Worksheetsを重複せずに使う方法があります。

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

  • ベストアンサー
  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.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

yam2012
質問者

お礼

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

その他の回答 (1)

  • emaxemax
  • ベストアンサー率35% (44/124)
回答No.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

yam2012
質問者

お礼

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