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

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

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

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

Q&A

解決済

2回答

1881閲覧

VBA セル値からシート検索&作成の条件分岐

jabe

総合スコア43

VBA

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

0グッド

0クリップ

投稿2020/03/29 04:21

前提・実現したいこと

イメージ説明
リスト表シートのシートパターン(A7以降)行毎に、シートを作成して対象シート内にオートシェイプを作成
させたいです。
<条件>
・作成シートはカラオケシートをコピーして、シート名をシートパターン名に変更
・シートパターン種類は3種類(正面2、側面4、平面6)
・同一シートがある場合は、シートを作成せずに同一シートへオートシェイプのみ作成
例.添付画像を実行した場合、8、10、12行はシートは作成されず、対象シートへオートシェイプのみ作成

VBA

1Sub シート作成andオートシェイプ作成() 2 Dim i As Integer '行カウンタ 3 Dim k As Integer '数量カウンタ 4 Dim o As Long 'シートカウンタ 5 Dim list As Worksheet 'リスト表 6 Dim Tl As Worksheet 'カラオケシート 7 Dim zukei As Shape '図形 8 Set list = Worksheets("リスト表") 9 Set Tl = Worksheets("カラオケ") 10 11 lastR = list.Cells(Rows.Count, "B").End(xlUp).Row 'シートリスト B列のセル入力済最終行を定義 12 lastC = list.Cells(2, Columns.Count).End(xlToLeft).Column 'シートリスト B列のセル入力済最終行を定義 13 14 For i = 7 To lastR '7行目から1行ずつ処理 15 16 For o = ActiveSheet.Index + 1 To Sheets.Count '同一シート検索 17 If Sheets(o).Name Like Cells(i, 1).Value Then 18 X = Cells(i, 3).Value '横 19 Y = Cells(i, 4).Value ' 縦 20 Z = Cells(i, 5).Value ' 品名 21 kazu = ActiveSheet.Cells(i, 6) 22 iro = ActiveSheet.Cells(i, 7) 23 For k = 1 To kazu 24 25 Set zukei = Shapes _ 26 .AddShape(msoShapeRectangle, 800, 30, X * 1.95, Y * 1.95) '正面2シートへ図形作成 27 28 With zukei 29 .TextFrame.Characters.Text = X & "×" & Y & vbCrLf & Z '図形へテキスト入力 30 .TextFrame.Characters.Font.Size = 15 'テキスト文字フォント変更 31 .TextFrame.Characters.Font.ColorIndex = 1 'テキスト文字色変更 32 .TextFrame.HorizontalAlignment = xlHAlignCenter 'テキスト文字水平中央 33 .TextFrame.VerticalAlignment = xlVAlignCenter 'テキスト文字垂直中央 34 End With 35 36 Next k 37 38 Else 39 Tl.Copy after:=Worksheets(Worksheets.Count) 40 ActiveSheet.Name = list.Cells(i, 1).Value 41 42 End If 43 44 Next o 45 46 Next i 47 48 End Sub

試したこと

・シート名を重複させず、作成しようと試みたのですができませんでした。
・構文も分かりませんでした。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

meg_

2020/03/29 04:40

「ActiveSheet」は操作によって変わってしまうので、あまり使わない方が良いかと思います。 「For o = ActiveSheet.Index + 1 To Sheets.Count」ここでの使用は危険な気がしますが。。
jabe

2020/03/30 11:55

アドバイスありがとうございます。
guest

回答2

0

自分が作るなら下記のような方針で実装します。

シートの存在チェックは別関数にする。
ついでに、存在していない場合は、その関数内でシートをコピー追加する。
関数の戻り値でそのシートを返す。

存在チェックはループで回すのも一つの方法だが、とりあえず取得してみてエラーなら存在しないと判断するという方法だとシンプルになる。

ということで、この方針で作成したものが下記です。

vba

1Option Explicit 2 3Sub シート作成andオートシェイプ作成() 4 Dim list As Worksheet 'リスト表 5 Set list = Worksheets("リスト表") 6 Dim Template As Worksheet 7 Set Template = Worksheets("カラオケ") 8 9 Dim lastR As Long 10 lastR = list.Cells(Rows.Count, "B").End(xlUp).Row 'シートリスト B列のセル入力済最終行を定義 11 Dim i As Long, j As Long 12 For i = 7 To lastR '7行目から1行ずつ処理 13 14 Dim x As Long, y As Long, z As String, kazu As Long 15 x = list.Cells(i, 3).Value '横 16 y = list.Cells(i, 4).Value ' 縦 17 z = list.Cells(i, 5).Value ' 品名 18 kazu = list.Cells(i, 6) 19 20 Dim aWS As Worksheet '追加シート 21 Set aWS = CopySheet(list.Cells(i, 1).Value, Template) 22 For j = 1 To kazu 23 With aWS.Shapes _ 24 .AddShape(msoShapeRectangle, 800, 30, x * 1.95, y * 1.95) '正面2シートへ図形作成 25 .TextFrame.Characters.Text = x & "×" & y & vbCrLf & z '図形へテキスト入力 26 .TextFrame.Characters.Font.Size = 15 'テキスト文字フォント変更 27 .TextFrame.Characters.Font.ColorIndex = 1 'テキスト文字色変更 28 .TextFrame.HorizontalAlignment = xlHAlignCenter 'テキスト文字水平中央 29 .TextFrame.VerticalAlignment = xlVAlignCenter 'テキスト文字垂直中央 30 End With 31 Next j 32 Next i 33 34End Sub 35 36'指定した名前のワークシートを取得 37'存在しなければ、TemplateSheetをコピーして名前変更して取得 38Private Function CopySheet(SheetName As String, TemplateSheet As Worksheet) As Worksheet 39 On Error Resume Next 40 Set CopySheet = Worksheets(SheetName) 41 On Error GoTo 0 42 If CopySheet Is Nothing Then 43 TemplateSheet.Copy after:=Worksheets(Worksheets.Count) 44 ActiveSheet.Name = SheetName 45 Set CopySheet = ActiveSheet 46 End If 47End Function

