添付画像左のように、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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
B列の最終行までA列をオート...
-
vba 2つの条件が一致したら...
-
Cellsのかっこの中はどっちが行...
-
Excelで、あるセルの値に応じて...
-
Worksheets メソッドは失敗しま...
-
VBAのFind関数で結合セルを検索...
-
VBAで指定範囲内の空白セルを左...
-
文字列の結合を空白行まで実行
-
【VBA】2つのシートの値を比較...
-
VBAで条件から範囲を指定して色...
-
IIF関数の使い方
-
複数の列の値を結合して別の列...
-
VBAでのリスト不一致抽出について
-
【Excel VBA】カンマと改行コー...
-
VBAで文字列を結合
-
VBAコンボボックスで選択した値...
-
エクセルで結合セルがあるため...
-
SUM関数の範囲を変数を代入して...
-
エクセルVBAにて =A1=B1とすれ...
-
データグリッドビューの一番最...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
B列の最終行までA列をオート...
-
Worksheets メソッドは失敗しま...
-
Excelで、あるセルの値に応じて...
-
vba 2つの条件が一致したら...
-
Cellsのかっこの中はどっちが行...
-
URLのリンク切れをマクロを使っ...
-
文字列の結合を空白行まで実行
-
データグリッドビューの一番最...
-
【VBA】2つのシートの値を比較...
-
VBA 何かしら文字が入っていたら
-
IIF関数の使い方
-
VBAを使って検索したセルをコピ...
-
Changeイベントでの複数セルの...
-
VBAの構文 3列置きにコピーし...
-
VBAのFind関数で結合セルを検索...
-
【Excel VBA】 B列に特定の文字...
-
VBAで指定範囲内の空白セルを左...
-
VBAでのリスト不一致抽出について
-
セルに値が入っていた時の処理
-
VBAコンボボックスで選択した値...
おすすめ情報