質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

5回答

15680閲覧

VBAで、データの下に行追加(値を入れたりもしたい)

Z-TALBO

総合スコア525

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2016/04/28 08:57

編集2016/04/30 06:35

###やりたいこと
データを入れてから、並び替えを名前を基準に並び替えます。
→ここの部分はできてます。
次に例えばなのですが、、、
1.テスト
2.テスト
3.テスト
4.テスター
5.テスター
このように並び替えられたとします。
名前が変わった所で一行増やし、値の入力と関数を入れたいと思っています。
【例】
1.テスト 10
2.テスト 10
3.テスト 10
4.合 計 30
5.テスター 20
6.テスター 30
7.合 計 50
上記のような感じです。
数字の合計に関してはsum関数(他の方法であればそれで構いません)で手入力の場合は行っております。
合計という入力の列は決まっております。
上記は例ですので、実際とは違いますが番号に関してはわかりやすく打っているだけで、実際は番号は無くてもいいです。

###やってみたこと
すみません。。。VBAがまだまだなので、このあたりできておりません。。。

丸投げのような質問になってしまい大変申し訳ありません。
一応、下記のようなやり方を見ました。

VBA

1Dim i As Long, imax As Long 2Dim j As Long 3Application.ScreenUpdating = False 4imax = Cells(Rows.Count, "A").End(xlup).Row 5For i = ??? To imax 6j = i 7Do Until Range("A" & j).Value = 2 Or j >= imax 8j = j + 1 9Loop 10// これは、この後罫線を引くようになっていました。

上記コードにおいて???の部分は"2"が入っており、どうも表の中で2の部分が区切りとして、、、という感じだったようです。

では、名前などの場合はどうなるのか?がわかりません。。。

###最後に
質問の仕方というか、どういった情報を提示していけばいいのかわからずこのような乱文になってしまい大変申し訳ございません。

よろしくお願い致します。

###追記(今までのをまとめて、修正しました)
最初から提示してれば良かったです。本当に申し訳ない。
イメージ説明
こんな感じでいいですかね?
列と行番号はあえて打っただけです。実際は空白の部分ですね。

【回答で試したこと1】

sub Test() Dim i As Long, imax As Long Dim j As Long Dim tmp As String imax = Cells(Rows.Count, "A").End(xlUp).Row j = 1 For i = imax + 1 To 2 Step -1 If Range("A" & i).Value <> Range("A" & i - 1).Value Then Range("A" & i & ":B" & i).Insert Shift:=xlDown Range("A" & i).Value = "合計" Range("B" & i).Value = Application.WorksheetFunction.SumIf(Range("A1:A65536"), Range("A" & i - 1).Value, Range("B1:B65536")) End If Next i End Sub

これを試した結果
イメージ説明

【別で見つけた方法を試したこと】

Sub Test() Dim st As Worksheet: Set st = ActiveSheet Dim c As Long: c = 8 Dim r As Long: r = 11 Do While r <= st.UsedRange.Rows.Count Dim a As Variant: a = st.Cells(r - 1, c).Value Dim b As Variant: b = st.Cells(r, c).Value If a <> "" And b <> "" And Left(a, 3) <> Left(b, 3) Then st.Rows(r).Insert End If r = r + 1 Loop Set st = Nothing End Sub

これを試した結果
イメージ説明
空白自体はこちらがしっくりは来た気がしましたが、ここからのコーディングが知識不足となっております。

【あと解決したい部分】
1.上記表のN列の空白部分に合 計と入れたい
2.O列の空白部分にそこから上の部分の合計を出したい

【とりあえず参考にしつつやってみた部分】

