• ベストアンサー

Excel2007でのマクロの設定について

Excelのマクロについて質問です。 Excel2007でマクロを設定したいのですが以下の作業はマクロ化出来ますか? 1.特定の文字列を含む行の削除   例:(D11に特定の文字列があった場合、11行を全て削除する) 2.特定の文字列を含む行のうち、一部セルの変更   例:(A列に日付、B列に名前、C列に金額がある場合、B列を検索して該当した名前の列の日付のみ既存の日付の前日にする)   また、これは同時に複数の検索が出来ますか? ご回答お待ちしております。

質問者が選んだベストアンサー

  • ベストアンサー
  • TERN
  • ベストアンサー率50% (1/2)
回答No.3

こんばんは。 削除・日付変更の対象となるものの条件を ”Select Case” で 設定しているので、こちら加えて頂ければ対象を増やすことができます。 (”Select Case ”の使い方については、下記URLをご参照ください) 先程までのマクロでは、日付変更しか ”Select Case” を使って いませんでしたが、文字列のほうも ”Secet Case” を使うような マクロに改修させていただきました。ご参考までに。 ※Do Until ~ Loop までを下記に書き換えてください。 =============================================== Do Until row > maxRow '日付取得 day = Worksheets("Sheet1").Cells(row, 1) '名前取得 name = Worksheets("Sheet1").Cells(row, 2) '文字列取得 str = Worksheets("Sheet1").Cells(row, 4) '文字列がAAAまたはDDDの場合、行ごと削除 Select Case str '↓↓↓ここに条件任意の条件を追加してください↓↓↓ Case "AAA", "DDD" Worksheets("Sheet1").Rows(row & ":" & row).Select Selection.Delete Shift:=xlUp maxRow = maxRow - 1 Case Else 'B商店またはC商店の場合、日付を一日前に戻す Select Case name '↓↓↓ここに条件任意の条件を足してください↓↓↓ Case "B商店", "C商店" day = day - 1 Worksheets("Sheet1").Cells(row, 1).Value = day row = row + 1 Case Else row = row + 1 End Select End Select Loop ===============================================

参考URL:
http://excelvba.pc-users.net/fol6/6_2.html
news-pochi
質問者

お礼

TERNさん、こんばんは。 何度も質問に答えていただき本当にありがとうございました。 問題は解決致しました。 URLを参考に自分でも勉強したいと思います^^

その他の回答 (2)

  • TERN
  • ベストアンサー率50% (1/2)
回答No.2

こんばんは、TERNです。 (1)”AAA”の任意の文字列に変更した場合、「中断モードでコードを実行することはできません」と   エラーになりました。原因はどこでしょうか?例:”AAA”を”サンプル”に変更(文字列はD列) ⇒大変申し訳御座いません、一部プログラムに抜けがありました。   昨夜回答したマクロですと名前列に ”B商店/C商店”以外が入力されていた場合、   次の行を確認できず、同じ行を延々と確認し続けていました。(無限ループが発生。。。)     『行を削除した場合にはもう一度同じ行を確認し、行を削除しなかった場合には次の行を   確認する』 ようにマクロを改修しました。   Do Until 以降のマクロを下記のものに差し替えお願いします。 ===============================================  Do Until row > maxRow '日付取得 day = Worksheets("Sheet1").Cells(row, 1) '名前取得 name = Worksheets("Sheet1").Cells(row, 2) '文字列取得 str = Worksheets("Sheet1").Cells(row, 4) '文字列がAAAの場合、行ごと削除 If str = "AAA" Then Worksheets("Sheet1").Rows(row & ":" & row).Select Selection.Delete Shift:=xlUp maxRow = maxRow - 1 Else 'B商店またはC商店の場合、日付を一日前に戻す '※Caseを追加することにより複数条件を指定できます。 Select Case name Case "B商店" day = day - 1 Worksheets("Sheet1").Cells(row, 1).Value = day row = row + 1 Case "C商店" day = day - 1 Worksheets("Sheet1").Cells(row, 1).Value = day row = row + 1 Case Else row = row + 1 End Select End If Loop      =============================================== (2)回答に記載されているデータを使用し、試してみたところ日付は1日前にもどりましたが   表記も変更されました。   例:2011/8/18 →マクロ実行→ 16/8/2011 ⇒セルの書式設定が ”文字列” になっている為、上記の事象が発生しているのでは   ないでしょうか?セルの書式設定を ”日付” に変更後、マクロを実行いただければ   ”2011/8/16” で表示されるかと思います。

