アプリ版:「スタンプのみでお礼する」機能のリリースについて

初心者なのでよろしくお願いします。

現在会社で必要なデータのみ抽出して、No.ごとに合計がすぐ見れるものを作っています。
データは毎日追加になるため、日付ごとに新しいシートに落ちるようにはできたんですが、
欲しいデータの合計のみを表示することに困っています。 

たとえば・・・Sheet1に

[1] No. ○/× 数2
[2] 146 ○ 300
[3] 152 × 200
[4] 146 ○ 300
[5] 146 × -30
[6] 152 × -80
[7] 152 ○ 500

のようなデータからSheet2に
No.146が"○"の時の"数2"の合計
No.146が"×"の時の"数2"の合計といった感じで、、、
重複しているNo.の○と×で"数2"の合計のみをみれるようにしたいんですが
どういう式になるのかさっぱりで><

No.にはいろんな数字が入ってくるので、指定できません。

コードとしてどんな風に作成すればいいか、教えてください。

よろしくお願いします。

A 回答 (3件)

その後、進展が無さそうなのでお邪魔します。


なんとなく出来たっぽい。
(投稿用にタブを全角スペースに変換しています)
Sheet1のデータが変更されたら一旦保存してからお試しを。
決して良い回答ではありません。ご参考までに。

Sub test()
  Dim r1 As Long 'Sheet1の行カウンタ
  Dim r2 As Long 'Sheet2の行カウンタ
  Dim Trg As Range
  Dim ws1 As Worksheet
  Dim ws2 As Worksheet

  Set ws1 = ThisWorkbook.Worksheets("sheet1")
  Set ws2 = ThisWorkbook.Worksheets("sheet2")
  '見出しコピー
  ws2.UsedRange.ClearContents
  ws1.Range("a1:c1").Copy
  ws2.Paste Destination:=ws2.Range("A1:C1")
  '行カウンタの初期値
  r1 = 2: r2 = 2
  Do Until ws1.Range("A" & r1) = ""
    'Sheet1の『No』の数をSheet2で調べる
    Select Case WorksheetFunction.CountIf(Sheets("sheet2").Range("A:A"), _
      ws1.Range("A" & r1).Value)
    Case Is = 0
      'まだ無いので単純にコピー
      ws1.Range("A" & r1 & ":c" & r1).Copy
      ws2.Paste Destination:=ws2.Range("A" & r2 & ":c" & r2)
      r2 = r2 + 1
    Case 1
      '○か×かどちらかがある
      '『No』を元にSheet2のRangeをTrgに格納
      Set Trg = ws2.Range("A:A") _
        .Find(what:=ws1.Range("A" & r1), Lookat:=xlWhole)
      'Trgの1個右の値がSheet1の値と同じかどうか
      If ws1.Range("B" & r1) = Trg.Offset(0, 1) Then
        '同じだったら加算
        Trg.Offset(0, 2) = Trg.Offset(0, 2).Value + ws1.Range("C" & r1)
      Else
        ws1.Range("A" & r1 & ":c" & r1).Copy
        ws2.Paste Destination:=ws2.Range("A" & r2 & ":c" & r2)
        r2 = r2 + 1
      End If
    Case 2
      '○も×もある
      Set Trg = ws2.Range("A:A") _
      .Find(what:=ws1.Range("A" & r1), Lookat:=xlWhole)
      If ws1.Range("B" & r1) = Trg.Offset(0, 1) Then
        '同じだったので
        Trg.Offset(0, 2) = Trg.Offset(0, 2).Value + ws1.Range("C" & r1)
      Else
        '違っていたので再度検索
        Set Trg = ws2.Range("A:A") _
        .FindNext(After:=Trg)
        Trg.Offset(0, 2) = Trg.Offset(0, 2).Value + ws1.Range("C" & r1)
      End If
    End Select
  
    r1 = r1 + 1
  Loop
  Application.CutCopyMode = False

  '整列
  ws2.UsedRange.Select
  Selection.Sort _
    Key1:=ws2.Columns("A"), _
    Key2:=ws2.Columns("B"), order2:=xlDescending, _
    Header:=xlGuess
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます^^

1つ1つ見て考えながら引用させてもらいます。

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

お礼日時:2011/02/08 17:10

基本的なことから始めるとできる話で、


いきなりコードを期待するのは、無理ならしない方が良い。

[2] 146 ○ 300
[3] 152 × 200
[4] 146 ○ 300
[5] 146 × -30
[6] 152 × -80
[7] 152 ○ 500
なんだから、並べかえれば
[2] 146 ○ 300
[4] 146 ○ 300
[5] 146 × -30
[3] 152 × 200
[6] 152 × -80
[7] 152 ○ 500
であって
[2] 146 ○ 300
[4] 146 ○ 300
[5] 146 × -30 計570
[3] 152 × 200
[6] 152 × -80
[7] 152 ○ 500 計220
という構造は見えてくるはず。
少なくともこれくらいは考えるだろう。

それとか
[2] 146 ○ 300 対象
[3] 152 × 200 対象でない
[4] 146 ○ 300 対象
[5] 146 × -30 対象
[6] 152 × -80 対象でない
[7] 152 ○ 500 対象でない
こんなことしてもフィルタでなんとかなる。

どんなことしたらできそうか、どんな情報があればうれしいか、考える。
1行目を判定、
2行目を判定、
3行目を判定、
・・・・
単純にこれをベースに、でも良い。


エクセルでお仕事
http://www.asahi-net.or.jp/~ef2o-inue/menu/menu0 …

すぐに役立つエクセルマクロ集
http://www.asahi-net.or.jp/~zn3y-ngi/YNxv20.html

ほか
VBAコマンド
http://www.voicechatjapan.com/excelvba/VBArei2.htm

文字列の存在を調査、とか
検索して別のシートに貼り付ける、とか解説あります。
http://www.asahi-net.or.jp/~zn3y-ngi/YNxv258.htm …
VBAでやるには、こういうところのサンプルを見つけて
応用で取り組む。

シート1から該当データを抽出してシート2に列挙する、
よくある仕組みでここでも質問多いです。

人のコード例を期待してそのまま考えずに使うと、
結果がすぐ出てうれしいでしょう。が、その分上達遅くなります。
「プログラミング」にならないのです。
    • good
    • 0

VBAの文法やプロパティメソッドのバラエティの勉強がせいぜいで(これも1部しか、かじってないだろうが)、初心者が難しいのは、長年の経験が要る、処理ロジックを自力で考え出すことだ。


自分で考えないと身に付かない。私はかって10日ぐらい1つの課題を考えていたこともあった。
ロスも大きいので、やはり他人の考えたパターンのマネや、システムが提供する方法に沿ってやる勉強もあわせてするべきだ。
ーー
これなどピボットテーブルでやるのが、プロチョンが無くて、かつ速くできあがる。
自力でやろうとするのは、プロを目指す人は必要だが、それ以外のものは適当ではなかろう。出来るだけ作られたものを利用すべきだ。
ーー
一方法として
自力でやるなら、A+B列でソートする。
そうすると、例えば146の○は近接行に塊り、146の(チェック)は近接行もまとまる。
なので146の○が続く間は集計を出す変数に数2を足しこめばしまい。
(チェック)や152に変わった時に集計を確定し、書き出し、集計変数を0(ご破算)にする。
データ最後の次に、貯めていた集計変数の値を吐き出すことが必要。
ーーー
このやり方は
http://www5f.biglobe.ne.jp/~pafu/kihonweb/gozen/ …
にあるように「コントロールブレーク処理」で基本情報処理技術者の時代には、アルゴリズムの1つの例題になっていたのだ。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!