- 締切済み
マクロ 計算方法
いつも回答して頂き、ありがとうございます。 下記のようなシートがあるとした場合、 (1)B列に走行距離が記載 (2)F列以降にパーツの交換履歴を記載 →交換した場合○と入力 A,B,C,D,E,F,G,・・・・ 1/6,1000,,,,,, 2/2,1500,,,,,○, ← F列に○ 2/27,3000,,,,,, ○以降の走行距離を計算したいのですが、どのような方法があるのでしょうか?○の位置が不特定になるので、どのようにセル位置を特定し、走行距離の総計をだしたらいいのかわかりません。御指導の程宜しくお願い致します。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- WindFaller
- ベストアンサー率57% (465/803)
こんにちは。 >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
- WindFaller
- ベストアンサー率57% (465/803)
こんにちは。 #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 など書きます。
お礼
いつも回答ありがとうございます。 マクロ記録で編集済のマクロを実行すると、Application.Runが記述されるので、それを使用していました。教えて頂いたマクロ記述も使用する様にしていきます。 本題の回答ですが、○の行から選択が始まっていたので、Offsetで修正して、思い通りの値になりました。 暗黙のマナー違反ではあるのですがもう一つ質問、今回の内容で、○以外が入力されている箇所を選択、○と△と×が入力されている箇所を選択するなんてことも可能なのでしょうか?
- mt2008
- ベストアンサー率52% (885/1701)
この程度ならセル式の方が良いと思いますよ。 ↓は、配列数式になりますので「Ctrl」+「Shift」+「Enter」で確定してください。 =SUMIF(A:A,">="&MAX((A:A)*(F:F="○")),B:B)
お礼
セル関数について理解していない事が多いので勉強になりました。 ですが、セル関数を多用したシートに入力する時の反応の鈍さを味わっちゃうと、どないかしたいという思いになります。
- kybo
- ベストアンサー率53% (349/647)
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 という感じで。
お礼
回答ありがとうございました。 ほぼやって頂き、申し訳ありませんでした。合算が○の行から始まるので、Offsetで行を+1し、問題無く動作する事が確認できました。貴重な時間をこの質問の為に費やして頂きありがとうございました。
- KURUMITO
- ベストアンサー率42% (1835/4283)
データが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)))
お礼
回答ありがとうございました。 関数でもいいのですが、計算式が多くなるとエクセルの動作が鈍くなるので。だけど、いい勉強になりました。今後の参考にさせて頂きます。
- kybo
- ベストアンサー率53% (349/647)
関数でも出来ると思いますが、マクロでしたいのでしょうか。 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
お礼
回答ありがとうございました。 自分の質問の仕方とシートの説明が悪かったようです。○以降(2/27~)の走行距離の合計を出したいのですが、どうしたら良いのでしょうか?
お礼
回答ありがとうございます。 色々考えて下さり、感謝しています。自分が考えているのは、誰かが作ったセル関数の塊のシートから、欲しい部分だけの一覧をちょっと飾りをつけて欲しいだけなのです。ある作業をしてからどれくらい使用していて、次回の作業まであとどれくらいなのかを一覧でサクッと見れたらいいなぁなんて思っているところです。で、よく考えたら、○以外にも入力している文字があったなぁと思い、追加で質問しました。 あと、このダブルクリック使えますね。エクセルの塊のシートにこのマクロを記述すれば結構いい感じです。ありがとうございました。