Excelマクロの複数検索方法について

このQ&Aのポイント
  • Excel2007を利用しており、マクロの複数検索方法について教えてください。
  • 現在、エクセルシート内(sheet1)で、セルJ3にA-J範囲の英字が入ると指定したシート名を見に行って処理するマクロを組んでいます。
  • 現在はセルJ3だけを見て処理をしていますが、セルJ3だけでなくD4:D500の縦範囲で英字を入力するようにして、検索元セルを複数にしてマクロを動かしたいです。どのように修正すれば良いでしょうか?
回答を見る
  • ベストアンサー

Exselのマクロについて。

Exselのマクロについて。 Excel2007を利用しております。 差し支えなければマクロの複数検索の方法についてお教え頂きたいのですが、 現在、エクセルシート内(sheet1)での状況を簡単に説明致しますと、 ?セルJ3にA~J範囲を入力規制しております。 ?セルJ3へ?で記したそれぞれの英字が入ることによって指定したシート名を見に行って処理をするマク ロを組んでおります。 ?上記のマクロ一部で、もしJ3がAであればAセット配色シートへ移るようになっておりますが、そのマ クロを、myStr = Range("J3").Value & "セット配色"を表現しております。 これを、変更したいと思っているのですが、現在はセル"J3"だけを見て処理をしておりますが、これをセルJ3だけでなくてD4:D500の縦範囲でそれぞれ?のように英字を入力するようにして、例えばD5がCであればCセット配色シートを見に行ったり、D7がJであればJセット配色を見に行ったりというように検索元のセルを複数にしてマクロを動かせるようにしたく思っております。 現在は、?内のようにmyStr = Range("J3").Value & "セット配色"という表現にて検索元セルが"J3"1つですが検索元を複数にしてマクロを組むにはどう修正したらよろしいでしょうか? 説明があまりうまくありませんでしたがどうぞよろしくお願い申し上げます。

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

  • ベストアンサー
  • myRange
  • ベストアンサー率71% (339/472)
回答No.3

セルJ3、セルD4~D500に値が入力された瞬間に、、、ということですね。 なら、該当シートのChangeイベントに下記コードを。。。。 '------------------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Range)  If Target.Count > 1 Then Exit Sub  '複数セルへの同時入力は無視  If Target.Address(0, 0) = "J3" Or _    Not Intersect(Target, Range("D4:D500")) Is Nothing Then      myStr = Target.Value & "セット配色"       ==該当処理==  End If End Sub '-------------------------------------------------------- 以上です。

yamapipi
質問者

お礼

大変参考になりました。 まだ解決こそしてませんが、自身の質問の内容が抽象的すぎましたので、一度クローズして、より具体的な内容で再アップしたいと思います。 お忙しい中ありがとうございました。

その他の回答 (2)

  • kuroizell
  • ベストアンサー率55% (95/170)
回答No.2

たぶんこんな風かと思います。 Dim myRng As Range Dim Cells As Range Set myRng = Range("D4:D500") For Each Cells In myRng  If Cells.Value <> Nul Then    (Cells.Valueを使って処理)  End If Next Cells

  • passes
  • ベストアンサー率26% (11/42)
回答No.1

一例 cells(4,5).value でD5の値を読み取れます。

