• 締切済み

マクロ 計算方法

いつも回答して頂き、ありがとうございます。 下記のようなシートがあるとした場合、 (1)B列に走行距離が記載 (2)F列以降にパーツの交換履歴を記載 →交換した場合○と入力  A,B,C,D,E,F,G,・・・・ 1/6,1000,,,,,, 2/2,1500,,,,,○, ← F列に○ 2/27,3000,,,,,, ○以降の走行距離を計算したいのですが、どのような方法があるのでしょうか?○の位置が不特定になるので、どのようにセル位置を特定し、走行距離の総計をだしたらいいのかわかりません。御指導の程宜しくお願い致します。

みんなの回答

回答No.6

こんにちは。 >Application.Runが記述されるので、 http://okwave.jp/qa/q7809586.html ここの#3, #4で、例を挙げて説明していますので、お手すきでしたら、一度読まれるといいと思います。そういう私も、ついつい、その意味自体を忘れていることがあります。本来は、もう少し複雑な内容の中で必要な分を抜き出したものです。レベルはVBA中級以上です。その意味を忘れても、覚えるのは、ひとつか、ふたつだけです。 >暗黙のマナー違反ではあるのですが それは、ここの誰かが、そういうマナーとやらを言い始めたのでしょうね。 気に入らなければ、答えなければ済むものを、わざわざ文句つける人をみました。 回答者によっても、情の通う人なら、追加質問オーケーです。それに、#4さんの回答を読んでいる最中に、次の質問を感じていましたから。マクロの質問する人は、そんなに単純なものではないことが多いのです。 しかし、私もVBAが上手くできなかった頃は、関数で、同じようなことをやっていました。その後、同じような内容で、ものすごく高度な内容の質問に出会ったことがあります。 >○以外が入力されている箇所を選択、 こんなスタイルはどうでしょうか? シート・モジュールに貼り付けます。(シートタブを右クリック、コードの表示) F列の○×△を選んで、ダブルクリックします。 '//シートモジュールに貼り付け Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 'ダブルクリック Dim r As Range Dim Total As Double '←ワークシートの計算は、Double型が良い  Cancel = True  If Target.Column <> 6 Then Exit Sub 'F列  If Target.Value Like "[○×△]" Then '任意で入れてください。   Set r = Range(Target.Offset(, -4), Cells(Rows.Count, "B").End(xlUp))    Total = Application.Sum(r) '97型の書き方(エラーで止まらない)   MsgBox Target.Value & " : " & Format$(Total, "#,##0")  Else   MsgBox "○×△ではありません。", vbExclamation  End If End Sub

kero1192kero
質問者

お礼

回答ありがとうございます。 色々考えて下さり、感謝しています。自分が考えているのは、誰かが作ったセル関数の塊のシートから、欲しい部分だけの一覧をちょっと飾りをつけて欲しいだけなのです。ある作業をしてからどれくらい使用していて、次回の作業まであとどれくらいなのかを一覧でサクッと見れたらいいなぁなんて思っているところです。で、よく考えたら、○以外にも入力している文字があったなぁと思い、追加で質問しました。 あと、このダブルクリック使えますね。エクセルの塊のシートにこのマクロを記述すれば結構いい感じです。ありがとうございました。

回答No.5

こんにちは。 #4さんの >この程度ならセル式の方が良いと思いますよ。 御意。。 もちろん、配列数式は重いのですが、サンプルだけなら、このような単純なコードで済みますが、もう少し付加的要件が加わりそうな気がしています。 '// Sub Test2()  Dim c As Variant  Dim r As Range  With ActiveSheet   Set c = .Columns("F").Find("○", , xlValues, 1)   If Not c Is Nothing Then    Set r = .Range(c.Offset(, -4), .Cells(Rows.Count, "B").End(xlUp))    MsgBox Application.Sum(r), vbInformation   Else    MsgBox "○が見つかりません。", vbExclamation   End If  End With End Sub c...セル(Cell)の略称 r...範囲(Range)の略称 別件:この前については、同一プロジェクト内のマクロの場合は、Application.Run ではなくて、以下のようなスタイルにしてもよいと思います。 Sub Main()  Call Test1 '標準モジュールのマクロ名 Test1  Call Test2 '標準モジュールのマクロ名 Test2 End Sub と書きます。違う場所にある場合は、Sheet1.Test3 など書きます。

kero1192kero
質問者

お礼

いつも回答ありがとうございます。 マクロ記録で編集済のマクロを実行すると、Application.Runが記述されるので、それを使用していました。教えて頂いたマクロ記述も使用する様にしていきます。 本題の回答ですが、○の行から選択が始まっていたので、Offsetで修正して、思い通りの値になりました。 暗黙のマナー違反ではあるのですがもう一つ質問、今回の内容で、○以外が入力されている箇所を選択、○と△と×が入力されている箇所を選択するなんてことも可能なのでしょうか?

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.4

この程度ならセル式の方が良いと思いますよ。 ↓は、配列数式になりますので「Ctrl」+「Shift」+「Enter」で確定してください。 =SUMIF(A:A,">="&MAX((A:A)*(F:F="○")),B:B)

kero1192kero
質問者

お礼

セル関数について理解していない事が多いので勉強になりました。 ですが、セル関数を多用したシートに入力する時の反応の鈍さを味わっちゃうと、どないかしたいという思いになります。

  • kybo
  • ベストアンサー率53% (349/647)
回答No.3

Sub test() Dim R As Range Set R = Range("F:F").Find("○", Range("F" & Rows.Count), , xlWhole, , xlPrevious) If Not R Is Nothing Then MsgBox "走行距離は:" & WorksheetFunction.Sum(Range(Range("B" & R.Row), Range("B" & Rows.Count).End(xlUp))) End If End Sub という感じで。

kero1192kero
質問者

お礼

回答ありがとうございました。 ほぼやって頂き、申し訳ありませんでした。合算が○の行から始まるので、Offsetで行を+1し、問題無く動作する事が確認できました。貴重な時間をこの質問の為に費やして頂きありがとうございました。

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.2

データが2行目以降に入力されているとします。 ○以降の走行距離を例えばH列に表示させるとしたら次の式をH2セルに入力し下方にドラッグコピーします。 =IF(F2="","",IF(COUNTIF(F$1:F2,"○")=1,SUM(B$2:B2),SUM(INDEX(B:B,MATCH("",F$1:F1,-1)+1):B2)))

kero1192kero
質問者

お礼

回答ありがとうございました。 関数でもいいのですが、計算式が多くなるとエクセルの動作が鈍くなるので。だけど、いい勉強になりました。今後の参考にさせて頂きます。

  • kybo
  • ベストアンサー率53% (349/647)
回答No.1

関数でも出来ると思いますが、マクロでしたいのでしょうか。 Sub test() Dim R As Range Set R = Range("F:F").Find("○", Range("F" & Rows.Count), , xlWhole, , xlPrevious) If Not R Is Nothing Then MsgBox "走行距離は:" & WorksheetFunction.Max(Range("B:B")) - Range("B" & R.Row).Value End If End Sub

kero1192kero
質問者

お礼

回答ありがとうございました。 自分の質問の仕方とシートの説明が悪かったようです。○以降(2/27~)の走行距離の合計を出したいのですが、どうしたら良いのでしょうか?

関連するQ&A