• 締切済み

条件分岐、文字検索を同時に行うコード

.エクセルVBAの条件分岐に関するコードに関して、 質問させていただきます。 シート1にある表(画像をご参照ください)に おいて条件に合う方の行に入っている 「AM」「PM」という文字を 「出席」という文字に置き換えたいのです。 置き換える場所は、 別シート(画像:シート2)になります。 ―――皆様にご教授いただきたいのは―――― 【1】 シート1「顧客簿」において、 見学の列が「○」かつ退会の列が「(空欄)」である ものを探すコードの書き方 【2】 シート2「カレンダー」において 上記【1】に該当する方が いらっしゃる曜日を探すコード 例)シート1の佐藤さんは「見学が○かつ退会が空欄」 ↓↓↓↓↓ 佐藤さんは条件に合致 ↓↓↓↓↓ 佐藤さんは月曜と水曜に通っている ↓↓↓↓↓ シート2の月曜を探す ↓↓↓↓↓ シート2の佐藤さんの行の月曜の列に入っている 「AM」を「出席」に置き換え ↓↓↓↓↓ シート2の佐藤さんの行の水曜の列に入っている 「PM」を「出席」に置き換え ※※※※ シート2「カレンダー」の日付、曜日のセルには date 関数を使用しており、 自動で月ごとに表示される使用です。 ※※※※ 【2】 また、300人以上のデータがある場合、 どのようにコードを書けば、 繰り返し条件を探す【1】の処理を実行することが 可能でしょうか? 【1】と【2】を実現する コードをお教え願いたく存じます。 ―――――――――――――――――― VBA初心者で質問の仕方も 適切な表現でなく、誠に申し訳ございません。 よろしくお願い申し上げます。

みんなの回答

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

No.1です。 >コードの下から9行目にある >「End If」の部分で >エラー表示が出てしまい、 >動きません。 すなわち >If wS.Cells(3, k) <> "" Then >wS.Cells(c.Row, k) = "出席" の部分でのエラーだと思われます。 一番怪しいのは「小の月」の場合など31日のセルが空白になっていない。 という原因が考えられます。 前回Sheet2の4行目・5行目の数式を投稿したのは 大の月・小の月に対応するためのものです。 今一度4行目の数式を見直して、 (1)シリアル値になっているか? (2)小の月の月末部分が空白になっているかどうか確認してみてください。 (5行目は今回利用していませんので、気にしなくて大丈夫です) 今考えられる原因としてはこの程度ですが・・・ これでもダメなら、 列方向の「日付」「曜日」のセルにはどんな数式を入れているか教えてください。 (お手元のExcelのレイアウトも判ればより的確なアドバイスができると思います) それに基づいて、もう一度他の方法を考えてみます。m(_ _)m

  • eden3616
  • ベストアンサー率65% (267/405)
回答No.2

