Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


11060 / 13646 ツリー ←次へ | 前へ→

【18202】変数の値について もも 04/9/17(金) 23:09 質問[未読]
【18203】Re:変数の値について かみちゃん 04/9/17(金) 23:43 回答[未読]
【18204】Re:変数の値について 禰宜 04/9/17(金) 23:44 回答[未読]
【18205】Re:変数の値について つん 04/9/17(金) 23:44 回答[未読]
【18206】Re:変数の値について もも 04/9/18(土) 0:17 お礼[未読]
【18353】Re:変数の値について もも 04/9/21(火) 20:41 質問[未読]
【18360】Re:変数の値について Kein 04/9/22(水) 5:58 回答[未読]
【18361】Re:変数の値について Kein 04/9/22(水) 6:15 回答[未読]
【18412】Re:変数の値について もも 04/9/22(水) 20:44 お礼[未読]

【18202】変数の値について
質問  もも  - 04/9/17(金) 23:09 -

引用なし
パスワード
   よろしくお願いします。

10枚のシートがあります。
その中の9枚のシートのデータから9枚のグラフシートができています。
シートの名前はばらばらですが、グラフシートは1番目、2番目で選択していきます。
データは
人名(A列)、時間(O列)、月間基準値(P列)、年間基準値(Q列)
の4つあり、O列の「時間」の値がP列の「月間基準値」の値を超えたら、「時間」を表す棒グラフの色を赤色にかえたいのですが、
以下のようなマクロだと、
変数iが2枚目のシートに移動したとき、初期値の「1」ではなくなってしまいます。
これを、シートが変わるたびに、変数iが「1」から始まるようにするには
どのようにすればよいのでしょうか?
うまく説明ができず申し訳ありませんが、
お力をお借りしたいと思います。


Sub chartsmente()

Dim mySht As Worksheet
Dim i As Integer
Dim c As Integer
  i = 1
  C = 1
 For Each mySht In Worksheets
  If mySht.Name <> "基本データ" Then
   mySht.Select

   Do While Cells(3 + i, "O").Value <> ""
    If mySht.Cells(3 + i, "O").Value > Cells(3 + i, "P").Value Then
     Charts(c).Select
     ActiveChart.SeriesCollection(1).Points(i).Select
     With Selection.Interior
      .ColorIndex = 3
     End With
    End If
    i = i + 1
   Loop
  End If
  C = C + 1
 Next
End Sub

【18203】Re:変数の値について
回答  かみちゃん  - 04/9/17(金) 23:43 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>これを、シートが変わるたびに、変数iが「1」から始まるようにするには

ということですので、これはどこでしているかというと

> For Each mySht In Worksheets
>  If mySht.Name <> "基本データ" Then
>   mySht.Select

です。
なので、
 For Each mySht In Worksheets
  If mySht.Name <> "基本データ" Then
   mySht.Select
   i = 1
とすれば、いいと思います。

【18204】Re:変数の値について
回答  禰宜  - 04/9/17(金) 23:44 -

引用なし
パスワード
   ▼もも さん:

>Sub chartsmente()
>
>Dim mySht As Worksheet
>Dim i As Integer
>Dim c As Integer
>  i = 1
>  C = 1
> For Each mySht In Worksheets
>  If mySht.Name <> "基本データ" Then
>   mySht.Select
>
>   Do While Cells(3 + i, "O").Value <> ""
>    If mySht.Cells(3 + i, "O").Value > Cells(3 + i, "P").Value Then
>     Charts(c).Select
>     ActiveChart.SeriesCollection(1).Points(i).Select
>     With Selection.Interior
>      .ColorIndex = 3
>     End With
>    End If
>    i = i + 1
>   Loop
>  End If
>  C = C + 1
> Next
>End Sub

禰宜と申します。

>シートが変わるたびに、変数iが「1」から始まるようにする

シートが変わるということは、
>For Each mySht In Worksheets でmyShtが参照する値が変わった時
ということでしょうから、
変数iの初期化をFor文の中に入れてしまえば良いのではないでしょうか。

Sub chartsmente()

Dim mySht As Worksheet
Dim i As Integer
Dim c As Integer
 C = 1
 For Each mySht In Worksheets
  i = 1
  If mySht.Name <> "基本データ" Then
   mySht.Select

   Do While Cells(3 + i, "O").Value <> ""
    If mySht.Cells(3 + i, "O").Value > Cells(3 + i, "P").Value Then
     Charts(c).Select
     ActiveChart.SeriesCollection(1).Points(i).Select
     With Selection.Interior
      .ColorIndex = 3
     End With
    End If
    i = i + 1
   Loop
  End If
  C = C + 1
 Next
End Sub

【18205】Re:変数の値について
回答  つん E-MAIL  - 04/9/17(金) 23:44 -

引用なし
パスワード
   もも さん、こんばんは


