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

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

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

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

Q&A

解決済

2回答

1078閲覧

ExcelVBA)ループ処理とセットのこと

JUN_FOX

総合スコア7

VBA

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

0グッド

0クリップ

投稿2019/10/01 04:33

編集2019/10/01 04:34

現在sheet("一覧")からsheet("table")へ特定のデータを探し〇×表を作ろうしているのですが大きな課題にぶつかり解決策が思いつかないため質問です。

まずはコードから(プロシージャが大きいため一部抜粋したものです

VBA

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

これを左の文字が13種、右の数字が30種ありすべてを上記のようにベタ打ち力技で作りました。
しかしこれでは何かある度に膨大な量の修正&見逃しがないか何重もの確認を強いられどうにか簡単にできないか悩んでおります。
現在やってみたのはこの左右に入れる検索対象の文字や数字をどこか隅にでもまとめ1つの〇×処理が終われば1つずらして次へ…というものです。
しかしどのようにセルをずらしその都度中を抽出、InStrの中に持っていくかがわからないため困っております。
ひとまずわかっていることは
・検索する文字数列セル指定、c+1のような形にする。
・〇×表のセル番地もベタ打ちではなくなにか別の方法で指定しないといけない。
以上の考察をして調べてみましたがわからないため質問致しました。

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

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

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

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

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

mattuwan

2019/10/01 04:56

単に○×だけ記録しても、後で何のことかよくわからなくないですか? 検索するキーワードをシート上に書いておいて、 それを順番に見て行きながら検索し、結果を表示してはいかがでしょう? シートに書く場合も、2列にキーワードを並べて書いて 一覧のようにするのか、 項目行と項目列を用意してクロス集計表のようにするのか、 まずは、シート上でのイメージを提示してみてはいかがでしょうか?
JUN_FOX

2019/10/01 05:08

今回がマイグレ後の導入確認に使用するものになります。顧客の方はログなどを見てもわからない方のため表の○×でこれは入ってる、これは入ってないがわかれば大丈夫なので今回このような処理がしたいと考えております。説明が足りず申し訳ございません
mattuwan

2019/10/01 06:19

なんにしても、シート上に検索キーワードを入力しておけば、 コードが短くなると思いますが、その線は全くなしで、 コードの中に書きたいということですか?
JUN_FOX

2019/10/01 07:09

その場合条件を満たしたら次のセルへ、満たしたら次のセルへとループは可能なのでしょうか? 最近それを思いつきやってみたのですがうまくいかず断念してました。 その時のコードが以下のような流れです。 ```VBA Dim ws1,ws2 As Worksheet Set ws1 = sheets("一覧") Set ws2 = sheets("table") 'Cellsに入れる数字 Dim a,c As Long a = 1 c = 4 Dim centname As Long centname = cells(a,1).value '空白までループ Do While ws1.Cells(c,6).Value<>"" If Instr(ws1.Cells(c,6).Value"app") And InStr(ws1.Cells(c,6).Value"centname")<>0 Then '条件を満たせばB2へ〇満たせないなら×を ws2.Cells(2,2).Value = "〇" Exit Do Else ws2.Cells(2,2).Value = "×" End If a = a+1 c = c+1 Loop ``` これをやるとcentname = cells(a,1).valueで型が一致しないとエラーがでてしまうんですよね。
mattuwan

2019/10/02 00:16

>今回がマイグレ後の導入確認に使用する といわれても、私はイメージがわかりません。 右とか左というのもなんだろう?となってます。 具体的に、どういうデータに対して、 どういう形でキーワードを指定して検索して、 ○×を判定するのでしょうか? >これをやるとcentname = cells(a,1).valueで型が一致しないとエラーがでてしまうんですよね。 Long型の変数に数値でないものを代入しようとしたらそうなるかもですね。
tatsu99

2019/10/02 01:08

If Instr(ws1.Cells(c,6).Value"app") And InStr(ws1.Cells(c,6).Value"101")<>0 Then 上記の文自体が、エラーになります。なにをなさりたいのかがよくわかりません。画像等で具体的に提示していただけると良い回答が得られるかと。
guest

回答2

0

ベストアンサー

たぶんこうなんじゃないかな? で書いてみました。

操作画面例
画面サンプル
(たとえばTableシートの一部に) サンプルの左表のような一覧を用意して、
「左」、「右」のキーを定義しておくと、その「左」×「右」の全組み合わ
せで検索が行なわれ、結果が右表に書き込まれる。

これでよろしければ↓

作りとしては
(1)一回ぶんの〇×判定処理はサブルーチンにする。
「左」、「右」の値を引き数にして、戻り値は判定結果("○"か"×")とする。

(2)「左」×「右」の全組み合わを作るので、二重ループにする。
二重ループの中で(1)、左表からの読み出し位置、右表への書き込み位置を
ずらしながら、(1)を呼び出す

でよいかと思います。

サンプル

Option Explicit Private Sub CommandButton1_Click() Dim ws2 As Worksheet: Set ws2 = Sheets("table") ' 結果シート Dim wx As Long: wx = 4 ' 結果書き込み位置 Dim lRx As Long: lRx = 4 ' キー(左)読み出し位置 Do While (ws2.Cells(lRx, "B").Value <> "") ' キー(左)が空白になるまでループ Dim lkey As String: lkey = ws2.Cells(lRx, "B").Value ' キー(左)の取り出し Dim rRx As Long: rRx = 4 ' キー(右)読み出し位置 Do While (ws2.Cells(rRx, "C").Value <> "") ' キー(右)が空白になるまでループ Dim rKey As String: rKey = ws2.Cells(rRx, "B").Value ' キー(右)の取り出し ws2.Cells(wx, "E") = lkey & "、" & rKey ' 結果(左、右)に書き込み ws2.Cells(wx, "F") = checkKey(lkey, rKey) ' 結果(○×)に書き込み rRx = rRx + 1 Loop lRx = lRx + 1 Loop Set ws2 = Nothing End Sub ' ' サブルーチン。「左」、「右」を1件づつ与えるとその判定結果を返す。 ' Private Function checkKey(ByVal lkey As String, ByVal rKey As String) As String Dim ws1 As Worksheet: Set ws1 = Sheets("一覧") checkKey = "×" ' 結果初期値 Dim rx As Long: rx = 4 ' 一覧の読み出し位置 Do While (ws1.Cells(rx, 6).Value <> "") ' 空白になるまで Dim test As String: test = ws1.Cells(rx, 6).Value ' 値の取り出し If (InStr(test, lkey) > 0) Then ' キー(左)があるか If (InStr(test, rKey) > 0) Then ' キー(右)があるか checkKey = "○" ' あれば○ Exit Do ' ループ終了 End If End If rx = rx + 1 Loop Set ws1 = Nothing End Function

投稿2019/10/07 02:00

h.horikoshi

総合スコア505

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

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

0

〇×の欄に、VBAで配列数式埋め込むと出来るかも。
エクセル 配列数式、CSE数式とは、仕組みと使い方を紹介します

あくまで案ですけど。

投稿2019/10/01 09:01

sazi

総合スコア25195

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問