Alt+F11でVBEを開き、挿入から標準モジュールを挿入して下記のVBAコードを貼り付けてください。 VBEを閉じてからAlt+F8または表示→マクロより「Action」を選び実行してください。 シート名を「顧客簿」と「カレンダー」であるとして作成しています。 異なる場合はコード内の以下の箇所を変更してください。   'シート名の設定   Set mySt(0) = Sheets("顧客簿")   Set mySt(1) = Sheets("カレンダー") >また、300人以上のデータがある場合、どのようにコードを書けば、 >繰り返し条件を探す【1】の処理を実行することが可能でしょうか? 該当の表が下に同じ様式で連なっているのであれば、 表を増やすことで対応できます。(添付画像参照) ただし、同姓同名である場合はどう処理するのでしょうか? 現在のコードでは名前は重複しないものとして作成しています。 ■VBAコード Sub Action() '型宣言 Dim mySt(1) As Worksheet Dim i As Long Dim j As Integer Dim myTar As Range Dim bkRng As Range Dim nxRng As Range 'シート名の設定 Set mySt(0) = Sheets("顧客簿") Set mySt(1) = Sheets("カレンダー") '実処理 With mySt(0)   '2行目~A列の最終行まで繰り返し処理   For i = 2 To .Range("A" & Rows.Count).End(xlUp).Row     '【1】対象行iの列Bが○で列Cが空欄の場合の処理     If .Range("B" & i) = "○" And Len(.Range("C" & i)) = 0 Then       'カレンダーシートの名前を検索       Set myTar = mySt(1).Columns("A").Find(.Range("A" & i))       '4列目(D)~8列目(H)まで繰り返し処理       For j = 4 To 8         '対象のセルが空白でなければ(AM、PMが入っていれば)処理         If Len(.Cells(i, j)) > 0 Then           'ユーザー定義関数で処理し、返ったセルに出席を入力           mySearch(mySt(1), 2, myTar.Row, .Cells(1, j)) = "出席"         End If       Next j     End If   Next i End With End Sub '行方向に検索して一致したオフセットセルを返すユーザー定義関数 Function mySearch(mySt As Worksheet, srow As Long, trow As Long, word As String) As Range Dim hit As Long On Error GoTo era With mySt Do   hit = WorksheetFunction.Match(word, .Range(.Cells(srow, hit + 1), .Cells(srow, Columns.Count)), 0) + hit   If mySearch Is Nothing Then     Set mySearch = .Cells(trow, hit)   Else     Set mySearch = Union(mySearch, .Cells(trow, hit))   End If Loop End With Exit Function era: End Function

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんばんは! 一例です。 ↓の画像で上側が元データのSheet1・下側がSheet2とします。 Sheet2の3行目は作業用の列として使用していますので、画像通りの配置にしてみてください。 >シート2「カレンダー」の日付、曜日のセルには >date 関数を使用しており、 とありますが 画像ではSheet2のB4セル(セルの表示形式はユーザー定義から d としています)に =IF(MONTH(DATE($A1,$A2,COLUMN(A1)))=$A2,DATE($A1,$A2,COLUMN(A1)),"") B5セル(セルの表示形式はユーザー定義から aaa としています)に =IF(B4="","",B4) という数式を入れB4・B5セルを範囲指定 → B5セルのフィルハンドルで月末(31日)までのAF列までコピーしています。 (この数式でSheet2のA1・A2セルの数値を入れ替えるだけで自動で日付・曜日が変わります) 以上の下準備ができた上でのVBAでの一例です。 標準モジュールに↓のコードをコピー&ペーストしてマクロを実行してみてください。 Sub Sample1() 'この行から Dim i As Long, j As Long, k As Long, lastRow As Long Dim c As Range, r As Range, wS As Worksheet Set wS = Worksheets("Sheet2") lastRow = wS.Cells(Rows.Count, "A").End(xlUp).Row Range(wS.Cells(4, "B"), wS.Cells(4, "AF")).Copy wS.Range("B3") With Range(wS.Cells(3, "B"), wS.Cells(3, "AF")) .Formula = "=TEXT(B4,""aaa"")" .Value = .Value End With Range(wS.Cells(6, "B"), wS.Cells(lastRow, "AF")).ClearContents With Worksheets("Sheet1") For i = 2 To .Cells(Rows.Count, "A").End(xlUp).Row If .Cells(i, "B") = "○" And .Cells(i, "C") = "" Then For j = 4 To .Cells(1, Columns.Count).End(xlToLeft).Column If .Cells(i, j) <> "" Then Set c = wS.Range("A:A").Find(what:=.Cells(i, "A"), LookIn:=xlValues, lookat:=xlWhole) Set r = wS.Rows(3).Find(what:=.Cells(1, j), LookIn:=xlValues, lookat:=xlWhole) For k = r.Column To 32 Step 7 If wS.Cells(3, k) <> "" Then wS.Cells(c.Row, k) = "出席" End If Next k End If Next j End If Next i End With wS.Rows(3).Clear End Sub 'この行まで こんな感じではどうでしょうか?m(_ _)m

yuzurihaphoto
質問者

補足

早々の返信、 誠にありがとうございます。 ただ、 ================ コードの下から9行目にある 「End If」の部分で エラー表示が出てしまい、 動きません。 ================ 解決策、あるいは他の策を お教え願いますでしょうか? どうかよろしくお願い申し上げます。

