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

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

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

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

Q&A

解決済

3回答

1405閲覧

VBA 行の挿入に関して

QueCho

総合スコア13

VBA

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

0グッド

0クリップ

投稿2019/04/15 03:14

前提・実現したいこと

各商品の出庫と入庫の下にそれぞれ金額行を作成し、
一番下に出庫と入庫の各合計金額行を作成し、
値を入れるマクロを作成したいです。

B3:AJ55までの1か月分の入出庫状況のテーブルが存在していて、
B列:型番名
C列:商品名
D列:入出庫の各単価
E列:各商品3行ずつで区切られていてE5=入庫、E6=出庫、E7=在庫を以下ループ
F列:E列に対応した先月繰越
G列~AI列:日にちごとの入庫・出庫・在庫数
AJ列:1月分各行合計

3行:日付
4行:項目 G列以降は曜日
5行:B、C列は型番、商品名 以下入庫に関する値
6行:D列以降出庫に関する値
7行:E列以降在庫に関する値

以降5~7行の内容をを型番・商品名・単価等を変えて繰り返し
商品数は17

わかりづらいと思いますが宜しくお願い致します。

発生している問題・エラーメッセージ

出庫と入庫の下にそれぞれ金額行を挿入するところで躓いています。 1つ目の商品の場合、新たに6,8行目に挿入したいです。

該当のソースコード

Sub 問題()

Dim i As Long, j As Long, k As Long ' カウンタ Dim buf(100, 100) As String Dim cmax, rmax As Long cmax = ws1.Cells(1, Columns.Count).End(xlToLeft).Column rmax = ws1.Cells(Rows.Count, 1).End(xlUp).Row ' 行の挿入 転記 For i = 7 To rmax Step 5 '行の挿入 Rows(i).Insert ' セルの値を代入 For k = 6 To cmax + 1 buf(i + 1, k) = Cells(i + 1, k).Formula Cells(i + 1, k).Select Next ' 行の挿入 Rows(i).Insert ' セルに値を代入 Cells(i + 1, 5).Value = Cells(i + 2, 5).Value For k = 6 To rmax + 1 Cells(i + 1, k).Select Cells(i + 1, k).Formula = buf(i + 1, k) Next ' セルの値を削除 Range(Cells(i + 2, 5), Cells(i + 2, rmax + 1)).ClearContents ' セルの値と数式代入 Cells(i, 5).Value = "金額" Cells(i + 2, 5).Value = "合計" For k = 6 To rmax Cells(i, k).Value = _ Cells(i - 1, 4).Value * Cells(i - 1, k).Value Cells(i + 2, k).Value = _ Cells(i - 1, 4).Value * Cells(i - 1, k).Value _ - Cells(i - 2, 4).Value * Cells(i - 2, k).Value Next Next

End Sub

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

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

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

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

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

guest

回答3

0

自己解決

Dim i As Long, j As Long, k As Long ' カウント
Dim ws1, ws2 As Worksheet
Set ws1 = Worksheets("sheet1") '別紙①
Set ws2 = Worksheets("sheet2") '商品情報

Dim cmax, rmax As Long cmax = ws1.Cells(5, Columns.Count).End(xlToLeft).Column rmax = ws1.Cells(Rows.Count, 7).End(xlUp).Row ' 行の挿入 転記 For i = rmax To 7 Step -3 If Cells(i, 5).Value = "在庫" Then '行の挿入 Rows(i).Insert rmax = rmax + 1 End If If Cells(i - 1, 5).Value = "出庫" Then Rows(i - 1).Insert rmax = rmax + 1 End If ' セル値を代入 For k = 6 To cmax Cells(i + 1, k).Value = Cells(i, 4) * Cells(i, k) Next k ' セル値を代入 For k = 6 To cmax Cells(i - 1, k).Value = Cells(i - 2, 4) * Cells(i - 2, k) Next k ' セルの値と数式代入 Cells(i + 1, 5).Value = "出庫金額" Cells(i - 1, 5).Value = "入庫金額" Next i

End Sub

投稿2019/04/15 06:29

QueCho

総合スコア13

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

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

0

VBA

1Dim cmax, rmax As Long 2cmax = ws1.Cells(1, Columns.Count).End(xlToLeft).Column 3rmax = ws1.Cells(Rows.Count, 1).End(xlUp).Row 4 5' 行の挿入 転記 6For i = 7 To rmax Step 5

ここのプログラムですが知っておきたいVBAの基礎的な知識が身に付いていません。
Dim cmax, rmax As LongではなくDim cmax As Long, rmax As Longと書かないとcmaxはLong型ではなく正確にはVariant型になっています。

後はhatena19さんの言われている通り、セルに追加するのは危険がいっぱいです。
追加した分rmaxを増やすか、2次元配列で一時的に別の空間に確保してからシートを全消ししてから書き直すという方法に変えて下さい。

投稿2019/04/15 05:07

stdio

総合スコア3307

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

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

QueCho

2019/04/15 05:31

回答していただきありがとうございます。 As Longについては記載ミスです。申し訳ありません。 追加した分rmaxを増やす際にこの場合iの処理1回につき2行増えると思うのですが 一般的にどのように記述するのでしょうか?
stdio

2019/04/15 05:44

一般的と言うか...VBAはやり方一つしかないよ。 rmax = rmax + 1 これで+1だから、+2はどのように記載するでしょう?
guest

0

コードの細かいところは読んでませんが、
行を挿入する場合、挿入以降の行は下にずれます、当然、最終行も下にどんどんずれていきます。
それを考慮する必要がありますが、提示のコードでは最初に取得した最終行(rmax)が固定のままです。

通常、行を挿入しながらループ処理する場合は、
For Next を使うなら最終行から上に向かってループ処理する、
あるいは Do Loop で下に向かって処理していき、カレント行の値が未入力になったら終了、
というロジックにします。

投稿2019/04/15 04:35

hatena19

総合スコア33699

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

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

QueCho

2019/04/15 05:26

回答していただきありがとうございます。For Nextを用いて最終行から上に向かってループ処理してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問