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

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

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

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

Q&A

解決済

2回答

1666閲覧

VBA あるセルの右上のセルが空白でないとき、あるセルの上から右10列にわたって行を挿入したい

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

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

0グッド

1クリップ

投稿2020/10/05 02:14

編集2020/10/05 05:12

目的はサブフォルダまでまとめてマクロで自動作成するために、エクセルに作成したフォルダ構成一覧表を自動作成用に調整する作業を自動化することです。
まず、フォルダ構成一覧表は以下の形式で作成する予定です。

|第一階層|第二階層|第三階層|第四階層|
|:--|:--:|--:|
|A|1|①|ア|     
||2|①|ア|
|||②|ア
|B|1|①|ア

ただ、フォルダを自動で作成する際、下のマクロを使用するつもりですが、各階層ごとに行をずらす必要があります。
|第一階層|第二階層|第三階層|第四階層|
|:--|:--:|--:|
|A||||     
||1|||
|||①||
||||ア|
||2|||
|||①||
||||ア|
|||②|
||||ア
|B|||
||1||
|||①|
||||ア

このずらす内容を言葉で表すと
「第一階層列の文字が入力されているセルの右上に文字が入力されている場合、第一階層から第四
階層まで行挿入、下のセルを探しに行き繰り返す。次に第二階層でも同様の探索を行い、行挿入の範囲だけ第二階層から第四階層までに変更。以降繰り返し」になりますが、これをマクロで作成する方法が分からないので質問しました。

ただ、そもそもフォルダ作成時に表の調整が必要な下のマクロを使うのではなく、ほかにも良い方法があればそちらをご紹介いただけると幸いです。
よろしくお願いいたします。

Option

1 2Sub makefolder() 3 Dim i As Long, cmax As Long, x As Long, z As Long, cnt As Long, j As Long, k As Long 4 Dim ws1 As Worksheet 5 Dim str As String, url As String 6 Dim s As String, s1 As String 7 Dim n1 As Long 8 9 Dim fs As FileSystemObject 10 Set fs = New Scripting.FileSystemObject 11 12 Set ws1 = Worksheets("A") 13 14 cmax = ws1.Range("A65536").End(xlUp).Row 15 cnt = ws1.Range("IV4").End(xlToLeft).Column 16 '[1] セルB2にURLが記載されているかチェック 17 If ws1.Range("B2").Value = "" Then 18 MsgBox "セルB2に「作成先のフォルダURL」を入力して下さい" 19 ws1.Range("B2").Activate 20 Exit Sub 21 End If 22 url = ws1.Range("B2").Value 23 '[2] 同じ行に複数回記入されていないことを確認 24 For i = 5 To cmax 25 x = 0 26 For j = 0 To cnt - 2 27 If ws1.Range("B" & i).Offset(0, j).Value <> "" Then 28 x = x + 1 29 End If 30 Next 31 If x > 1 Then 32 z = z + 1 33 End If 34 Next 35 '[3] 同じ行に複数回記入されていた場合、処理を止める 36 If z > 0 Then 37 MsgBox "入力情報を見直してください" 38 Exit Sub 39 End If 40 '[4] 階層別にフォルダを作成する 41 For j = 0 To cnt - 2 42 For i = 5 To cmax 43 s = "" 44 If ws1.Range("B" & i).Offset(0, j).Value <> "" Then 45 s1 = ws1.Range("B" & i).Offset(0, j).Value 46 For k = 0 To j 47 If k - j = 0 Then 48 Exit For 49 End If 50 n1 = ws1.Range("B" & i).Offset(0, j - k - 1).End(xlUp).Row 51 s1 = ws1.Range("B" & n1).Offset(0, j - k - 1).Value & "\" & s1 52 Next 53 s = url & "\" & s1 54 fs.CreateFolder s 55 End If 56 Next 57 Next 58 Set fs = Nothing 59End Sub 60 61 62 63 64 65コード

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

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

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

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

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

meg_

2020/10/05 02:22

やりたいことは下記のどちらでしょうか? > 主目的はエクセルにフォルダ構成一覧表を作成し > フォルダを自動で作成する際
ttyp03

2020/10/05 02:42

> あるセルの上から右10列にわたって行を挿入したい > 第一階層から第四階層まで行挿入 列の話をしているのに行挿入になるのがわかりません。 手作業で言うと「セルの挿入→下方向にシフト」のことでしょうか?
ttyp03

2020/10/05 02:43

