2017-02-17 2 views
0

私はいくつかのシンプルなVBAコードを書いて、Excelドキュメントの多くの時系列チャートのx軸を更新しました。ループの最初の繰り返し後に入力ボックスの変数がnullに切り替わるのはなぜですか?

私が抱えている問題は、ループの最初の反復の後で、start_dateとend_date変数が ""になることです。なぜ変数が消えているのか分かりません。マクロは最初のグラフでは機能しますが、可変の問題のためにそれ以降はクラッシュします。

Sub xaxis_reset() 

Dim start_date As Variant 
Dim end_date As Variant 
Dim ws As Integer 
Dim obj As Integer 

start_date = InputBox("Start Date") 
end_date = InputBox("End Date") 
ws = ActiveWorkbook.Worksheets.Count - 2 

     For w = 1 To ws 
      obj = Worksheets(w).ChartObjects.Count 
       For Z = 1 To obj 
        Worksheets(w).ChartObjects(Z).Activate 
         With ActiveChart 
           .Axes(xlCategory).MinimumScale = start_date 
           .Axes(xlCategory).MaximumScale = end_date 
         End With 

       Next Z 
     Next w 

End Sub 

+0

どのようにマクロを呼び出しますか? wとZは定義されていません。この問題は、チャートのアクティブ化によって発生する可能性があります。 –

+0

@VincentG私はチャートのアクティブ化を取り除こうとしましたが、私はまだ同じ問題を抱えています。私の結論は、これは優れたバグです。私が実行しているとき、コードは無作為に終了します。私はコードをステップ実行している間は閉じていますが、コードがクラッシュしたときに閉じ、「デバッグ」または「終了」をクリックします。何らかの理由で、Excelは本当に上記のコードを嫌う。 – Jarom

+0

なぜチャートをアクティブにしてから軸を設定するのですか?あなたは単に "With Worksheets(w).ChartObjects(Z)"と言うことができます。あなたの変数をリセットする必要があるものは何も見ていません。あなたは彼らがループ内でリセットされていると確信していますか? –

答えて

1

すべての変数(w、z)を宣言するのとは別に、値を軸の制限にどのように渡すかについて精通する必要があります。入力ボックスは日付を文字列として提供します。 start_dateend_dateの値は ""になりませんが、何らかの理由で文字列が最初にループを介して正しく解釈されるだけです。何らかの理由で文字列をグラフ軸に渡すと、Excelが著しく不安定になります。

以下のコードでは、これらを実際の日付に変換し、これらをチャートに渡すためにDateValue()を使用します。

Sub xaxis_reset() 
    Dim start_date As Variant 
    Dim end_date As Variant 
    Dim w As Long, ws As Long 
    Dim z As Long, obj As Long 

    start_date = InputBox("Start Date") 
    end_date = InputBox("End Date") 
    ws = ActiveWorkbook.Worksheets.Count - 2 

    For w = 1 To ws 
    obj = Worksheets(w).ChartObjects.Count 
    For z = 1 To obj 
     Worksheets(w).ChartObjects(z).Activate 
     With ActiveChart 
     .Axes(xlCategory).MinimumScale = DateValue(start_date) 
     .Axes(xlCategory).MaximumScale = DateValue(end_date) 
     End With 
    Next z 
    Next w 
End Sub 
+0

これは完全に機能します。それは非常に興味深いことです。文字列をグラフの軸に通すと、そのようにクラッシュするようになります。私がしなければならないような入力のデータ時間については考えていませんでした。ありがとうございました。 – Jarom

+0

私はこの特別なケースには驚いていません。Excelのチャートは入力に関する話題です。私はExcelのクラッシュについてもそれほど驚いてはいません。なぜなら、Excel 2013と特に2016は、2007年と2010年よりずっと多くクラッシュするように見えるからです。 –

1

が、私は少しあなたのコード(下記参照)を調整してきましたありがとう、そして、Excelがプロパティを設定する方法のバグ(ではないように思わ:

この

は私のコードです常に、しかし頻繁にそれらを他の値に設定するために使用される変数を変更する)。回避策(以下のコードで使用)は、バッファ変数を使用することです。

Sub xaxis_reset() 

    Dim start_date As Variant, start_buffer As Variant 
    Dim end_date As Variant, end_buffer As Variant 
    Dim w As Integer 
    Dim obj As ChartObject 

    While Not IsDate(start_date): start_date = InputBox("Start Date"): Wend 
    While Not IsDate(end_date): end_date = InputBox("End Date"): Wend 

    On Error Resume Next 
    For w = 1 To ActiveWorkbook.Worksheets.Count - 2 
     For Each obj In ActiveWorkbook.Worksheets(w).ChartObjects 
      start_buffer = start_date: end_buffer = end_date 
      Debug.Print w, start_date, end_date, start_buffer, end_buffer, (start_date = start_buffer), (end_date = end_buffer) 
      obj.Chart.Axes(xlCategory).MinimumScale = start_buffer 
      Debug.Print w, start_date, end_date, start_buffer, end_buffer, (start_date = start_buffer), (end_date = end_buffer) 
      obj.Chart.Axes(xlCategory).MaximumScale = end_buffer 
      Debug.Print w, start_date, end_date, start_buffer, end_buffer, (start_date = start_buffer), (end_date = end_buffer) 
     Next obj 
     Set obj = Nothing 
    Next w 
End Sub 
+0

3つのdebug.printはすべて同じものを表示する必要がありますが、そうでないことがよくあります。 –

+0

コードをありがとう!私の卓越性は、私がそれを実行するときにはまだ止まっています。しかし、私は新しいエラーを受けてきました。今私が何かをしようとすると、「Out of Memory」ダイアログボックスが表示されます。だから今私は新しい方向を見ることができます。変数が壊れる原因となっているメモリ上の問題の一種でなければなりません。 – Jarom

関連する問題