Sub Test() Dim st As Worksheet: Set st = ActiveSheet Dim c As Long: c = 8 Dim r As Long: r = 11 Dim tmp As String tmp = "合 計" Do While r <= st.UsedRange.Rows.Count Dim a As Variant: a = st.Cells(r - 1, c).Value Dim b As Variant: b = st.Cells(r, c).Value If a <> "" And b <> "" And Left(a, 3) <> Left(b, 3) And r <> 11 Then st.Rows(r).Insert st.Cells(r, 14).Value = tmp st.Cells(r, 15).Value = "=SUM(R[-2]C:R[-1]C)" End If r = r + 1 Loop st.Cells(r, 14).Value = tmp Set st = Nothing End Sub

1.N列に合計の文字が入りました
2.sumでやってみたらどうなるんだろう?と思って入れてみました、値としては大丈夫でした。範囲はとりあえずです。

1.最後の行の下にはこれだと入ってきませんでした。
上で提示した表で言うと21行目には合計とかが表示されない。
2.sumの範囲選択をどうしてみたらいいか?なんですが、、、

この2点に対して、補足とさせてください。

###最終的なコード
最終的に下記のようにしてみました。

Sub ボタン_Click() Dim st As Worksheet: Set st = ActiveSheet Dim c As Long: c = 8 Dim r As Long: r = 11 Dim tmp As String tmp = "合 計" Dim cnt As Long cnt = r Do While r <= st.UsedRange.Rows.Count Dim a As Variant: a = st.Cells(r - 1, c).Value Dim b As Variant: b = st.Cells(r, c).Value If a <> "" And b <> "" And Left(a, 3) <> Left(b, 3) And r <> 11 Then st.Rows(r).Insert st.Cells(r, 14).Value = tmp st.Cells(r, 15).Value = "=sum(R[" & cnt - r & "]C:R[-1]C)" st.Cells(r, 15).NumberFormatLocal = "[h]:mm" cnt = r + 1 End If r = r + 1 Loop st.Cells(r, 14).Value = tmp st.Cells(r, 15).Value = "=sum(R[" & cnt - r & "]C:R[-1]C)" Set st = Nothing End Sub

回答いただいたコードでできました!
一点だけ、やはり時刻計算の部分が少し変でしたので、対応しました!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ベストアンサー

全体を書き直してみました。
1:上からのループ処理になるので、ループ終了後にもう一度合計を入力する必要があります。
2:"=SUM(R[-2]C:R[-1]C)" この書き方では、「対象セルの1つ上と2つ上のsumをとる」という、意味なので、2件以外では、おかしな結果になります。変数で対応しました。

VBA

1Sub Test() 2 3Dim st As Worksheet: Set st = ActiveSheet 4 Dim c As Long: c = 8 5 Dim r As Long: r = 11 6 7 Dim tmp As String 8 tmp = "合 計" 9 10 '2:挿入された行番号を格納 11 Dim cnt As Long 12 cnt = r 13 14 Do While r <= st.UsedRange.Rows.Count 15 Dim a As Variant: a = st.Cells(r - 1, c).Value 16 Dim b As Variant: b = st.Cells(r, c).Value 17 18 If a <> "" And b <> "" And Left(a, 3) <> Left(b, 3) And r <> 11 Then 19 st.Rows(r).Insert 20 st.Cells(r, 14).Value = tmp 21 st.Cells(r, 15).Value = "=SUM(R[" & cnt - r & "]C:R[-1]C)" 22 cnt = r + 1 23 End If 24 25 r = r + 1 26 27 Loop 28 29 '1:最終行に合計をいれる 30 st.Cells(r, 14).Value = tmp 31 st.Cells(r, 15).Value = "=SUM(R[" & cnt - r & "]C:R[-1]C)" 32 33 Set st = Nothing 34End Sub

投稿2016/04/30 02:10

編集2016/04/30 02:13
tomato-salada

総合スコア68

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Z-TALBO

2016/04/30 06:01

細かく教えていただいて、大変参考になりました! 最終行の部分がどうも、うまくいかなかったので、少し力技ですが、、、補足で最終コードを載せてみます。
guest

0

N行目に合計を入れるだけならこれでよいでしょうか?
申し訳ないのですが、「O列に合計用計算」 がわからないので、補足の説明お願いいたします。