あとmeg_さんもおっしゃってますが、表を作成したいのか、できている表を元にフォルダを作成したいのか、どっちなんでしょうか?
退会済みユーザー

退会済みユーザー

2020/10/05 04:05

>meg やりたいことは「第一階層列の文字が入力されているセルの右上に文字が入力されている場合、第一階層から第四階層まで行挿入、下のセルを探しに行き繰り返す。次に第二階層でも同様の探索を行い、行挿入の範囲だけ第二階層から第四階層までに変更。以降繰り返し」です。わかりにくくて申し訳ないです。 >ttyp03 >手作業で言うと「セルの挿入→下方向にシフト」のことでしょうか? おっしゃる通りです
退会済みユーザー

退会済みユーザー

2020/10/05 04:08

フォルダ構成(ディレクトリ)を取得すると次のサイトのように表示されます。 https://qiita.com/ditflame/items/d6c96ac60a0665cb1bcd 最終的にやりたいことは逆で、表示されている状態からフォルダを作成するのですが、質問内の表を「表示されている状態」に行挿入等で調節する必要があり、その調節方法を今回質問させていただいてます。
Usirow

2020/10/05 04:17

すみません。 質問内容やここでのやり取りを見るに、質問で提示されている表は最終的に求めているものではないという風に読めるのですが、そのような理解でいいのでしょうか。
退会済みユーザー

退会済みユーザー

2020/10/05 05:06

>Usirow おっしゃる通りです。ややこしくて申し訳ありません。
hatena19

2020/10/05 05:06

マクロ実行前の表と、実行後の表を提示してもらうと、皆さんに伝わりやすいかも。
退会済みユーザー

退会済みユーザー

2020/10/05 05:12

>hatena19 ちょうど書き直していました。おっしゃる通りです。
meg_

2020/10/05 05:16

階層は「第四階層」で打ち止めですか?
退会済みユーザー

退会済みユーザー

2020/10/05 23:04

>meg_ 5階層で打ち止めにします。最初は「エクセルに記入があるだけ」を考えておりましたが、5階層以下は使用しないようにするので5階層まででお願いいたします。
guest

回答2

0

データを配列に格納してから、出力する方法にしてみました。

vba

1Public Sub test() 2 Dim rngData As Range 3 Set rngData = Range("A1").CurrentRegion 4 Set rngData = rngData.Offset(1).Resize(rngData.Rows.Count - 1) 'データ範囲を取得 5 6 Dim aryData 7 aryData = rngData.Value 'データ範囲を配列に格納 8 rngData.ClearContents 9 10 Dim r As Long, c As Long, outR As Long 11 12 outR = 1 13 For r = 1 To UBound(aryData) 14 For c = 1 To UBound(aryData, 2) 15 If aryData(r, c) <> "" Then 16 outR = outR + 1 17 Cells(outR, c).Value = aryData(r, c) 18 End If 19 Next 20 Next 21 22End Sub

1行目は項目名で2行目からデータが入力されているとします。

投稿2020/10/05 07:08

hatena19

総合スコア33782

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

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

ttyp03

2020/10/05 07:12

やっぱり配列化したほうが処理が楽ですね。
退会済みユーザー

退会済みユーザー

2020/10/05 23:11

こちらでも同じようにやりたいことができました!ありがとうございます!
guest

0

ベストアンサー

なんとなく「各行に1つのフォルダが存在するように編集する」という風に読み取れましたが、あっていますでしょうか?
で、書いてみたのが以下。
ディレクトリ作成と同時に行う必要はないと思うので、作成が終わってから実行するように組み込んでみてください。

VBA

1Sub test() 2 Dim r As Long 3 Dim c As Long 4 Dim c2 As Long 5 Dim lc As Long 6 r = 2 7 Do While Application.WorksheetFunction.CountA(Rows(r)) > 0 8 lc = Cells(r, Columns.Count).End(xlToLeft).Column 9 For c = 1 To lc - 1 10 If Cells(r, c).Value <> "" Then 11 Rows(r + 1).Insert 12 For c2 = c + 1 To lc 13 Cells(r + 1, c2).Value = Cells(r, c2).Value 14 Cells(r, c2).ClearContents 15 Next 16 r = r + 1 17 End If 18 Next 19 r = r + 1 20 Loop 21End Sub 22

投稿2020/10/05 05:21

ttyp03

総合スコア16998

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

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

ttyp03

2020/10/05 05:24

あ、追加の質問編集があったようですね。 イメージ通りでした。
退会済みユーザー

退会済みユーザー

2020/10/05 23:10

まさしくやりたいことができました!ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問