news-pochi
質問者

お礼

丁寧にご説明いただきありがとうございます! マクロに対しての知識が乏しい為、質問ばかり申し訳ございません。 (1)につきまして問題なく特定の文字列を含む行のみ削除することが出来ました。 (2)につきましてTERNさんのおっしゃる通り、セルの書式設定によるものでした。 (1)の文字列の削除につきまして、もう1点確認がございます。 削除対象が複数ある場合はどのように項目を追加すればよろしいでしょうか? 例:削除対象項目が複数ある場合 サンプル(●●●)、サンプル(×××)、サンプル(◆◆◆) お時間を取らせてしまい申し訳ございません。 ご回答よろしくお願い致します。

  • TERN
  • ベストアンサー率50% (1/2)
回答No.1

Okwave初投稿となります。TERNと申します。 質問内容の作業はマクロ化することが可能です。 あくまで参考としてですが、質問内容にそったマクロを 作成してみましたので、ご確認ください。 ■作成したマクロの概要■ (1)表の”文字列” 列 が ”AAA” の行を削除する。 (2)表の”名前” 列が ”B商店”、”C商店” になっている行の   日付を1日過去日にする。 <表:マクロ実行前> =============================================== 日付 名前 金額 文字列 2011/8/18 A商店 4000 AAA 2011/8/18 B商店 1000 BBB 2011/8/18 A商店 3000 AAA 2011/8/18 C商店 2000 BBB <マクロ> =============================================== Sub TEST() Dim row As Integer '行 Dim maxRow As Integer '最大行 Dim day As Date '日付列からデータを格納 Dim name As String '名前列からデータを格納 Dim str As String '文字列からデータを格納 '開始行 row = 2 '最大行数取得 maxRow = Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).row Do Until row > maxRow '日付取得 day = Worksheets("Sheet1").Cells(row, 1) '名前取得 name = Worksheets("Sheet1").Cells(row, 2) '文字列取得 str = Worksheets("Sheet1").Cells(row, 4) '文字列がAAAの場合、行ごと削除 If str = "AAA" Then Worksheets("Sheet1").Rows(row & ":" & row).Select Selection.Delete Shift:=xlUp maxRow = maxRow - 1 End If 'B商店またはC商店の場合、日付を一日前に戻す '※Caseを追加することにより複数条件を指定できます。 Select Case name Case "B商店" day = day - 1 Worksheets("Sheet1").Cells(row, 1).Value = day row = row + 1 Case "C商店" day = day - 1 Worksheets("Sheet1").Cells(row, 1).Value = day row = row + 1 End Select Loop End Sub <表:マクロ実行後> =============================================== 日付 名前 金額 文字列 2011/8/17 B商店 1000 BBB 2011/8/17 C商店 2000 BBB

news-pochi
質問者

お礼

早々にご回答いただきありがとうございます。 大変助かります! 早速、使用させていただきいくつか質問がございます。 よろしくお願い致します。 (1)表の”文字列” 列 が ”AAA” の行を削除する。 (2)表の”名前” 列が ”B商店”、”C商店” になっている行の   日付を1日過去日にする。 ◆使用状況◆ ・Sheet1で実行。 ・使用列はH列まで、使用行は約2000行 ・対象日付はA列、対象文字列はD列 ◆質問内容◆ (1)”AAA”の任意の文字列に変更した場合、「中断モードでコードを実行することはできません」とエラーになりました。   原因はどこでしょうか?   例:”AAA”を”サンプル”に変更(文字列はD列) (2)回答に記載されているデータを使用し、試してみたところ日付は1日前にもどりましたが表記も変更されました。   例:2011/8/18 →マクロ実行→ 16/8/2011

関連するQ&A