
初心者なのでよろしくお願いします。
現在会社で必要なデータのみ抽出して、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.にはいろんな数字が入ってくるので、指定できません。
コードとしてどんな風に作成すればいいか、教えてください。
よろしくお願いします。
No.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
No.2
- 回答日時:
基本的なことから始めるとできる話で、
いきなりコードを期待するのは、無理ならしない方が良い。
[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に列挙する、
よくある仕組みでここでも質問多いです。
人のコード例を期待してそのまま考えずに使うと、
結果がすぐ出てうれしいでしょう。が、その分上達遅くなります。
「プログラミング」にならないのです。
No.1
- 回答日時:
VBAの文法やプロパティメソッドのバラエティの勉強がせいぜいで(これも1部しか、かじってないだろうが)、初心者が難しいのは、長年の経験が要る、処理ロジックを自力で考え出すことだ。
自分で考えないと身に付かない。私はかって10日ぐらい1つの課題を考えていたこともあった。
ロスも大きいので、やはり他人の考えたパターンのマネや、システムが提供する方法に沿ってやる勉強もあわせてするべきだ。
ーー
これなどピボットテーブルでやるのが、プロチョンが無くて、かつ速くできあがる。
自力でやろうとするのは、プロを目指す人は必要だが、それ以外のものは適当ではなかろう。出来るだけ作られたものを利用すべきだ。
ーー
一方法として
自力でやるなら、A+B列でソートする。
そうすると、例えば146の○は近接行に塊り、146の(チェック)は近接行もまとまる。
なので146の○が続く間は集計を出す変数に数2を足しこめばしまい。
(チェック)や152に変わった時に集計を確定し、書き出し、集計変数を0(ご破算)にする。
データ最後の次に、貯めていた集計変数の値を吐き出すことが必要。
ーーー
このやり方は
http://www5f.biglobe.ne.jp/~pafu/kihonweb/gozen/ …
にあるように「コントロールブレーク処理」で基本情報処理技術者の時代には、アルゴリズムの1つの例題になっていたのだ。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel 1セル当りの文字数が2...
-
UTF-8で5~6バイトになる文字コ...
-
10Mバイトて文字数に すると何...
-
COBOLのCOMP形式について
-
Line Inputにて改行があっても...
-
半角、全角の判別方法
-
全角半角を調べるライブラリ関...
-
stable diffusionのエラー
-
この関数はどのプログラミング...
-
【Excel VBA】10進数を2進数に...
-
utf-8でメールを送信すると件名...
-
int型(2バイト)データの分割
-
COleDateTime とtime_t
-
ビットからバイトへの変換
-
CSVファイルの行と列のセルって...
-
「1TB」のHDDに日本語は何字入...
-
パイプを用いたプロセス間通信...
-
C言語の勉強しています。すみま...
-
.netで、ibm漢字で書かれたテキ...
-
バイト列とバイナリ列の違いが...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel 1セル当りの文字数が2...
-
DataGridViewの特定列に入力さ...
-
ListView重複データ削除
-
クロス集計
-
A1に100と入力した時点で 自動...
-
GUIDの重複
-
EXCEL VBA 並び替えについて
-
VB.netのTableAdapter.InsertQu...
-
マクロのフィルター機能を使って
-
VBAを使って複数条件からの合計...
-
VBAにて複数の重複データを取得...
-
ExcelVBAで、コメントのサイズ...
-
UTF-8で5~6バイトになる文字コ...
-
COBOLのCOMP形式について
-
10Mバイトて文字数に すると何...
-
char str[256]の256の意味は?
-
stable diffusionのエラー
-
「1TB」のHDDに日本語は何字入...
-
ピクセル,dpiから容量(バイト...
-
Excel VBA メール作成について ...
おすすめ情報