投稿2020/03/29 14:00

hatena19

総合スコア33699

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

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

jabe

2020/03/30 12:02

コード作成ありがとうございます。 狙いどうりの動作になりました。 functionの意味を理解出来ていませんでしたので、こちらのコードを解読出来る様に勉強させていただきます。
jabe

2020/03/31 13:00

すいません教えてください。 On Error Resume Next On Error GoTo 0 ↑エラーをスルーする構文がある理由は何になるのでしょうか?
jabe

2020/03/31 13:18

もう一点教えてください。 シート検索して有り無し判断のif文ですが、copysheet変数の中身が有るか無いかの判断で、シート内検索が出来ているロジックを教えてください。知識不足で以下構文の理由が分からなくて。 If CopySheet Is Nothing The
hatena19

2020/04/01 00:48 編集

CopySheet関数ではシートの存在チェックをしていて、存在すればそのシートを戻り値として返す、 存在しなければ、テンプレートシートをコピーして名前変更してそれを返す、という処理をしています。 Set CopySheet = Worksheets(SheetName) で指定した名前のシートを戻り値(CopySheet)に代入します。 もし、指定した名前のシートが存在しなければエラーになりますが、上のコードでエラーを無視するようにしてますので、スルーして次のコードへ進みます。 If CopySheet Is Nothing Then エラーでCopySheetに代入できていなかったら、中身がないので Nothing になっています。つまり、指定した名前のシートは存在しなかったと判断できます。
guest

0

ベストアンサー

コメントにある通りActiveSheetは現在のシートがわかりにくくなるので使わない方がいいでしょうね。
また同一シート判定は判定フラグを用意してFor文を回してから、同一シートがあるかないかの処理をした方がいいと思います。

vba

1Sub シート作成andオートシェイプ作成() 2 Dim i As Integer '行カウンタ 3 Dim k As Integer '数量カウンタ 4 Dim o As Long 'シートカウンタ 5 Dim list As Worksheet 'リスト表 6 Dim Tl As Worksheet 'カラオケシート 7 Dim ash As Worksheet 'オートシェイプ追加シート 8 Dim zukei As Shape '図形 9 Dim shchk As Boolean '同一シート名チェックフラグ 10 Set list = Worksheets("リスト表") 11 Set Tl = Worksheets("カラオケ") 12 13 lastR = list.Cells(Rows.Count, "B").End(xlUp).Row 'シートリスト B列のセル入力済最終行を定義 14 lastC = list.Cells(2, Columns.Count).End(xlToLeft).Column 'シートリスト B列のセル入力済最終行を定義 15 16 For i = 7 To lastR '7行目から1行ずつ処理 17 18 shchk = False 19 For Each objSheet In ThisWorkbook.Worksheets '同一シート検索 20 If objSheet.Name Like list.Cells(i, 1).Value Then 21 Set ash = objSheet 22 shchk = True 23 Exit For 24 End If 25 Next 26 27 If shchk = True Then 28 X = list.Cells(i, 3).Value '横 29 Y = list.Cells(i, 4).Value ' 縦 30 Z = list.Cells(i, 5).Value ' 品名 31 kazu = list.Cells(i, 6) 32 iro = list.Cells(i, 7) 33 For k = 1 To kazu 34 35 Set zukei = ash.Shapes _ 36 .AddShape(msoShapeRectangle, 800, 30, X * 1.95, Y * 1.95) '正面2シートへ図形作成 37 38 With zukei 39 .TextFrame.Characters.Text = X & "×" & Y & vbCrLf & Z '図形へテキスト入力 40 .TextFrame.Characters.Font.Size = 15 'テキスト文字フォント変更 41 .TextFrame.Characters.Font.ColorIndex = 1 'テキスト文字色変更 42 .TextFrame.HorizontalAlignment = xlHAlignCenter 'テキスト文字水平中央 43 .TextFrame.VerticalAlignment = xlVAlignCenter 'テキスト文字垂直中央 44 End With 45 46 Next k 47 48 Else 49 Tl.Copy after:=Worksheets(Worksheets.Count) 50 ActiveSheet.Name = list.Cells(i, 1).Value 51 52 End If 53 54 55 Next i 56 57End Sub 58

投稿2020/03/29 07:16

yureighost

総合スコア2183

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

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

jabe

2020/03/30 12:00

コード作成いつもありがとうございます。 狙いどうりの動作になりました。 判定フラグをたてて、for文という考え方がなかったので勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問