初心者なのでよろしくお願いします。
現在会社で必要なデータのみ抽出して、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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAで大量データの処理 3 2022/11/15 21:53
- Visual Basic(VBA) VBAで、1つのエクセルで、2つのシートからもう1つのシートに条件のある転記コードを教えてください。 1 2023/03/16 18:07
- Visual Basic(VBA) VBA 連続する名前ごとに集計 3 2022/05/21 18:24
- その他(Microsoft Office) 従業員増減対応で当番種類の増減対応な当番表 21 2022/07/19 07:30
- Excel(エクセル) 複数セルデータを別シートの単一セルにコピーしたい。(詳細をご参照ください) 1 2022/12/14 15:08
- Excel(エクセル) VBAで、シート間の転記するコードを教えてください。 4 2023/03/26 10:43
- Excel(エクセル) Excel(エクセル)でフィルター抽出後、非表示の行を計算しないで、合計を算出する方法 【内容】 添 4 2023/01/30 17:17
- Access(アクセス) アクセスのグループ化で、 No.が10番台のJPY合計 No.が20番台のJPY合計 No.が30番 1 2022/12/20 14:39
- Excel(エクセル) SUMIFSと日付変換 10 2023/04/16 15:38
- Excel(エクセル) EXCEL 関数を教えてください。(A列の同じ値が複数ある場合vlookupで出来ますか) 4 2022/12/07 20:54
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel 1セル当りの文字数が2...
-
DataGridViewの特定列に入力さ...
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
【Excel VBA】10進数を2進数に...
-
10Mバイトて文字数に すると何...
-
UTF-8で5~6バイトになる文字コ...
-
ビットスワップとバイトスワッ...
-
バイナリとBCDコード
-
異なるドメインのサイトでcooki...
-
全角半角を調べるライブラリ関...
-
バイト列とバイナリ列の違いが...
-
char str[256]の256の意味は?
-
10個の実数に対する降順ソート...
-
1KBが1024byteな理由
-
ワイド文字のバイト数が取得で...
-
(C言語・配列)date[i]の分散...
-
Excel VBA メール作成について ...
-
3バイト文字(UTF-8)をprintfで...
-
CGIを勉強しています。¥n(改...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel 1セル当りの文字数が2...
-
DataGridViewの特定列に入力さ...
-
ListView重複データ削除
-
GUIDの重複
-
光散乱のシミュレーションにつ...
-
Excel VBA チェックツール
-
VBAを使って複数条件からの合計...
-
ポインター引数の関数でコンパ...
-
10Mバイトて文字数に すると何...
-
UTF-8で5~6バイトになる文字コ...
-
Excel VBA メール作成について ...
-
char str[256]の256の意味は?
-
エクセルシート名の制限を変更...
-
stable diffusionのエラー
-
COBOLのCOMP形式について
-
バイナリとBCDコード
-
バイト列とバイナリ列の違いが...
-
ビットスワップとバイトスワッ...
-
ピクセル,dpiから容量(バイト...
-
SQLで1バイト、2バイト混在...
おすすめ情報