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

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

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

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

Q&A

解決済

2回答

418閲覧

VBAで必要データ(セル)を取得

kitten

総合スコア25

VBA

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

0グッド

0クリップ

投稿2019/06/14 05:52

編集2019/06/14 06:55

前提・実現したいこと

まず最終的にやりたいことですが
複数Sheetに渡ってある同形式の表から必要箇所(セルデータ)をもってきて
それを1つのSheetに縦方向に結合した表を作成することです。

▼イメージ図
イメージ説明

上で説明した必要データを持ってきて縦に結合という処理は
既にできているのですが、その処理の中で想定通りに動かない
(処理を書いてないので当たり前ですが)
部分があるのでそこの記述の仕方を教えて頂きたく思います。


以下の2つの画像(1枚目が処理前、2枚目が処理後)を使って説明します。

尚、色付きセルは必要データでbefore1それぞれの色はafterに対応しています。

▼処理前Sheet(複数あるうちの1Sheet(before1))
処理前
▼処理後Sheet(after)
処理後


ここで、処理前Sheetの26、27行目と処理後Sheetの9、10行目を見て頂きたいのですが
個々の部品は親部品2つに対して子部品が2つあります。
しかし画像だと、子部品が次の列に移らず同じデータを取ってきています。
これを子部品と同じ数だけ親部品も下にコピーしたいのです。

これまた分かりにくい説明だと思うので画像も確認お願いします。

イメージ説明


説明が下手すぎて伝わっていない部分もあるはずなので
補足をしながら解決できたらと思います。
ご協力よろしくお願いします。

該当のソースコード

VBA

1 2Sub シート別データ結合テスト() 3 4Dim sht0 As Worksheet, sht1 As Worksheet 5Dim i As Long 6Dim j As Long 7Dim Frm As Long 8Dim C_Column As String 9Dim D_Column As Long 10Dim N_Column As String 11Dim P_Column As String 12Dim Q_Column As String 13Dim S_Column As Double 14 15j = 5 16 17'''''''''''''''''' メイン処理 '''''''''''''''''' 18 19Set sht1 = Sheets("after") 20 21 For Each sht0 In ThisWorkbook.Sheets 22 23 If sht0.Name <> sht1.Name Then 24 For i = 8 To 60 Step 2 25 If (sht0.Cells(i, 14).Value) = "" Then 26 '何もしない 27 Else 28 If sht0.Cells(i, 3).Value = "" Then 29 '何もしない 30 Else 31 C_Column = sht0.Cells(i, 3).Value 32 D_Column = sht0.Cells(i, 4).Value 33 N_Column = sht0.Cells(i, 14).Value 34 P_Column = sht0.Cells(i, 16).Value 35 Q_Column = sht0.Cells(i, 17).Value 36 S_Column = sht0.Cells(i + 1, 19).Value 37 End If 38 sht1.Cells(j, 1) = C_Column 39 sht1.Cells(j, 2) = D_Column 40 sht1.Cells(j, 3) = N_Column 41 sht1.Cells(j, 4) = P_Column 42 sht1.Cells(j, 5) = Q_Column 43 sht1.Cells(j, 6) = S_Column 44 sht1.Cells(j, 7) = sht0.Name 45 sht1.Cells(j, 8) = i 46 j = j + 1 47 End If 48 Next 49 End If 50 Next sht0 51 52'''''''''''''''''' フォーマット設定 '''''''''''''''''' 53 54 For Frm = 1 To 1000 55 56 With Cells(Frm, 2) 57 .NumberFormatLocal = "@" 58 .Value = Format(.Value, "000") 59 End With 60 61 With Cells(Frm, 4) 62 .NumberFormatLocal = "@" 63 .Value = Format(.Value, "000") 64 End With 65 66 With Cells(Frm, 6) 67 .NumberFormatLocal = "@" 68 .Value = Format(.Value, "##0.0000") 69 End With 70 71 Next Frm 72End Sub

すみません。もう少し簡潔に書かせていただきます。

以下のような表があったとして
イメージ説明

ソースでは、まずN列のセルが空文字でないか判定し
空文字でないつまりデータがあれば次の処理に移り
C列が空文字かどうかを判定しています。
そして、それもFalseなら初めて処理が実行されるようになっています。

今回やりたいのは、この処理に加えて
上の表のC列が空文字なら空白行分、一番最初の空文字セルの2つ上の値と
同じものを空文字でなくなるまで値を移し、子部品はこの表であれば
4部品分データを取得して値を移したいと思っています。

この画像が処理後実現したい表になります。

イメージ説明

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

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

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

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

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

guest

回答2

0

ベストアンサー

C列が空白の時、D列の情報もN列の情報もP列の情報も無視しているからです。

If sht0.Cells(i, 3).Value = "" Then '何もしない Else C_Column = sht0.Cells(i, 3).Value D_Column = sht0.Cells(i, 4).Value N_Column = sht0.Cells(i, 14).Value P_Column = sht0.Cells(i, 16).Value Q_Column = sht0.Cells(i, 17).Value S_Column = sht0.Cells(i + 1, 19).Value End If

これではC列が空白の時は、D_Columnなども更新されない為
一つ前の情報をそのまま書くことになります。

考え方は色々ありますがベタ打ちするなら、

If sht0.Cells(i, 3).Value <> "" Then C_Column = sht0.Cells(i, 3).Value End If If sht0.Cells(i, 4).Value <> "" Then D_Column = sht0.Cells(i, 4).Value End If If sht0.Cells(i, 14).Value <> "" Then N_Column = sht0.Cells(i, 14).Value End If '以下同様

これでその項目が空白の時は
一つ前の情報を書くようになります。

投稿2019/06/14 06:54

torisan

総合スコア678

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

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

kitten

2019/06/14 07:08

ありがとうございます! 無事解決いたしました!
guest

0

最後の画像をみる限りだと、パターンがしっかり決まっているから、まだ楽だと思います。
ひとまず2つの構造体作って、試すのが良いと思います。
サンプルですが下記のような感じで組めば良いと思います。

VBA

1Type ColumnAB 2 ColumnA As String 3 ColumnB As String 4End Type 5 6Type ColumnDFGI 7 ColumnD As String 8 ColumnF As String 9 ColumnG As String 10 ColumnI As String 11End Type 12 13//少し省略 14For rawCount To rawMax Step 2 15 CA = sht0.Cells(rawCount, 1).Value 16 CB = sht0.Cells(rawCount, 1).Value 17 if //CAとCBが空白でない場合 Then 18 columnAB.ColumnA = CA 19 columnAB.ColumnB = CB 20 Endif 21 22 ColumnDFGI.ColumnD = sht0.Cells(rawCount, 4).Value 23 ColumnDFGI.ColumnF = sht0.Cells(rawCount, 14).Value 24 ColumnDFGI.ColumnG = sht0.Cells(rawCount, 16).Value 25 ColumnDFGI.ColumnI = sht0.Cells(rawCount + 1, 17).Value 26 27 //あとはA,B,D,F,G,Iのセルに渡すだけなので省略 28Next rawCount

投稿2019/06/14 07:14

stdio

総合スコア3307

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問