2017-11-15 6 views
0

異なる条件に基づいていくつかの列を削除しようとしています。これらの列セットには、テーブルの下にそれぞれのチャートがあります。コードを行ごとに実行すると完全に機能しますが、完全なコードを実行するとテーブルでうまく動作しますが、その下のグラフはまったく削除されません。ExcelのVBAで特定の列を削除しているときにグラフを削除できません

source file

If oper(j) = "ABC" Then 

    wtemp.Sheets("Graphs").Range("A:H, Q:AF").Delete 

     ElseIf oper(j) = "XYZ" Then 

       wtemp.Sheets("Graphs").Range("A:P, Y:AF").Delete 

        ElseIf oper(j) = "KHG" Then 

          wtemp.Sheets("Graphs").Range("A:X").Delete 

        Else 

        wtemp.Sheets("Graphs").Range("I:AF").Delete 

End If 
+0

Excelのグラフがオブジェクトである、彼らはセルの内容ではありません。それらを '.Charts'コレクションから削除します。 – AlexP

+0

何も起こっていないかのようにチャートがそのまま表示されるのですか、移動/サイズ変更されますか?それらがそのまま残っている場合は、「移動しないでサイズを変更する」オプションがあります。彼らが動いてばかげて小さくなると、あなたが削除する列よりも大きいだけです。 – Excelosaurus

+0

@AlexPはい。それらは.chartsから削除することができますが、私の場合は、他の範囲の削除後にそれらの上のテーブルで移動することを望みます。また、私は行ごとにそれを実行すると、すべてがうまく動作している理由も私は不思議です。 –

答えて

0

A ChartObjectPlacementプロパティは、その下にあるセルに取り付けられている方法を制御します。 XlPlacement Enumerationを参照してください。残りのチャートオブジェクト(完全に削除された列が削除された後)は、おそらくPlacement = xlFreeFloatingです。

ここでは、このような状況を処理するためのサブステップを示します。最初にPlacementの値をバッファしてから列の削除を実行し、元のPlacementの値を再設定します。

Public Sub DeleteColumnsAndCharts(ByVal pColumnsToDelete As Excel.Range) 
    On Error GoTo errHandler 

    Dim PlacementByChartName As Object 'Scripting.Dictionary 
    Dim chartsWorksheet As Excel.Worksheet 
    Dim chart As Excel.ChartObject 

    Set PlacementByChartName = CreateObject("Scripting.Dictionary") 
    Set chartsWorksheet = pColumnsToDelete.Worksheet 

    'Keep the original Placement values before changing them. 
    For Each chart In chartsWorksheet.ChartObjects 
     PlacementByChartName(chart.Name) = chart.Placement 
     chart.Placement = xlMoveAndSize 
    Next 

    'Should the Delete method below fail, the Recover section will leave the worksheet intact. 
    pColumnsToDelete.EntireColumn.Delete 

Recover: 
    On Error Resume Next 
    'Restore the original Placement values on the remaining chart objects. 
    For Each chart In chartsWorksheet.ChartObjects 
     chart.Placement = PlacementByChartName(chart.Name) 
    Next 
    Set chart = Nothing 
    Set chartsWorksheet = Nothing 
    Set PlacementByChartName = Nothing 
    Exit Sub 

errHandler: 
    MsgBox Err.Description, vbExclamation + vbOKOnly, "Error" 
    Resume Recover 
End Sub 

あなたはこのようにそれを呼び出すことができます。

DeleteColumnsAndCharts wtemp.Sheets("Graphs").Range("A:X") 
+0

これを調べて解決策を提供していただき、ありがとうございます。しかし、チアコードを使用した後でさえ、チャートはまったく問題ありません。最後の実行の後、私はテーブルの正しい結果を得ていますが、グラフの助けはありません。 –

+0

'Placement'プロパティを使わずに問題を再現する方法は考えられません。あなたは、コードを実行することはそれ以外の場合には効くが、これは、列削除の後に 'DoEvents'を呼び出すのが助けになるかどうか疑問に思います(あなたはループで削除しますか?)。 – Excelosaurus

+0

はい、私は外側の "それぞれの"と内側の "for"ループ内でこの削除を行っています....また、DoEventsはコードをステップ実行中にうまくいきますが、うまくいきませんでしたがDoEventsを使用しようとしましたが、 。 –