関連するQ&A

  • エクセルで自動に休日の列に網がけする方法を教えてください

    エクセルで、出席簿を作っています。 B1のセルに日付を、B2に曜日を入れています。 A2,A3出席者の名前がずらっと300人ほど入り、最後の行に集計欄などが入ります。              1  2  3・・・・        水  木  金・・・・ 佐藤一子   出  欠  出・・・・ 佐藤二子   欠  欠  出・・・・ 田中カズオ  出  出  出   ・    ・  ・  ・   ・    ・  ・  ・ 出席者計   100 250  25 出席率    10% ・  ・ このような一覧表の場合、カレンダーの休日の列に自動で網がけをしたいのですが、そのような方法はありますでしょうか? 途中で一部、網がけをしたくない行も少しあります。 どうぞよろしくお願いします。

  • エクセル 複数シートにまたがるデータの抽出

    複数シートからのデータ抽出についていくつか拝見いたしましたが 知識が足らず、操作できませんでした。 下記のような抽出が可能であれば、ご教授いただけたらと思います。 なお、VBやマクロ等は使用したことは、ほぼありません。 シートが複数あり、またそのシートが増えていく可能性があります。 シート名→「start」「佐藤」「山本」「end」「集計1」「集計2」ととりあえず作成。 (「集計1」にて別のデータ合計をとるため、「start」「end」シートを作成しました。  なお、佐藤~山本のシートは同じ書式ですが、シート名が変わる可能性も高い。  今回したいのは「集計2」においてです) 「佐藤」シート   A   B   C   D 01 佐藤 02 \  月曜 火曜 水曜 03 6:00  1   0.5   1 04 7:00  1    1 05 ~ 18 21:00 「山本」シート   A   B   C   D 01 山本 02 \  月曜 火曜 水曜 03 6:00 04 7:00  1   1   1 05 ~ 18 21:00  1   1   1 「集計2(曜日毎で、月曜)」シート   A   B   C   D 01 月曜 02 03 6:00 佐藤 04 7:00 佐藤 山本 05 ~ 18 21:00 山本 「集計2(曜日毎で、火曜)」シート   A   B   C   D 01 火曜 02 03 6:00 佐藤 04 7:00 山本 05 ~ 18 21:00 山本 できれば、名前(シート)が非常にたくさんになる可能性があるので 集計2に出てくる名前は、詰めてが理想です。 また、できればあまり都度の細かい作業がなければありがたいです。 (利用者で、できない可能性が高い) よろしくお願い申し上げます。

  • マクロの条件別分岐について

    集計表のマクロを作成しています。 その際に条件によって、使用するマクロを使い分けたいと思っていますが上手くいきません。 次のように、E列に倉庫コード・G列に数量が表示されている書式を使用しています。 (例)  (E列)(G列) 1  22B  0 2  31A  1 3  54A  0 4  456  40 5  65C  41 6  32B  60 7  33A  40 ※1行目から300行目まで文字が投入される可能性があります。 そして、次の条件によって、使用するマクロを分岐したいと思っています。 「1」.E列で文字列"B"が含まれている   かつ その行のG列の数量が1以上 の組み合わせがある 「2」.E列で文字列"B"が含まれていない かつ その行のG列の数量が1以上 の組み合わせがある 「1」「2」2つの条件に当てはまる場合は「a」の処理 「1」の条件にのみ当てはまる場合は「b」の処理 「2」の条件にのみ当てはまる場合は「c」の処理 (「1」「2」のどちらにも当てはまらない場合は無いので省略) ちなみに処理の内容は次のとおり 「a」:A・B2つのピボットテーブルを作成する 「b」:Bの1つのピボットテーブルを作成する 「c」:Aの1つのピボットテーブルを作成する 例の場合の処理は次のようになります。 ●1行目はセル(E1)は"B"が含まれているが、セル(G1)の数量が 1以上ではないので、「1」にも「2」にも当てはまらない。 ●2・4・5・7行目はE列に"B"が含まれていなくて、G列が 1以上なので「2」の条件 ●3行目はE列に"B"が含まれていないものの、G列の数量が 0なので「1」にも「2」にも当てはまらない。 ●6行目はE列に"B"が含まれていてセル(G6)の数量が1以上 なので「1」の条件 よって「1」「2」のそれぞれにあてはまる行があるので「a」の処理を行う。 セル範囲(E1:G300)の全ての行に関して上記の「1」「2」の条件に当てはまるか検索して、それぞれ当てはまった条件によって「a」「b」「c」の処理を行うようにしたいです。 (例)の場合だったら 6行目まで検索した時点で「a」の処理が決定します。 Select Case のマクロを使用したら良いと思ったが、どのようにマクロを記述したらよいのか解らないので教えていただけると助かります。 イメージとしては Select Case (1から300行目で「1」と「2」の条件に当てはまる行がある場合) 処理「a」を行う。 Select Case (1から300行目で「1」の条件に当てはまる行はあるが「2」の条件にあてはまる行はない場合) 処理「b」を行う。 Select Case (1から300行目で「2」の条件に当てはまる行はあるが「1」の条件にあてはまる行はない場合) 処理「c」を行う。 というところまではわかりますが、括弧の中の記述方法が分かりません。あるいは別の処理があれば教えていただけると助かります。

  • Excel2007 複数条件での検索

    Excel2007で複数条件のデータの抽出について教えて下さい。 現在、シートAにデータが入力され、シートBにデータの抽出を行いたいと思います。 シートAの内容は以下の通りです(アルファベットと数字はセルの場所です): 1行目: 項目欄 2行目以下: データ詳細 1行目 A1 「日付」 B1「名前」 C1「出社状況」 2行目以下 A2 12/01  B2 山田  C2 出社 A3 12/01  B3 佐藤  C3 早退 A4 12/01  B4 木村  C4 出社 A5 12/02  B5 木村  C5 早退 A6 12/02  B6 山田  C6 遅刻 A7 12/02  B7 佐藤  C7 遅刻 ・・・・・ A列の日付は昇順ですが、B列の人名はランダムに入力されています。 また、日付によっては途中入退社する人もいるので、12/01に名前がなくても、 12/10から名前が入力されている場合(あるいはその逆)もありえます。 シートBは以下の通りです: 1行目 名前 A列:日付 B1 木村 C1 山田 D1 佐藤 ・・・ A2 12/01 A3 12/02 このシートBの B2に シートAから 「木村の12/01の出社状況」(つまりC4)に値するデータを 自動的に抽出するような関数を入力したいのですが、どのようにすればよいのでしょうか? (このB2セルの式をB2:D3に入力していきたいので、絶対値を指定することになると思いますが・・・) IndexやらMatchやらLookupやらを色々試してみたのですが、どうも上手くいきません。 どなたかアドバイスをお願いいたします。

  • 行と列の条件に一致したら印を付けたい

    シート1に名前と商品のリストがあります 名前 商品 佐藤 りんご 佐藤 みかん 佐藤 ぶどう 加藤 みかん 山本 バナナ 山本 みかん 小林 りんご 小林 ぶどう 小林 みかん 小林 バナナ シート2の行に名前、列に商品名の表があり、シート1のリストを元に 行と列の条件に一致した箇所に印をつけたいのですが、 何か適当な関数はありますでしょうか? りんご みかん ぶどう バナナ 佐藤 加藤 山本 小林

  • EXCEL 検索条件をハイライト

    EXCELでシート1に A行に番号(型番)(A-1、A-2、A-3・・・・・)が入っています。 シート2のA行に検索条件になるリストがあります。 A-3、A-10 などなど この検索条件に合致したシート1のA行のセルをハイライトしたいのですが、良い方法はありますでしょうか? つまり、この場合、例えばVBAなら実行すると、シート1のA-3という文字列が入ったセルと、A-10という文字列が入ったセルがハイライト(背景の色が変わる)される、といった具合の結果を必要としています。 よろしくお願い致します。

  • エクセルの関数について

    エクセルに詳しくないので関数に強い方宜しくお願いいたします。 シート1の1行目に月・火・水・木・金・土・日と曜日を入れ、2行目にその曜日に合わせた月曜日が「3」、火曜日が「9」、水曜日が「4」など決まった数字を入れるとします。 シート2に月間の7/1から7/31で水曜日から始まる表を作り、その下の行にシート1に入れた7/1(水)だったら「4」、7/2(木)なら・・・と数字が表示されるような関数はあるでしょうか?

  • 条件付き書式(カレンダー作成)

    A列(2行目より)1/1~1/31、B列に曜日、C列にスケジュール、D列に2/1~2/28・・・ というようなカレンダーを作成しております。 条件付き書式を使用し、土日祝日は「曜日列」、「スケジュール列」には網掛け色を付けたいと思い、 「=OR(WEEKDAY(A$2)=1,WEEKDAY(A$2)=7)」 及び 2012年の祝日一覧をAP2~AP23に入力し、 「=COUNTIF($AP$2:$AP$23,A$2)=1」 の2通りを条件ルールとして設定しました。 曜日欄には色がつくのですが、スケジュール欄に色が付きません。 いろいろと試してみたのですがうまく反映されません。 ご教示頂きたく、何卒宜しくお願い致します。

  • エクセル 複数の条件に一致

    複数の条件に一致したセルの内容によって、別のセルに別の文字を自動で表示したいのですが可能でしょうか? 詳細はこのような形で、 【シート1】       A     B       C 1      0001     3/1    有 2      0002     3/1    無 3      0001     3/2    不明 【シート2】       A     B       C 1             3/1      3/2 2      0001       ○      △ 3      0002       ×     "空欄" ・シート2のB2からC3を自動で表示できるようにしたい。 ・シート1のA列とシート2のA列が一致、更にシート1のB列とシート2の1行が一致。 ・シート1のC列が「有」の場合「○」、「無」の場合「×」、「不明」の場合、「△」、「空欄」の場合、「"空欄"」と表示。 知りうる限りの関数を合わせてみましたが、できませんでした。 どなたかいい方法を教えて頂ければと思います。 環境はXPpro、エクセル2000です。 宜しくお願いします。

  • VBA 条件検索について

    VBAの検索について質問です。 以下のようなものを作ろうと思います。 sheet1とsheet2がありsheet1のA、Bの数値をsheet2の同じA,Bの数値の値の行を検索して, その同じ値の行のsheet1のCの数値の値からsheet2のCの数値を引いた値をsheet3のC列に返すプログラムを作ろうと思います。空白などで同じ値がない場合はsheet3に空欄を返そうと思います。 以下に例をプログラムの実行例を示します。 sheet1 ■ A 列 B 列 C列 1: 7 | 1 | 3 2: 5 | 8 | 2 3: 2 | 3 | 1 4: 9 | 6 | 4 sheet2 ■ A 列 B列 C列 1: 2 | 3 | 4 2: 9 | 6 | 2 3: 7 | 1 | 5 4: 5|   | 3 sheet3 ■ A列 B列 C列 1: 7| 1 | -2 2: 3: 2| 3 | -3 4: 9 | 6 | 2 自分で以下のプログラムを作成してみたのですが空欄が検索できなかったりしてなかなかできません。 どなたか、教えてください。お願いします。 Sub test() Dim sh1 As Object, sh2 As Object, sh3 As Object Dim d1 As String, d2 As String, a As Long Set sh1 =Sheets(“Sheet1”) Set sh2 =Sheets(“Sheet2”) Set sh3 =Sheets(“Sheet3”) For a = 1 To 3000 Step 1 d1 = sh1.Cells(a,1) & sh1.Cells(a,2) d2 = sh2.Cells(a,1) & sh2.Cells(a,2) Do while d2 <>”” If d1 = d2 Then Sh3.Cells(a,1) = sh1.Cells(a,1) Sh3.Cells(a,2) = sh1.Cells(a,2) Sh3.Cells(a,3) = sh1.Cells(a,3) Exit Do End If a= a+1 d2 = sh2.Cells(a,1) & sh2.Cells(a,2) Loop Next End Sub

専門家に質問してみよう