添付画像左のように、A列に1~4、4(1)~(3)までナンバーが記入されており、B列C列には数値が含まれているとき、( )が存在している場合のみ( )が存在しないナンバー(例の場合は4)のB列C列に( )があるナンバー(例の場合(1)~(3))の合計を添付画像右がわのように表示させたいとき、どのようなマクロを組めばできますでしょうか。
全てお願いしてしまいますと、コードも長くなってくるのではないかと思われますので、画像では入力シートから表示シートに切り替わっているということですが、入力シートの空白セルへの表示でもかまいません。
( )つきナンバーのB~後の値を( )なしナンバーのB~後に合計できる方法をお教え頂ければ幸いです。
No.3ベストアンサー
- 回答日時:
No.2です。
Sub try()
Dim myDic As Object
Dim r As Range
Dim v As Variant
Dim vv As Variant
' Dictionaryオブジェクトをセット
Set myDic = CreateObject("Scripting.Dictionary")
With Worksheets("入力用")
' 入力用シートのA1~A最終セルまでを取得
For Each r In .Range("A1", .Cells(Rows.Count, 1).End(xlUp))
' A列の値を"("で区切る
v = Split(r.Value, "(")
' その後、区切った中から添字:0の値を利用するけど、
' "4(1)"の時は"4"を得られるし、"1"の時は"1"となる。
' もしv(0)の値がDictionaryのキーに存在しない時は、
If Not myDic.Exists(v(0)) Then
' アイテムとしてA・B・C列の値をArray関数を用いて代入する。
myDic(v(0)) = Array(v(0), r.Offset(, 1).Value, r.Offset(, 2).Value)
' もしキーに存在したならば
Else
' 変数:vvにそのアイテムを一旦代入する。
vv = myDic(v(0))
' vvの添字:0(B列の値を格納)は数字となっているので、
' Val関数を用いてそれを数値に変換し、
' さらにB列の値を足して代入しなおす。
vv(1) = Val(vv(1)) + r.Offset(, 1).Value
' vvの添字:1(C列の値を格納)についても同様。
vv(2) = Val(vv(2)) + r.Offset(, 2).Value
' そのキーのアイテムとして再度代入しなおす。
myDic(v(0)) = vv
End If
Next
End With
With Worksheets("表示")
' 表示シートのA~C列の値をクリア。
.Range("A:C").ClearContents
' A1を基準にDictionaryに存在するキーの個数分と
' A~Cの列数分についてセル範囲をResizeし、
' Dictionaryのアイテム(1次元配列)を2次元配列で
' 出力するために、Transpose関数を2重に実行する。
.Range("A1").Resize(myDic.Count, 3).Value = _
Application.Transpose(Application.Transpose(myDic.Items))
End With
Set myDic = Nothing
End Sub
Dictionaryオブジェクトについては少し書き方が違いますが、
こちらが参考になるかと。
Excel(エクセル) VBA入門:Dictionaryオブジェクトを利用する
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/v …
No.2
- 回答日時:
Sub try()
Dim myDic As Object
Dim r As Range
Dim v As Variant
Dim vv As Variant
Set myDic = CreateObject("Scripting.Dictionary")
With Worksheets("入力用")
For Each r In .Range("A1", .Cells(Rows.Count, 1).End(xlUp))
v = Split(r.Value, "(")
If Not myDic.Exists(v(0)) Then
myDic(v(0)) = Array(v(0), r.Offset(, 1).Value, r.Offset(, 2).Value)
Else
vv = myDic(v(0))
vv(1) = Val(vv(1)) + r.Offset(, 1).Value
vv(2) = Val(vv(2)) + r.Offset(, 2).Value
myDic(v(0)) = vv
End If
Next
End With
With Worksheets("表示")
.Range("A:C").ClearContents
.Range("A1").Resize(myDic.Count, 3).Value = _
Application.Transpose(Application.Transpose(myDic.Items))
End With
Set myDic = Nothing
End Sub
一例になれば。
この回答への補足
ご連絡が遅くなり申し訳ありません。
思惑の事ができましたが、当方初心者すぎる余り、どこでどの作業を行っているのかうまく理解できておりません。
Arrayで格納しておいて表示シートのA~Cの値を削除して書き出しているというのはわかるんですが・・・。
作成して頂いた上に贅沢を言って申し訳ないのですが、もしよろしければこの場所でこの作業をしているというコメントをつけて頂けませんでしょうか。
No.1
- 回答日時:
こんばんは!
A列で単に数値は「親番」・()付の数値はその「子番」だとして
すべて親番に集計する!という解釈です。
※ ()付のデータの前の数値は上の行の「親番」
(途中に他の「親番」が含まれていない)という前提です。
お示しのようにデータは1行目からあるとして・・・
Sub test()
Dim i As Long
Application.ScreenUpdating = False
For i = Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1
If Not IsNumeric(Cells(i, 1)) Then
Cells(i - 1, 2) = Cells(i - 1, 2) + Cells(i, 2)
Cells(i - 1, 3) = Cells(i - 1, 3) + Cells(i, 3)
Rows(i).Delete
End If
Next i
Application.ScreenUpdating = True
End Sub
こんな感じではどうでしょうか?
※ 「子番」のデータは削除するようにしていますので
別Sheetでマクロを試してみてください。
参考になりますかね?m(_ _)m
この回答への補足
ご連絡が遅くなり申し訳ありません。
思惑の事ができましたが、当方初心者すぎる余り、どこでどの作業を行っているのかうまく理解できておりません。
しかし、A1に( )つきの文字を入れるとデバッグが発生することから、A1の表示形式?でチェックをしていき、同じならそのまま、違ったら上のセルに足して消す。
という処理を行っていると考えればいいのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 単価シートから単価をエクセル関数で自動取得する方法 1 2023/07/02 22:00
- Excel(エクセル) エクセル VBA セルの結合 2 2022/09/07 11:48
- Visual Basic(VBA) A列にある値をB列・C列にVBAで切り出し 3 2022/04/09 19:20
- Excel(エクセル) B列に、A列の数字が偶数の場合は1減算した数字、奇数の場合はそのまま数字を自動表示したい 4 2022/04/16 12:01
- Visual Basic(VBA) エクセルVBAについて 2 2023/01/31 16:21
- Excel(エクセル) excelで検索した商品の画像(ネットワーク上の)を表示させたい。 3 2023/06/28 00:32
- その他(Microsoft Office) エクセルマクロ オートフィルターでで選択コピー 2 2022/04/18 11:05
- Excel(エクセル) ある数値に対して、値を返す数式についてです 2 2022/09/13 22:06
- Excel(エクセル) 条件に合った数値の合計を表示させたい関数と条件指定の方法 3 2023/05/13 16:07
- Excel(エクセル) エクセル バーコード作成で他のシートを参照するには? 2 2023/05/03 16:57
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Worksheets メソッドは失敗しま...
-
VBAのFind関数で結合セルを検索...
-
VBA 何かしら文字が入っていたら
-
vba 2つの条件が一致したら...
-
【VBA】複数行あるカンマ区切り...
-
B列の最終行までA列をオート...
-
【VBA】2つのシートの値を比較...
-
VBAで、離れた複数の列に対して...
-
セルに値が入っていた時の処理
-
Cellsのかっこの中はどっちが行...
-
【Excel VBA】 B列に特定の文字...
-
二つのリストを比べて部分一致...
-
VBAで重複データを確認したい
-
文字列の結合を空白行まで実行
-
数字が「0」の列を削除するた...
-
Excelで、あるセルの値に応じて...
-
VBAでのリスト不一致抽出について
-
空白セルをとばして転記
-
Excel VBA 他組み合わせと比較...
-
【Excel VBA】カンマと改行コー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
B列の最終行までA列をオート...
-
Worksheets メソッドは失敗しま...
-
Excelで、あるセルの値に応じて...
-
Cellsのかっこの中はどっちが行...
-
vba 2つの条件が一致したら...
-
IIF関数の使い方
-
VBAのFind関数で結合セルを検索...
-
URLのリンク切れをマクロを使っ...
-
データグリッドビューの一番最...
-
文字列の結合を空白行まで実行
-
rowsとcolsの意味
-
VBAを使って検索したセルをコピ...
-
VBA 何かしら文字が入っていたら
-
Changeイベントでの複数セルの...
-
【Excel VBA】 B列に特定の文字...
-
【VBA】2つのシートの値を比較...
-
【Excel VBA】カンマと改行コー...
-
VBAで、離れた複数の列に対して...
-
VBAでのリスト不一致抽出について
-
エクセル 2つの表の並べ替え
おすすめ情報