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

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

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

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

Q&A

1回答

425閲覧

ExcelVBAで表作り

JUN_FOX

総合スコア7

VBA

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

0グッド

0クリップ

投稿2019/10/07 15:23

編集2019/10/07 22:07

観覧いただきありがとうござます。
現在仕事で一覧シートを基にチェックシートを作成しようかとしているのですがその時のマクロで不明点があるため質問いたします。(自宅のPCにはExcelが入っていないためスプレットシートですが空気感だけでも感じていただければと思います。)

↓作成したいチェックシートのイメージ↓
![ 作成する表のイメージ
↓表作成の素材↓
![表作成の時の素材

以下現在のコード(一部抜粋

VBA

1'sheetをセット 2Dim ws1,ws2 As Worksheet 3Set ws1 = sheets("一覧") 4Set ws2 = sheets("check") 5 6'変化する数字をセット 7Dim c As Long 8c = 4 9'一覧のB4から下へ空白までループ 10Do While ws1.Cells(c,2).Value<>"" 11’一覧から2つの単語を含むセルを探し〇×表へ反映 12If Instr(ws1.Cells(c,4).Value"app") And InStr(ws1.Cells(c,4).Value"102")<>0 Then 13 '条件を満たせばchecksheetのB5へ〇満たせないなら×を 14 ws2.Cells(5,2).Value = "〇" 15 Exit Do 16 Else 17 ws2.Cells(5,2).Value = "×" 18End If 19c = c+1 20Loop 21

これをapp等(一覧画像のA5から下)の13種、102等(一覧画像のB4から右)の30種ありすべてを上記のようにベタ打ち力技で作りました。
しかしこれでは何かある度に膨大な量の修正&見逃しがないか何重もの確認を強いられどうにか簡単にできないか悩んでおります。
現在やってみたのは
[If Instr(ws1.Cells(c,4).Value"app") And InStr(ws1.Cells(c,4).Value"102")<>0 Then]
このコードを
[If Instr(ws1.Cells(c,4).Value"ws2.Cells(5,1)") And InStr(ws1.Cells(c,4).Value"ws2.Cells(4,2)")<>0 Then]
こんな感じで表から引用して済む様な仕組みにしたいと考え動いてみたのですがセル番地の指定、中の取り出し、1巡したら1つずらしてLoop。これをどう表現したらいいのかわからず困っています。
どうか参考になるサイトや考え方のこ教授お願いいたします。

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

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

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

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

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

hatena19

2019/10/07 19:43 編集

> コードと添付画像の結果に矛盾がありますが気にせずお願いします。 構文エラーで動作しないコード、かつ、矛盾した添付画像からでは、 気にせずにと言われても、回答しようかないかと。 あと、比較元は必ず101から始まるのですか。 比較対象も先頭3桁は必ず数字なのでしょうか。またC列はすべてTrueなんですか。True/Falseがある場合は、結果表に影響するのですか。
JUN_FOX

2019/10/07 22:10

修正しました。 >あと、比較元は必ず101から始まるのですか。 比較元は101のみですがこの101が変わる可能性があります。 >比較対象も先頭3桁は必ず数字なのでしょうか。またC列はすべてTrueなんですか。 比較対象も変わる可能性があり、必ず数字や特定文字数等の決まりがない状況です。 C列はTrueのみです。Falseは別シートで管理しています。
mattuwan

2019/10/07 23:49

質問は、リスト形式の表をクロス集計表形式にして出力したい、 という質問ですか? あと、クロス集計表の表側、及び表頭の項目はすでにあるのですか? それともそれを含めてマクロで自動作成のイメージでしょうか?
JUN_FOX

2019/10/08 00:57

クロス集計表という単語を初めて聞きまして調べてみましたがそういうことになりますね。 表側、表頭は変更する可能性がありますが一応あります。
hatena19

2019/10/08 01:36

まだ提示のコードの構文エラーが修正されていません。 あと、「比較対象」の列のデータのみが検索対象ですか。他の列のデータは無視してよいですか。 あと、チェック表の「横見出し」と「横見出し」を連結したものを検索すればいいのですか。 つまりB5セルなら、「102app」を検索すればいいのか、それとも 102 と app を含むもの例えば「xx102xxappxx」というようなデータも存在する可能性があり検索対象にするのですか。
tatsu99

2019/10/08 03:59

もし、一覧シートのA5が101appでなく101APXだとしたら、 チェックシートのC5は何がセットされるべきなのでしょうか? ○、×のどちらでしょうか。(それとも△)
JUN_FOX

2019/10/08 04:14

一覧に該当のものがあれば○、なければ×の選択肢は2つなので101.appで検索かけることになるのてc5は×になりますね
tatsu99

2019/10/08 05:20

>>あと、比較元は必ず101から始まるのですか。 >比較元は101のみですがこの101が変わる可能性があります。 ということですが、101が変わった場合は、(例えば201になったら)、201.appで検索をかけるのでしょうか。つまり、マクロの修正をおこなうということでしょうか。
tatsu99

2019/10/08 05:25

もし、一覧シートのB5が103appでなく102appだった場合は、前の行にも102appがあることになります。 この場合、チェックシートのC5(103の欄)は当然×ですが、B5(102の欄)は○で良いのでしょうか。
guest

回答1

0

>表側、表頭は変更する可能性がありますが一応あります。

そこを最初に決める必要があると思います。
クロス集計表の記入欄を巡回し、
該当の物を一覧からシート上のMatch関数で検索してみました。

ステップイン等で研究してみてください。

ExcelVBA

1Sub test() 2 Dim rngFind As Range 3 Dim rngTableBody As Range 4 Dim c As Range 5 Dim sKeyWord As String 6 7 '各セル範囲の取得 8 Set rngFind = Worksheets("一覧").Range("A4").CurrentRegion.Columns(2) 9 With Worksheets("チェック").Range("A4").CurrentRegion 10 Set rngTableBody = Intersect(.Cells, .Offset(1, 1)) 11 End With 12 13 '書き込み位置を巡回して 14 With rngTableBody 15 For Each c In .Cells 16 '該当文字を 17 sKeyWord = Intersect(c.EntireColumn, .Rows(0)).Value & _ 18 Intersect(c.EntireRow, .Columns(0)).Value 19 'リストから検索して転記 20 c.Value = IIf(CBool(rngFind _ 21 .Cells(WorksheetFunction.Match(sKeyWord, rngFind, 10)) _ 22 .Offset(, 1).Value), "○", "×") 23 Next 24 End With 25End Sub

参考サイト>>
プロパティ、メソッドの探り方 マクロ記録とF1のHelpを使う

あぁ、ここまで書いて気づいた^^;
普通に数式を入れたら十分な案件ですね^^;;

True,Falseが文字列でなく、論理値ならば、セルの書式設定で〇×の表示をさせてもいいかもですね。

投稿2019/10/08 01:32

mattuwan

総合スコア2136

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問