>変数iが2枚目のシートに移動したとき、初期値の「1」ではなくなってしまいます。
>これを、シートが変わるたびに、変数iが「1」から始まるようにするには
>どのようにすればよいのでしょうか?
>うまく説明ができず申し訳ありませんが、
>お力をお借りしたいと思います。
>
>
>Sub chartsmente()
>
>Dim mySht As Worksheet
>Dim i As Integer
>Dim c As Integer
>  i = 1
>  C = 1
> For Each mySht In Worksheets
>  If mySht.Name <> "基本データ" Then
>   mySht.Select
>
>   Do While Cells(3 + i, "O").Value <> ""
>    If mySht.Cells(3 + i, "O").Value > Cells(3 + i, "P").Value Then
>     Charts(c).Select
>     ActiveChart.SeriesCollection(1).Points(i).Select
>     With Selection.Interior
>      .ColorIndex = 3
>     End With
>    End If
>    i = i + 1
>   Loop
>  End If
>  C = C + 1
> Next
>End Sub

あまりしっかり見てませんが、
For Each mySht In Worksheets
の直後で、「i」の値を「1」に初期化してやればいいんじゃないですか?
そしたら、シートが変わるたびに「1」からはじまるような気がします。

【18206】Re:変数の値について
お礼  もも  - 04/9/18(土) 0:17 -

引用なし
パスワード
   かみちゃんさん、禰宜さん、つんさん、
とってもよく分かりました。

ありがとうございました。

これからもよろしくお願いいたします。m(__)m

【18353】Re:変数の値について
質問  もも  - 04/9/21(火) 20:41 -

引用なし
パスワード
   先日はありがとうございました。
みなさんが教えてくださったように、変数iの初期化をFor文の中に入れたのですが、
それだけでは、どうもうまくいきません。
いろいろためしてみて、
以下のようなマクロでうまくいったのですが、
変数cはグラフシートの番号です。
どうしてこれを「0」にしたらうまくいくのかが、
分かりません。

このブックには全部で10枚のシートがあって
その中の9枚のシートのデータから9枚のグラフシートができています。
一番初めのワークシートが「基本データ」になっています。


Sub chartsmente()

Dim mySht As Worksheet
Dim i As Integer
Dim c As Integer

  c = 0    ←変数cの初期値を「0」にしました。
 For Each mySht In Worksheets
  If mySht.Name <> "基本データ" Then
   mySht.Select
  i = 1    ←変数iの初期化をここにしました。
   Do While Cells(3 + i, "O").Value <> ""
    If mySht.Cells(3 + i, "O").Value > Cells(3 + i, "P").Value Then
     Charts(c).Select
     ActiveChart.SeriesCollection(1).Points(i).Select
     With Selection.Interior
      .ColorIndex = 3
     End With
    mySht.Select   ←これを付け加えました。
    End If
    i = i + 1
   Loop
  End If
  c = c + 1
 Next
End Sub

よろしくお願いいたします。

【18360】Re:変数の値について
回答  Kein  - 04/9/22(水) 5:58 -

引用なし
パスワード
   根本的に、見ているところが違いますね。
グラフで比較するなら、グラフの要素だけ扱えば良いのです。
もしワークシートの元データで判定するなら、どこかに =IF(O1>P1,1,"")
などの数式を入れ、予め色を着けたい要素だけをピックアップしておく、なども
考えられますが、まぁこのような簡単な数値の比較なら、直接グラフの要素を
対比しても良いでしょう。コードはこのようになります。

Sub MyCh_Points_Color()
  Dim Ch As Chart
  Dim VAry1 As Variant, VAry2 As Variant, v As Variant
  Dim i As Long
 
  Application.ScreenUpdating = False
  For Each Ch In Charts
   With Ch.Chart
     VAry1 = .SeriesCollection(1).Values
     VAry2 = .SeriesCollection(2).Values
     i = 1
     For Each v In VAry1
      If CLng(v) > CLng(VAry2(i)) Then
        .SeriesCollection(1).Points(i) _
        .Interior.ColorIndex = 3
      End If
      i = i + 1
     Next
   End With
  Next
  Application.ScreenUpdating = True
End Sub

>CLng(v) > CLng(Vary2(i))
のところは、元データの型によって適切な型変換関数を選んで下さい。小数点以下の
値があるなら CSng でいいでしょう。

【18361】Re:変数の値について
回答  Kein  - 04/9/22(水) 6:15 -

引用なし
パスワード
   少し改良してみました。こっちの方がすっきりして分かりやすいと思います。
値は CSng で変換しています。

Sub MyCh_Points_Color()
  Dim Ch As Chart
  Dim VAry1 As Variant, VAry2 As Variant
  Dim i As Long
 
  Application.ScreenUpdating = False
  For Each Ch In Charts
   With Ch.Chart.SeriesCollection
     VAry1 = .Item(1).Values
     VAry2 = .Item(2).Values
     For i = 1 To .Item(1).Points.Count
      If CSng(VAry1(i)) > CSng(VAry2(i)) Then
        .Item(1).Points(i).Interior.ColorIndex = 3
      End If
     Next i
   End With
  Next
  Application.ScreenUpdating = True
End Sub

【18412】Re:変数の値について
お礼  もも  - 04/9/22(水) 20:44 -

引用なし
パスワード
   ▼Kein さん:
グラフの要素だけでできるのですね。
なるほど〜。
とってもよく分かりました。

本当にありがとうございました。m(__)m

11060 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free