VBA

1Sub test() 2 3 Dim st As Worksheet: Set st = ActiveSheet 4 Dim c As Long: c = 8 5 Dim r As Long: r = 11 6 7 Dim tmp As Long 8 tmp = 0 9 10 Do While r <= st.UsedRange.Rows.Count 11 Dim a As Variant: a = st.Cells(r - 1, c).Value 12 Dim b As Variant: b = st.Cells(r, c).Value 13 14'11行目は処理しない 15 If a <> "" And b <> "" And Left(a, 3) <> Left(b, 3) And r <> 11 Then 16 st.Rows(r).Insert 17 st.Cells(r, 14).Value = tmp 18 tmp = 0 19 Else 20 tmp = tmp + st.Cells(r, 14).Value 21 End If 22 23 r = r + 1 24 Loop 25'最終行の合計入力 26 st.Cells(r, 14).Value = tmp 27 28 Set st = Nothing 29 End Sub 30

投稿2016/04/29 08:16

tomato-salada

総合スコア68

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

データが入っているO列の書式が挿入によって反映されていないのかもしれません。

http://excel.style-mods.net/tips_vba/tips_vba_2_07.htm
例:

VBA

1Range("O" & i).NumberFormatLocal = "hh:mm"

当方の環境では再現できませんでしたので、列を挿入した直後に対象セルの書式設定を変更させてみてはいかがでしょうか?
また、すでに入っているデータが時刻(シリアル値)か数値、文字列に統一されているでしょうか?
見た目が同じでもデータ型が異なると結果が変わることもあります。
そちらも確認してみてください。

投稿2016/04/29 01:32

tomato-salada

総合スコア68

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Z-TALBO

2016/04/29 02:48

そのデータの異なりに関して、追記してみますので見ていただけますか?
tomato-salada

2016/04/29 05:00

Cells(Rows.Count, "rc").End(xlUp).Row ”rc”には、列の数値が入らないといけないので、これだとエラーになると思うのですが。 Cells(Rows.Count, 11).End(xlUp).Row は、11列目(K列)の最下端行からみて次に値が入っているセルの行を取得するコマンドです。 http://officetanaka.net/excel/vba/tips/tips130.htm 時間が正しく計算されない件に関しては以下を参照下さい。 シリアルの計算ははまりやすいです。 http://excel-ubara.com/excel3/EXCEL027.html http://oshiete.goo.ne.jp/qa/8386270.html
Z-TALBO

2016/04/29 06:17

すみません、rcの部分はいろいろ間違えてる部分がありました。。。 少し、いろいろ参考に検証してみます。
guest

0

投稿2016/04/29 00:32

wakuwaku

総合スコア386

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Z-TALBO

2016/04/29 02:47

回答ありがとうございます。 表示というより、どうもそもそもの計算の部分が間違ってしまっているようで、、、
guest

0

同一範囲内を書き換える仕様でよろしいでしょうか?
かなり簡単に、また力ずくですがWorksheetFunctionで無理やり集計しています。
対象範囲内にデータが存在しない前提です。

VBA

1Sub test() 2Dim i As Long, imax As Long 3Dim j As Long 4 5Dim tmp As String 6 7imax = Cells(Rows.Count, "A").End(xlUp).Row 8j = 1 9 10For i = imax + 1 To 2 Step -1 11 12If Range("A" & i).Value <> Range("A" & i - 1).Value Then 13Range("A" & i & ":B" & i).Insert Shift:=xlDown 14Range("A" & i).Value = "合計" 15Range("B" & i).Value = Application.WorksheetFunction.SumIf(Range("A1:A65536"), Range("A" & i - 1).Value, Range("B1:B65536")) 16End If 17Next i 18 19End Sub 20 21

投稿2016/04/28 09:40

tomato-salada

総合スコア68

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Z-TALBO

2016/04/28 10:13

すみません、検証せずに間違えてBAがついております。 検証後またコメントいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問