関連するQ&A

  • エクセルのマクロについて

    エクセルのマクロについて エクセル2007を使用しています。もしよかったら教えて頂きたいと思っております。 現在利用しているメインシート(Sheet16で認識)のD5:I500の範囲内で1~31範囲の数字がランダムに入力されています。 この数字群の入ったセルをルール化しているセル背景色塗りを自動で処理したいためマクロを作成しております。 その仕様として、10個のシート(シート名:Aセット配色~Jセット配色)を作成して、各シートのB3:H7範囲に1~31までの数字が入っており、それぞれ数字に背景配色しています。Sheet16内と数字と条件によって該当する10個のシート内(シート名:Aセット配色~Jセット配色)の中から1つのシートとが一致したらそのセット配色シートのセルそのものの書式も運んでくれるルール設計になっています。 (※Sheet16の上記記載している範囲に直接入力及びコピーをして数字が一致したら、色が変わる仕組みになっています。) 更に、Sheet16内のJ3セルにA~J迄の半角英字を入力規制セットしており、例えばそのセルにCを入力すればCセット配色(シート名)、A入力であればAセット配色(シート名)を見に行き、該当処理をして行くという仕様になっております。 そのマクロ(※げNSheet16内に作成しています)が下記なのですが、拝見頂いて仕様がすぐお分かりになると思いますが、、 Private Sub Worksheet_Change(ByVal Target As Range) Dim v As Variant, c As Range, s As Range, myStr As String Dim rng As Range Set rng = Intersect(Target, Range("D5:I500")) If rng Is Nothing Then Exit Sub If Range("J3").Value = "" Then MsgBox "セット配色が未設定です。", vbCritical, "セットエラー " Exit Sub End If myStr = Range("J3").Value & "セット配色" Application.ScreenUpdating = False For Each c In rng.Cells For Each s In Worksheets(myStr).Range("B3:H7") v = c.Value If Not IsNumeric(v) Or v < 1 Or v > 31 Then Exit For c.Interior.ColorIndex = xlColorIndexNone c.Font.ColorIndex = xlColorIndexAutomatic If s.Value = v Then c.Interior.ColorIndex = s.Interior.ColorIndex c.Font.ColorIndex = s.Font.ColorIndex Exit For End If Next s Next c Application.ScreenUpdating = True Set rng = Nothing End Sub 今回の質問内容は、このマクロを少し仕様変更して、 C4:C500範囲でデータ書換えがあった場合にその瞬間、現行のJ3セルにその入力した英字と同じ値を表示させ次の処理に移行する方法にて上手くいかないかなと思っております。 上記のマクロを使用して追加組み込みをする前提で考えると、どういうコードを追加すれば実現出来ますでしょうか? どうかご伝授頂けますと幸いです。 よろしくお願い申しあげます。

  • エクセルのマクロについて

    エクセルのマクロについて エクセル2007を使用しています。もしよかったら教えてください。 現在Sheet1のA1:F500の範囲内で1~31範囲の数字がランダムに入力されています。 この数字群の入ったセルをルール化しているセル背景色塗りを自動で処理したいためマクロを作成しております。 その仕様として、もうひとつシート(Sheet2)を作成して(※シート名は”配色表”にしています)、B3:H7範囲に1~31までの数字が入っており、それぞれ数字に背景配色しています。このシート(Sheet2)内の数字とSheet1内と数字が一致したら配色表のセルそのものの書式も運んでくれるルール設計になっています。 (※Sheet1の上記記載している範囲に直接入力及びコピーをして数字がSheet2内と一致したら、色が変わる仕組みになっています。) そのマクロ(※Sheet1内に作成しています)が下記なのですが、拝見頂いて仕様がすぐお分かりになると思います。 Private Sub Worksheet_Change(ByVal Target As Range) Dim v As Variant, c As Range, s As Range Dim rng As Range Set rng = Intersect(Target, Range("A1:F500")) If rng Is Nothing Then Exit Sub Application.ScreenUpdating = False For Each c In rng.Cells For Each s In Worksheets("配色表").Range("B3:H7") v = c.Value If Not IsNumeric(v) Or v < 1 Or v > 31 Then Exit For '色を一旦戻す c.Interior.ColorIndex = xlColorIndexNone c.Font.ColorIndex = xlColorIndexAutomatic If s.Value = v Then c.Interior.ColorIndex = s.Interior.ColorIndex c.Font.ColorIndex = s.Font.ColorIndex Exit For End If Next s Next c Application.ScreenUpdating = True Set rng = Nothing End Sub ここで今回の質問の本題なのですが、このマクロを少し仕様変更して、現在のSheet2の配色表を、A配色表・B配色表・C配色表...というようにJ配色表まで合計10シートまで増やして(※A~Jは全部別々の色に設定する)、更にSheet1に一つH1の場所のセルにA~J迄の英字を入力するためのセルを設けて、例えばそのセルにCを入力すればC配色表を見に行くという条件付きのマクロにしたいと思っております。 これが簡単そうでなかなかうまく行かず困っています。 上記のマクロを使ってどういう風に変更したらベストであるかご伝授頂ければ幸いです。 どうぞよろしくお願い申し上げます。

  • 指定セルへ転記するマクロで値が無い場合固定値転記

    シート2の1行目の指定したセルの値をシート1の指定セルに 転記を行いシート1が印刷。 印刷後はシート2の2行目の指定したセルの値をシート1の指定したセルに 転記してシート1が印刷。 シート2にデータが無くなったら停止という以下のマクロにて シート2のO列はシート1のセルA19に順次転記なのですが O列は運用上空白が有る場合が判明した為 値がある場合はその値を転記、値が無い場合は半角で ZZZ と 転記をしたいのですがどこを変更していいのか分かりません。 よろしくお願いします。 Sub データ転記() Dim myRng(1 To 23) Dim cpRng Dim i As Integer Dim n As String, myStr As String With Sheets("Sheet2") Set myRng(1) = .Range("B2") Set myRng(2) = .Range("C2") Set myRng(3) = .Range("D2") Set myRng(4) = .Range("D2") Set myRng(5) = .Range("D2") Set myRng(6) = .Range("E2") Set myRng(7) = .Range("E2") Set myRng(8) = .Range("F2") Set myRng(9) = .Range("F2") Set myRng(10) = .Range("H2") Set myRng(11) = .Range("J2") Set myRng(12) = .Range("K2") Set myRng(13) = .Range("K2") Set myRng(14) = .Range("L2") Set myRng(15) = .Range("M2") Set myRng(16) = .Range("N2") Set myRng(17) = .Range("O2") Set myRng(18) = .Range("P2") Set myRng(19) = .Range("Q2") Set myRng(20) = .Range("R2") Set myRng(21) = .Range("S2") Set myRng(22) = .Range("U2") Set myRng(23) = .Range("G2") End With cpRng = Split("B10,O4,G3,F10,F13,G10,G13,H10,H13,O3,L10,M10,M13,O5,E19,F19,A19,O6,D21,B6,I19,J19,G5", ",") '転記先配列化 With Sheets("Sheet1") .Range("B10,G3,F10,F13,G10,G13,L10,E19,F19,J19,O7,O8,C19,D10,D13,A19,O4,O5").NumberFormatLocal = "@" Do While myRng(1) <> "" For i = 1 To 23 .Range(cpRng(i - 1)).Value = myRng(i).Value Next .Range("C3,C13").Value = Left(.Range("O3").Value, 10) .Range("C10").Value = Mid(.Range("O3"), 11, 6) .Range("O7").Value = Format(Range("O6").Value, "0000000") .Range("O8").Value = Format(Range("J19").Value, "0000000") Call 加工01 Call 加工02 '印刷 .PrintOut For i = 1 To 23 Set myRng(i) = myRng(i).Offset(1) Next i Loop .Range("B10,O4,G3,F10,F13,G10,G13,H10,H13,O3,L10,M10,M13,O5,E19,F19,A19,O6,D21,B6,I19,J19,C3,C10,C13,C19,D10,D13,O8,O7,G5").ClearContents End With For i = 1 To 23 Set myRng(i) = Nothing Next MsgBox "印刷終了" Sheets("Sheet2").Select Cells.Select Selection.Delete Shift:=xlUp Sheets("Sheet1").Select Range("C3").Select End Sub

  • Excelのマクロを教えてください。

    マクロの超初心者ですが、よろしくお願いします。 サンプルからですが、 Sub 検索() myWord = Range("C2").Value Set myData = Range("A5:D155") Set myRng = myData.Find(myWord) If Not myRng Is Nothing Then Application.Goto Cells(myRng.Row, 1), True End If End Sub Sub コピー()   'Set myData = Range("A5:D155") Set motorng = Application.Intersect(myData, ActiveCell.EntireRow) Set sakiRng = Sheets("抽出").Range("B65535").End(xlUp).Offset(1) motorng.Copy sakiRng End Sub 以上のうち、「コピー」の部分をについて質問ですが、「検索」を使わないで、元Sheetのクリックしたセルのレコード全体を取得してSheets("抽出")にコピーする方法はないでしょうか。 上記のマクロでは一旦「検索」を行った後では「検索」を実行しなくてもクリックしたセルのレコード全体をSheets("抽出")にコピー出来ましたので、検索の部分を削除したいのですが。 説明が下手でスミマセンが何卒よろしくお願いします。

  • マクロについて

    マクロでデータをクリアするコマンドボタンを作りました。でも、計算の答えがでなくなりました。 例えば、 A1:A10までの情報はクリアになります。 答えの“=SUM(A1:A10)”というCセルだけが前の情報のままになります。(Cセルはマクロに登録していません。) 全くのど素人で、マクロの登録も他の書類からコピーしてセルだけ変えました。 マクロの内容は、下記の通りです。 Sub Macro1() ' ' Macro1 Macro ' マクロ記録日 ' Sub allclear() Application.Calculation = xlManual Range("D4").Value = "" Range("B6").Value = "" Range("B8").Value = "" Range("E11").Value = "" Range("E12").Value = "" Range("F11").Value = "" Range("B21").Value = "" Range("B23").Value = "" Range("B25").Value = "" Range("B27").Value = "" Range("B29").Value = "" Range("P5:P9").Value = "" Range("Q5:Q9").Value = "" Range("P15:P19").Value = "" Range("Q15:Q19").Value = "" End Sub よろしくおねがいします。(_ _)

  • マクロをすっきりさせたい・・・

    いつもお世話になっております。 下記、マクロを組んだのですが、 簡潔にまとめるには、どうしたら良いでしょうか・・・ 宜しくお願い致します。 Set 範囲 = Workbooks("A.xls").Worksheets("マスター").Range("A2:G4000") ThisWorkbook.Activate 列番号 = 7 検索値 = (Worksheets("B").Range("B24")) Range("D14").Value = WorksheetFunction.VLookup(検索値, 範囲, 列番号, False) Set 範囲 = Workbooks("A.xls").Worksheets("マスター").Range("A2:G4000") ThisWorkbook.Activate 列番号 = 7 検索値 = (Worksheets("B").Range("B25")) Range("D15").Value = WorksheetFunction.VLookup(検索値, 範囲, 列番号, False) Set 範囲 = Workbooks("A.xls").Worksheets("マスター").Range("A2:G4000") ThisWorkbook.Activate 列番号 = 7 検索値 = (Worksheets("B").Range("B26")) Range("D16").Value = WorksheetFunction.VLookup(検索値, 範囲, 列番号, False)

  • マクロが動きません

    以下のようなプログラムでC3の値が変わるたびにA10の値に1を加えていきG3,H3が両方0になったらA10の値も0にする。C5の値が変わるたびにA15の値に1を加えJ3,K3が共に0になったらC5も0にするようにしました。 しかし、動作しません。 このシートの3行目は=シート名!セル番号 という形でほかのシートのセルの値が表示されるようになっています。G3、H3、J3、K3に手動で数値を入力した場合 は動作します。 ほかのシートのセルの値を表示させたセルの値が変化しても動作させる方法はないでしょうか> Private Sub worksheet_change(ByVal target As Range) With target If .Count > 1 Then Exit Sub If IsNumeric(.Value) = False Then Exit Sub If IsEmpty(.Value) = True Then Exit Sub If Not .Row = 3 Then Exit Sub Select Case .Column Case 3 Range("A10").Value = Range("A10").Value + 1 Case 5 Range("A15").Value = Range("A15").Value + 1 End Select End With If Range("g3").Value = 0 And Rang("h3").Value = 0 Then Range("A10").Value = 0 If Range("j3").Value = 0 And Rang("k3").Value = 0 Then Range("A15").Value = 0 End Sub

  • エクセルで複数のシートに罫線を引くマクロを教えてください。

    エクセルで複数のシートに罫線を引くマクロを教えてください。 エクセルの表を担当者名でシート分割後、空白セル以外に罫線を引きたいのですが 複数シートに罫線を引くマクロを教えてください。 いくつか参考にさせていただき現状以下の様になっています。 元データというシートにAからGまで項目があります PJNo. PJ名 棟No. 棟名 取引先名  書類  担当者 1111 PJ1 10 棟1 取引先1  1 東京 1112 PJ2 11 棟2 取引先2  2 大阪 1113 PJ3 12 棟3 取引先3  3 名古屋 Sub 担当別シート作成() Application.ScreenUpdating = False For i# = 2 To Worksheets("元データ").Cells(2, 2).End(xlDown).Row j# = 1 '検索中の人のシートが既にできているかを判断する。 For Each sheet_name In Worksheets If sheet_name.Name = Worksheets("元データ").Cells(i, 7).Value Then j = 7 Exit For End If Next '検索中の人のシートがない場合、新規に作成する。 If j = 1 Then Worksheets.Add After:=Worksheets(Worksheets.Count) Worksheets(Worksheets.Count).Name = Worksheets("元データ").Cells(i, 7).Value For j = 1 To 7 Worksheets(Worksheets.Count).Cells(1, j).Value = Worksheets("元データ").Cells(1, j).Value Next j End If 'データのコピー For j = 7 To 1 Step -1 Worksheets(Worksheets("元データ").Cells(i, 7).Value). _ Cells(Worksheets(Worksheets("元データ").Cells(i, 7).Value). _ Cells(65535, 1).End(xlUp).Row + 1, j).Value = Worksheets("元データ").Cells(i, j).Value Next j Next i 'それぞれのシートの列幅を最適化します。 For Each sheet_name In Worksheets sheet_name.Columns("A:G").AutoFit Next '---- Dim c As Range Range("A1").Select Set c = Selection.SpecialCells(xlCellTypeLastCell) Range(Cells(1, "A"), c).Select (省略)以下罫線を引くマクロ End Sub

  • マクロで困ってます!

    マクロでセル検索かけたらそのセルに設定していたハイパーリンクが外れてしまいます。 どうすればいいでしょうか・・?お力を貸してください! バージョンは2007です! コードは下記になります! 同一ブック内の「データ」というシートにあるものを「検索更新」というシートで検索をかけるというものです。 宜しくお願いします!! Sub 検索2() myLAST = Range("B" & ActiveSheet.Rows.Count).End(xlUp).Row + 1 If myLAST < 5 Then myLAST = 5 Range("A5:F" & myLAST).ClearContents Set myC = Sheets(1).Columns(3) _ .Find(What:=Range("E2").Value, _ LookIn:=xlValues, LookAt:=xlPart) ' If myC Is Nothing Then Exit Sub myCa = myC.Address Do myLAST = Range("B" & ActiveSheet.Rows.Count).End(xlUp).Row + 1 Range("A" & myLAST) = myC.Row Range("B" & myLAST) = myC.Offset(0, -1) Range("C" & myLAST) = myC.Offset(0, 0) Range("D" & myLAST) = myC.Offset(0, 1) Range("E" & myLAST) = myC.Offset(0, 2) Range("F" & myLAST) = myC.Offset(0, 3) Set myC = Sheets(1).Columns(3).FindNext(myC) If myC Is Nothing _ Or myCa = myC.Address Then Exit Do Loop Set myC = Nothing End Sub Sub 更新() myLAST = Range("A" & ActiveSheet.Rows.Count).End(xlUp).Row If myLAST < 5 Then myLAST = 5 For Each myC In Range("A5:A" & myLAST) If myC.Value = "" Then Exit Sub With Sheets(1) .Range("B" & myC.Value) = myC.Offset(0, 1) .Range("C" & myC.Value) = myC.Offset(0, 2) .Range("D" & myC.Value) = myC.Offset(0, 3) .Range("E" & myC.Value) = myC.Offset(0, 4) .Range("F" & myC.Value) = myC.Offset(0, 5) End With Range("A" & myC.Row & ":F" & myC.Row).ClearContents Next MsgBox "更新しました" End Sub

  • Excel マクロで使用済みのボタンを消したい。

    マクロで使用済みのボタンを削除したいと考えています。 毎回ボタンの数が同じ場合は作れたのですが、 ボタンの数が場合によって異なります。 具体的にはD5セルより下にあるボタンを削除したいと考えています。 ボタンを作る時のマクロは Set ws1 = Workbooks("ブックA").Worksheets("Sheet1") Set ws2 = Workbooks("ブックB").Worksheets("Sheet1") i = 2 j = 5 Do Until ws1.Range("B" & i) = "" ws2.Range("D" & j).Value = ws1.Range("B" & i).Value With ActiveSheet.Buttons.Add(Cells(j, 4).Left + 1, Cells(j, 4).Top + 1, _ Cells(j, 4).Width - 1, Cells(j, 4).Height - 1) .Name = "いの" & i - 1 .OnAction = "Select" .Characters.Text = Range("D" & j) End With i = i + 1 j = j + 1 Loop といった感じで、ブックAのB列のデータ数だけ、 ブックBのD5から下に値をコピーし、 その上にセルサイズに合わせてボタンを作り、 Nameを上から順に「いの1」「いの2」・・・、表示はボタンの裏に隠れている値をつけ、 ボタンにマクロ「あいうえお」を登録します。 次にボタンをクリックしたときに、 上の工程で作られたボタンを削除したいと考えています。 a = 1 Do Until ActiveSheet.Shapes("Order" & a) = "" ActiveSheet.Shapes("Order" & a).Delete a = a + 1 Loop b = 5 Do Until Range("D" & b) = "" Range("D" & b).ClearContents b = b + 1 Loop Call あいうえお End Sub ボタン裏のセルは削除できたのですが、 肝心のボタンの削除は出来ませんでした。 どなたかご教授していただければ大変助かります。 宜しくお願いします。

専門家に質問してみよう